diff --git a/src/Makefile.am b/src/Makefile.am index 2cc4c9da1..26b5fde05 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -114,7 +114,9 @@ SWIG_JAVA_TEST_DEPS = \ $(sjs)/$(cbt)/test_mnemonic.class if BUILD_ELEMENTS -SWIG_JAVA_TEST_DEPS += $(sjs)/$(cbt)/test_assets.class \ +SWIG_JAVA_TEST_DEPS += \ + $(sjs)/$(cbt)/test_assets.class \ + $(sjs)/$(cbt)/test_elements_tx.class \ $(sjs)/$(cbt)/test_pegs.class endif @@ -365,6 +367,7 @@ check-swig-java: $(SWIG_JAVA_TEST_DEPS) $(AM_V_at)! grep 'native Object wally_' $(sjs)/$(cblw)/Wally.java # Unwrapped Java calls if BUILD_ELEMENTS $(AM_V_at)$(JAVA_TEST)test_assets + $(AM_V_at)$(JAVA_TEST)test_elements_tx $(AM_V_at)$(JAVA_TEST)test_pegs endif $(AM_V_at)$(JAVA_TEST)test_bip32 diff --git a/src/swig_java/src/com/blockstream/test/test_elements_tx.java b/src/swig_java/src/com/blockstream/test/test_elements_tx.java new file mode 100644 index 000000000..6f43c2f04 --- /dev/null +++ b/src/swig_java/src/com/blockstream/test/test_elements_tx.java @@ -0,0 +1,79 @@ +package com.blockstream.test; + +import com.blockstream.libwally.Wally; + +public class test_elements_tx { + + public test_elements_tx() { } + + public static void assert_eq(final Object expected, final Object actual, final String message) { + if(!expected.equals(actual)) { + System.out.println(expected); + System.out.println(actual); + throw new RuntimeException(message); + } + } + + private String h(final byte[] bytes) { return Wally.hex_from_bytes(bytes); } + private byte[] h(final String hex) { return Wally.hex_to_bytes(hex); } + + public void test_elements_taproot_sighash() { + byte[] bytes_out = new byte[32]; + final String tx_hex = "020000000102d7e48759db4d6f3d3f38440162c487fcc95205b6500d8772a5b8c32e870de2280000000000fdffffff882358478a81a3259677612047587d24da92494ccfd4487dd3e27715bbb18bf60000000000fdffffff050abe40ef1f47c667beb32dd0488751358860d1433697e4787e142f066be1095f2d085d699b82683473a96932a016a46ebcce0c9eb442c9b5d42daf37e46d49ec90d603c868ed1a2a7dcf8405961581f13d091269a1710160392bf89d616ff06ae78cc117a914501d2552872ba1c5389433354a3e61d583eaf5ad870ac844723343c588eb47feef3c1bc1254b996613542085a3b679f9629cb7e06759083e1153bf03577a00445538d8b5ab25b295254efd5131a66d4a727d8da3ce37fd0347e524f0e7e781508d56be3df67dba0c7ec2494d9e8e4ac9c8d09c1c485a02d1225120ac73968281b866aacacc3f339549c3c8301d203e2d40cc33df78c17fd80389970a00adaa4b0390856e6570baed216bf61ca6bfe752ec81843655aa29f61c3559e50895ad406892a57f44dca170cb236a62bb874761250912430c0b8a3870373951760349f40321421e15d81278a86415548031b732409e8e938a85ed16dda97e0710f317a9146deab1ecba96723fabe6191924250a71b52321be870ad88338c4d86b698b3f8a90f2da77bf7ae70203bda44edf2d9bccbdb52d727efb09103056d5e5810a391118aa6db30e80a8812b95cf1436e46c069624676599cd7703b9b33c4e7e6ff5fc0ededc37a5a1f9db9b132745fdce0c1ce53871bd6e85e878225120c486c03619768c5a72a960a2246a7b750fbbbd27d35ed4d6d74a31ea856ea77d0125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a01000000000000122000000000000000000000000000006302000317307c438dde0f189eae26a2bf1bf48150d837313897607ef9cf7845a08ad2db0e31aa62d20b368c836dd8c76754691b852224dab5d4c9a9d68d967827d17300ee3fbbbe3887e295b821cd137d207b2069c2731c180ab5850ba49e3fd4969250fd4e10603300000000000000018b473501c52011ae3d0e20ea30e58000568d75d929e0322e7b48f8b5b1a51e4e1b816c73ad3e5b828a3e241d648603faab3f2bfe584ce269e01fa6a44662031dfd65d71c290c31c8b3768ed278a9f2dc39ac7b947f39fc07b128448873f00e34f465ac7c55632dcb2a8b3d45d903f1c6280b6e145dc40fb3130abc868184433dd35995a3293b3a7b8b83611b499e81587724f0c70e5a009a052f081793f661e4a2361c50491deeb03e19519ddf23c82454b4d422a7a9c5d79fd5e825f2554663668cb3d2b1fc1e72b48a057e7a4a4484b197318c2f13ab007c2648778ceb28f60ef1a756646a35e5c1efd5752641393570a5e03d9caca1569ffe38a3ae403ad8420b49104bac49d9e55482d0cf694483b20aa1a68904dc1f1550280583633e00387ec8df96aa163183255d099461a822234138688aeda7d95b4862877ae78b437fb81073909fb4457d281d0dcc467a23fbb3d31fdbcfb41777f903247366053cc247eeafd4e25b7764e2dca8e0266035c117b0c46dc7186a9b75e94b5c9c2baa4f66bdedd9866201ca82dfe6827568b057218768514c0d9782e687e98632f4c1d423aa16ca5bacbb2e211770ebc1d90cc7d15fff85fa667c3f8cac3daeb2dbcc6430a7cfa4ddd22e3f11a13ed97d77352d73a710b2948a7b359f8d7e6bc0586d784be01c12ffcfcab3cd6108e4c9c89d10e54e310621d6a2c9c6c21a5c71aca534945d5a50d3eaf6cc7d20596b1dfcef2021384d3ef46ed4c767bd3b491a80d9e8fedd66a78a3d37d18a7aa38ef8c68d124453f382020acc487f2ed1e3ea22de95b89b2882460f069c94449fd946938969a59eeaefc0a12b1701a22bee25be6d0a9ff8a380c1ac832a95bbf46235d516aa51ca98c8cc1942b5337ddee2fd3442aea1a0ebe433e029eac0098f701341e6052b1e46271656dc37e392b1bdcb1cb6f51c9e0e1eff425dd5ce487b0f07bf9b70b44139877c5f212ba55308c606b7e432b5ed1eda148d1548f0c6472eb93898d21ea70fa324bbe2ace95a11f5bc595223f1969e267afa6ca85a49312c4ed62bde5dc7d084598c9e3c599a4f2f8de95c2d594690a9b0a431fac27da409374a5b53d38accb05280e8f2b1df51870137132c12b1e805b7531d83b6aeff523cfb871e7abdbf54e0edf1e5ff2183bd3e9645322add1c82563f22a27307e5763bbd8ff2a26da86b6d3e62633240af7762797da73ae96398a758dca993b526da6de2842093f5f1c17c79e20e16b66de0a339a435f1cefed76d0ac98b870565c59940af0bec7e4df19807648a01cbce181404f34218c79401de4113df9f3e205418bbc845d138efea581f823d1c32af90713f035a4a5fe82e1b0f6645b4245f9c96dc12158cc0b9dcf58ca18d3c840804c949d26276bc65a241e311ecab2cdfcac3769324ad185c4f8e1390a46768d4c2c30372e006e6d536620e848f183a84b1bb9452e264b63c2af050c9dcca9bc3fb8589cd9703ff86f8ad014eb25da947085b802c2011ffb45855dbc69645f135614fcf78754db9a0b26be4fb5d8a6bde73b5e6c5ddcaf6b3070b1df1f6706d3812e12b0e1a5043ec3551c414c4dcadac7756a453e4f62d252893217b5b141402b18e966c169c126af8e296e408643084db6dc2876cbdd35b62c7ca446740223c4ef0ce9a20cdd523a135b29e2728e8b8f15e2d1ad16df332e60c5e38892ea28eaeebfb2fd9c9563cf1b4b65ca0feeeed3acf6ebb85dbc1f7bce884dd761e1680dbe55254388bae03f66cee8bc6ec8d7d7305f8861e4797aa9e8e098b559fc1112be542a282a38d448ce4dc3e1715a794f204a207dd47b311654d5599ace348b0d4b85806d0c0366e2dcc3abca5e1394230517d24025287be4c2bff6f1083ab46c21d145f947401b0fdbdb578d048ca9cf247517f3668ac71af5097c39e5b08edfd7933437c2f3ea039ad75d64b5adc7ec3d8ff233219b37bcd0b3bc3a1ba829d069db5e3fb60145a9e548817cb4b404d5a91a2fd9043555dd14baf31f9cce2504ba96430fc90090ca5e36db7c4af3be71ca44f7952f1353e5044da224d9627d4275e56c1ad4b93aad1a4a27df4f680b8044751c1e149543063ec912d3c1831364077c38f38bc999c017aab2a842c93416b7683e16cc4ae3d58b69bf6f4a07fab9dc2d63a44b65d890bbeda585826a77bcdd3133153fe0e83ec660323603a98eb97e19f07d4b40aaab5f58b30dfc29aeae63ee9eeafce594fbb0c3adeafe3e176c3eb042695a9f612350c1782cd9378dc3c1d85d63acf4fc58069fde087f4e50d9eca866a620d00ea3c024da328ff7eeb580c25969eab04a611f450fee3a99fb32b58ed63f28fc737e0569a67acac6ee5010f30f23c0e8a88893f629ccc60d576b92faa818f17b2eef7d2d6fa9b2503a710b784303b513a96756815f30e8d45b1795b8d1f5a686ccf9b3ac4708bd60fafa703669214914e5b65c6121e6f20f51cdfe34f05e4988a5b2340166615c32398e9ebf6909dafb12eb0bbd9c856f0fe84b3014f9b43aa9b4e9f6655ece31ac6f4444aef628ce43d4c2e27ba3888f11b51f3a515ba0fc8b45a2202c29bfe63c270c6efc73beba1cbf9fab52d85831893072093222f15f55ebf1620285481a89c1cf33264904d38ae2b8ce50b749d6719b22970ce8d96f61f119888772f5a4e1ed56c4735bedfc6bf7f4cd8dccbe3e7a39e2050551b1583083b2c5547c98ada570b9a95d14fed0c4f3b0d45b6f9f29d940d6623837b568c22035a2cbfde4d4b4898fefc4f390d5ed53b7857c150d4ecdbd41303f5949f2b396f76d02842b476755f2e595721630d7faf3e5f869a5903b5e70750cd1a199df822668a2567b1caccecdffe6c485855424c7271fbf3402d758d49f663d999556b43494393e675f4b4eb372ffb6d0225680cf6859b7741201d4a7e0c03a5ee10d073d78ddb72d3cad8ba064d5a7ff85a7d9dc76d5ce373cb7fcbe56b70fb130792e400e4ac5129f1dc02cb4b65a30354d57280c8bacf7d6859e9fea59d57cba2c0692f12aa596e09b00bf1c240a838c19a7815f4526aef8a96ce1ec745928d094cfd9049da6022833d71b72f0618813e71ecbfab66f50d254fde6e31557af61b2d677abc421ba41a6cafacf021a1a970a3f6411014c7087b4ce29fda27b25ae9ba30fb18cc26e6744eac902213c99821729821df94377288f464321e82a2fa7530b549afd687eb45a40a2d85f5fb475cd1daf501ca6511abb82d5854e91dd8b6176973537eee0f48ea6217f60b615498c0f2362992603199d23a988417e393d6de5ca281fc1aa75fe6744808f16eb39b95d6aebf26c2798dddc4dbd5762584207d633513c8e6f8c22cf63f1df26caf77f2dd88078b3d3dd7b88a65a45ebada6c4eef0f277cd609547d9910fd3a40188673740e85cf43c58abe64f66eb81f64fc2a2d58f9cff6d3cd0f9ac2a56942ade0d6ff847ae1ebb1c053d27a456a56badaaca62f38316e455ffabf02676da4b8bbd3b602216671a149a83238f385c65b085955c00160cd02c4a0262a39ea79909b2254ce36b4bd0d424fc801972c53fd862d644d16c96927622a67c5a8db7ed6e4befffb5e5af9557f2d0f3076047f14b06d7aa23406f2f9fa341a382082b65765ac10f5473d6c82f82c13cf230093bbc131daa3dc4580fd907c91eb518440fba44783c9c2d54c2835faba54aeafbcf7a57cc453c16844493154f85c19863b4e40557bc9957290191f74856b3dd663e5fc292acef35b72bde20cc6188499322e5d52d78d482cdbd8dde025fc8c93f6c3e7ee664394c74e6a80045c6e12423f0ee4dedbf0da58504343265bc56cc149abbdd5889d466e0bae9e510756f7d18b43427e12279fffcf433a6978e04c230d577955e4c24a6ef83669a685b61b96e8379bcdedce62333dce27a228af93148b673a792d8a2aab8e4de8ae50dabf6e3246aa5219577114c4d4544b9e44626be0d88730796bde1c1050440857e5b3a0f17a03f2476cc2590e20d055be994c3f34c0035ee5c4ab1bc630a52d3dc5bc240d5bd10a5a77f4541b5a0c4762b6657f52d7b33e9e682ac14af6d8e477eacb73451489b8931eff7bb8d3bcd056ea424455be97eb6b6c2ae8e75c8834730589f4a7e85b48bfb1dfdb8fef0555c076171f400bab26c51ccb839592ea65c7875f8f2a1dca7fe50f295f2e6f0b214cd0cec44024275d1a3eb211e5a5648e8d66f792ca94a77edf43ff939858ca2ca67987f4d3a3db71bbbbae1818716ab033dd8864cc6afdd3f6d5153acd3a1957bf841246dc5cfb304c6d93c6f1ff8e7a60516f35ee83649a63a88c076a301dd9c674627af8bbd89035ca8eeaf55dce2b427aa10c662cbae3140dfd4437ddbd3eff6798980ad32fb6ffc195d3117d765505f20d8987854d135679470d45c8cfecdc20e493509488d2dfd442e6277626e3acee945719d60c2689a59ff1c6349b57cd4a7fe66ab67eab11a3664ec67855b68046bed43df2ff494118a0a35bb7cefe2617b376bbc802500962bc3ba84e163b060866ec1a10fc78179d463a6eaa03b62eb1f4f7981775c35a5d419ca995cacaa85665ec2ec673ce9ef9e763b73217d45177baa7c519dd6fa9be812bac335832aa2c7ca732d5666416abf8c9d670ea2f24cc6f8c8820d8bfac9bb89e469bd7c25f1ea5fce4bdfa1bd294de54d61a0295313e54c1bf7dfac89e7d14b7b547dc9df5019883edc0a8d51d2675016c8614386ef3b30e8f0e6f8c465513e3cc0a4716a2174a8002b8b82e67f6a8bd9938a77cba18d3a42f2751e8e9d71d874c5b05fcbc33222710e418257d7c94a6a693d042c50bb2e47d78424cf95e9f2488dfd7d04ea0cec7785b27dec3fb64ca72549368116cf162fb6cb5af176757ef84dbc625ec53b211b41aa7446461d3fb78e49c08ea86eac1e396ad0e9764fb4ec44e613d6c9b92aaa8c317b4b17eb6f7915d501b92b2ef7d919b459d24d903f861aed3c1d69d49e6319c38de0b365dbea48a4ec2966da5d23b5207dfeba866661baa9f221a426346100d393eab9816bfb2850f1c51dc9c70bd43382115b23ecbb0399a6aec4907fdc5a908eced5c74d1ba490d37e65af40247f769680a7449f71a7b67a033b2048a02f87a2dda0bb66e11dd8d548aaf6e97abe971134d5bd4099da1d081500421b10e57499814b9f28433c5626d3f98a8578be88f0197c9e22db9262acd651ff75a54c2373b763dfea6780f1ecdcba1bc3c51a1ad9b85f500bebad48fdd38b41a54745adf0a5cb013e9e4a6da555000963ac79311485e221d79ad399bfb093d9d5de34030ebea9cba83da0b17afc28f3f1ae1ce3abc02282985f0df462701362574083c357d1611d1564b639253421af452341680111bfa747d64d7f57ebc4c682edabcf5b5f594405ba7210b925ace286fd91805dfe5b4d03c531d7df277810099737a9a24d4337908b5ec5188f571772a9bdd19e95c3a293cd26bf06aa400f2a79956c6b6f618e8f36b9765421a7c21fe5354cac9c6338a2be6d648b7adefe8c9f9217ff85100d67c6e11df953e2f78dc2547cd4b71f19f0d7e37a2425286c701ec7874e8612d8187a04f66fddf2738c077c22093624e19a15f364962348c1df9d57f7f013de1e018776649eba2075324b2f45f6a15088c17137bf7d62f663f0918f3da9d5ce42d5a05dac8573d056180bf5d25cfca186348c7c9d4bffb6b51f9b25ba978c38aa4da2ffb6165519b5470fda5d6ff972464c41532a368ec602abc6d691304d693eda048404c2c7bf7fb52a9cd5b1272dff486f23e94eff24eb58adf73780eb7d58e2c31d50ccfc2ef95b42612b83a066e868034706726ec65bac8b130bec693b812937082d68673451cdcc406d0f2b263020003fbd947fa1b1c1605c1d190f3d3e02d23683988f2d456975df01033883113898b17a9211633c2d4a92c1843af2a9f1b7edce71c3e3fd3e1003e7cd75f8678b1459259856941c65ef21d0249b3eace33006d73f19967dd5c2186ce0528160a3df3fd4e106033000000000000000186d73201c5236992ef55ce958c3edafdfbedb2a17ba129571ac56a7ac3505e7a561c92248c554283e01441f0bf6ee173c99eb6bbc7c4e6a10984d59041ea5301b9a3e7b5d1a6783427d6a9d3dfc0b0f125296e020fa98e08f0c05c5368b6e17c4b9e6d027aaf4ebd55506d15f040cf8ec4a47057b09c07b5ea7ad75a7e79f155cd035dca9f693961d1fa7a4bf8969e6c2a395ca3037d9bd5b33002d945c0cf1d9c62b0a664ff1ed28a7c1a25845a01493585c2452f2afaaba8cf239f7a1b87acc76f562e16de34f12ce9a2c6388fdad75e248b54bc6d80aa359eb8afbf64536d8d5f8eec633f8dd1cb6916f21922bc86df05834424f4ab4cd8779bbd53a9a8439b4de61d396cfa3d27d9741231ac7bd95a7a57f78f597dfbf534376502abd5cfcd08ee303f6816044df810706265f1f446335032f9d9286becc502ccd18ddabe4225d9a6d5c387f50a981ea706e14895897ca181346f14a7cc1c590450c1a459dcc2834eefe952441a518dd0792fbd4b5ce0ba17241bcabd1262f904e794f37325324ef9acb38e4956e5d25c1fd96f5fdf5f3dd071f6d44c696b6691284ebc68506f8c3263efd50b44fa50752c11f6d72b40fc5a988e81855c7be4571d54974f448c1f4aa497b185ec371fb0c2d210b7ff875a4a951fe780ebefde9b9d25ec1ad04e0a5c39acec4c4d8ea393d9793f5ef03f9f35ebe413229863875b7cc99e63bba8df0f200cbb914dc0287e563bcbab5317a19396274ad35f6749570e10a14a813d63aef04feafdee4551275d1f47e9440dedd9a48473e4b2f125309bcdedaee5f76365c7b936ff61de4b7ed402787b308c40d02a37ab6c1a481868c6b05d1e7d5297a37789a15d4c9824c895c635b3912cf459179fae84904e1f276f248806ca5b75b51ec27f58d5c370dbd6732c4434c97f0f05b31afb90704ddcf207a80d3e9d67d758f886b025ba7cbfb547503c122a3c311c3ae3376db1aabbe5e6c737cbe9645c3a463cbb20924e119177690234249ff2a862dbcfa1e7bd2a503901c6cd68924d233a435665b020c51c6733913e6fba3ca515e241ef9ab7987ed9d3122e730b8e7925d8648b2d9a3fd5df35d3e202ea1bf934bfc86120e37a20dac3cb1cd31b578c6d880057d93242fb7eff06ee8609ba7ae708c5f6d14cb8d27d6ab2e515d44eb5ca4eb04c7723145f9c20cb83694911c990daa423691b7b0fd2ba40bc2078725515e4a9ade5d6e706ed27f0700a848673655a41621c1dc0ef51ffc4a3ea309e63089a18c2812a1dbb43fde4a28847f4c21614eb654c87a1ae9ecc77a84b6126bc7a7f51314d01e7c979a1d30045f2a49b763ac7e93e80ba891c38e78c74ef8ceaf5ec1dc5378054a5636e10e9b326f5d88b44c58d1f7a482d35961f7995d89f23339f839a19017b88e6185886c8a9572cc2d21803d9082b0286b2f97ed88a2b3708a43cf2475122e9c95111a00c56ace7f607fd2cd294eb72a61ff5435177f57b39521c00ab332470553c2b2994caf891011cdf002ddd8a5188d0a5235b3bd9418d3ed5a3511d7e89110bac4c812f3ad50ea4e8c8c06ae7a19d5e6f51eaefe2cfe389f480e615f0ad12b8abbd999cefe81839f0876ee19924223d00f97492ab4a10eb7363eeeb9d261ddda0a507fa2ae5a6cc1a8deac23143290771ac9433ddb32e4563284f99ad6236d60b0db104a44c68b078f5deaa1c030914f5fe5f17431de34c0938517cd6f2128e3ecada06d1ca0f3c853f0157ea3c276042d4c668240a6cfd5235531c8e66c881583c7531612e5d672edc65b675e2aa550c511a4903cf43e454ce7efd93c6fe7fd7b153cf608823ee8783f83cbb3f1cfc23400dab55835ad3f18e1c9b5d6f78b3938ac0bc9fefe2273e7a82320d4e8c22c76979b366cc7257260539af1806d18de9422d0f12c3d4c6de6a5a20540d3eabbbce86b61e303475f681fb0f7b1f298bd922010b60645f08205869d473825a6e015ea2966f1542be053c53b84c13a95b7f006211822da08b661981d8acda443797d7630383758de098d746797666f1c81b19e517bad2ea6b938b00ea47a9d841b16d2887bf060d49d8a463afdd2ea61a24281c1fbc31efbcd05c764570967f81d4943d246356117229c611e9ad522539b28c930288cabe7ddc1cdf3bec0500b4e022982e5be0627879f8547a189b20e90092f10263cce9a11963cedc36fb2ea92836daacb71e39befa205f7a253e800784089dd6474fc36a2f8b12d230220c6d0dfacb13061651536cf725a057f5c7ca8cacaaa258deb2114a4c79a097ed34fbd47fbad54bc5330c5fff4bd76d5e77064272e34f3f13a87dcb6d60afb18678d12e6813a5307c3a4cfba49a59e7216f7168000a32cff1f5d98bb035aba353e91c9955d90993c9f6a2f967747c49e095b859dabbde023ad43989285ea7cd2297b62b73d3b89c9e79a62d67c11749bd0c7cc0158b097eea0a7cfe67680de87721b65158f51b8ec72a45363ce9d3efa028838e9ca0ee762d98a7b1838f152669fe233666943d5f51aedcfcdedf90826f17e71c7f3ab89a3f2a04ee459662a04e027e7dc8a9d251837831cf0a33bfd14db96dedb1ed4c858efa94b662689d58a8d315190308862667995155c8cb1a95d0490e6bbe8c807f76719a10e2395df1bebb6a844d19dc4d86c98b1327c1e14e2d466753515d3e7a3cd127057142a3af9e8340e3008828f0e1219c3668f52f6e4dd8a155b01e8b10744e716075aec04a49b438599fb30fecfd508cbdce837b73cf879d23722f07f2bd22b718349f3347d1db94eaf42e36c6b576c59adaef497d1406cd9621295397c58b44aa236bf724dbca317ef0c25fecd89c8501d66280f69b9c7d4029e0d0de3e031b4298ed1eb30e5bf67a90863953d10bcdeac2fa79a3e4fc1f560b9c4840911c981bdc378a0c2b38084f4bfe762fe17158c1e1ed8fb8079557048bf0b90409cf10be6ced7f99ccc8027bcadf3a592d252e38726ac4caaffbce70a2b2ca933eb83b9b4b767662e5602fac6a6c4aa8931ce1a5b42bbc78897e1ca416c30c54d6604532e25e76378e1d3e687ca17b2c8ac407801150b1b7b87597e8179cab00dbbe043437566bd44a9b3ce024ece11d56299bcbf536248b840e3ac9377114e1eda07019d797e97a7cad9ae0894038576bfc4222eadfe22216dedf354c1abf1bf14d341f2c542c0d78b4388b47fdc754bb1604dd47c7d39c50896e7e5facc4a003afec4d9a7d1664a39786bffa770b264e2f81ff4bd69429e14ecce868e5ef9c918d1de809ff88deeda5dfd2ab3c23e0618b0e945bf52504698bee195ed4617b2165d504dd36819d63d83eb8939fce034d7eea169cdfccaf740b3108245c1b543b808f331db3cef40e5167ba3f86aa4129eef869c71fa61c08fba948975172fa9ccc779bfaf4fdd4fdb09e6e7893fdcd1303dc69fc2fc47ba29e3cb7ccd1fb6a96c2af00f8f47acb5af41d6f321090934ef9f5da7c31aafa4e7aefca60e08ba23975490ed5d84b4e28e082238656a1ac6d7c003318f123d5e5431523622baef2afdfa833b581851f9997e6f0677928aa88b0fd06290f057ff079a213b732d6f98a4643cc3d5f5cd3c1b4814642527df40e92f0f967052f66b30fdb823b30cb8a23054b25214853866031033f0f0786f823788069076afab7f79664f1239f7cec40b70068e93ac98e2880238c019f093b1cfebe58bffcfa83da7fd6f6efe5bb4597e49ae0c57c3f2cfd9893281075664fea4876253871979f1805341eef192b0b7646df0dfac2710c55eaaa54e8fa0edbd6812a06c9feed2bebb538473e0fd751b2d50068e828c19e60fc920d3d09ac25e77d2ede88598d207b0e08017f5517c1ba52e2f03c33045abc40af91ee1c3b2033e9dfc066662799f19a2f1409e2351cf3083be5c0a64b97289e7d03c58bb21efc4333b3665cc7652d661aaed1518387ea0c0130fbf50cd01479316ab748f676c1e62b6197b98109f57cf6078ecdce2f0511227e01b5ce521ecaceb9873aaa832efbed393b416d278b33060ee08c7fa2c8eb71a2a3a03daf1104411000ab76ce93e10eb346d89e9f44215f14e819e63c91a1f56c6ae3799abe7d5cdaaeb79a3d97372e515210aab266a11fd017513c07647654d96cb016c5f93a4667ff93fcc9ba841df18a2d1f911b6ccf253db20d793ad73700de60125d36d2fd1490853ca3810c77562593bbf3fcaac0351b2f3bc1d5f1e09158c756bb008d9b1030b933d52a0d9520e8f33efc1b9c742ca0e580f836f33558cd5e4009d90ff18becd5461d37b8abc4ce357a47e91c2ca5ad46cb355d63cae6244e716a2a9d3c408b2561bc3c3c02b5b49ca1cb61d656d8cfd4c92718ce9363b34d916d22f2f9e0f6a7c2c2412dc399f49663d50a2e207cdcbd2bb70c927184f4d97d6b9e46ee303c60846c714d13070f9e5e7a68803f23a658a68c62a107c6a46d1393d28d2afbfeb6fd8b088f8a8489f64bd4a41d05b8999c0ac4243d1abd4aa137236f90354ecfa2433d5ebb90a04875c774ea8a04d74b0cdf170757a54780969c48de7962b669822d88d6ee88f408e3d3314fe35d9bcdb37e37d3e0ddb723ff0038af0a823e986d37482fc77f0876b6e22cc0671d5b3abd2d757e42e42bd4419d58a950d8c9de71e18b8f635a6ddd581486f14b1bf1da34cea5155809b304f1698b999d9f786e8510c90715024a9049d7e59e818abd7c307f86d60f3f17b5094fbeac1473154314dfbe7f8a79897abbb9bef9af0b53e5a86c88c0b3a60e9f265b965a5f4099776dbbfe11bb71aaa9789b3da19825df9f76430ebc49a6ce41f23e6db8dd73ddf305be76b72679c26036954df5e846ed5960dee98efb9d65d0e06e293c69803de5bf658c9e3143851da374475b88f6dbeda23076ce08b0b1f4ddbd5e94c6f527b0d8454997504c74010219d2e1ed79a6fd04da1ffe4ad19e6721f551e9c3276b4e1c006abdd876f4cffe1179f916833a77e3f71ebd6b563f8824df786d5f98678e4f287aba551d67ffcb30332f3dd6758053e6b8dc753bf602e5036d925518af274b41f4173890a0fb6a08cc479ba94848a3190019bc2cc2553764ec53ecfddbf7a792f0da5ea352ab1644482efb0f840543c72a2fb67ab06b704ef3a4911ae44fe0d550a57e39f16c4ad035e24aba5d22ba0b7231b036d52f3d650ae5cbd68f43303ed0c651b3bfb7d06fd8cabca0d33405a840eeba5a94a9d1d74deba1e5ff587f1b273e139c13a97a49e30e34ad0e7296024ad1aa8a6105ef5329abb5806c94b16759a609ce470edfd7b5c5a9628542aee0678071e28b2afcd037e54fc92a96a898b8f0905bdfc394f5ffbc2404133452746f8d9c438e86dbfd35c25da1bd80f0b9aa0126790ccd42bcea371040a6e1f543c6ce5446c95222dc483525427beb00d4d33e09257f703875ceeed702c68b315a560762277686228b7f2567fb9d6e306851b5fbdf228f47ef30233705e334c3edde1285807377c5af8c3ffa4987380e17ded5ce19fc396955a7d870bb9e5b45e2370eee8533263fd39c3513903e519a0b6d4c8bd75eeb397be473fcabc94b35bb3c87a8f8461aaa83cc0e343ff540f4e197f63c717a65035dff43e28da68749d2bee45783b2ca64afeb40c0f31ea7e85977e1cb6ca8b5223699b414768bb0fe628e2e3bf02e5d07a0bdee45cc7b6c0ef4642d8fb97ad9f77ed3ecc981db5f3a02cea95440970a21d2fa2fc90c093e541b70d3d1bec11f0a9436894599adcc5f1f8ddb9e179a29747b6b273c5b0942d0c37f424f84a1b2dd18af3fe3018f1ec65c99e632c7592a52b4c9396ce976ddf17f328ea0672716f2ec6d48a147edc03031d9851dab24ce7fee630eccea7088c0c642630200034d786c4c70316169588c04e4f7206a52eb01e07e910109a9b8dd0030a2e643896c59a1dab25086034dfe6984a64fa650a95576b7accbfbb1bb62664e7ad6e696ce2398b080b928f5fa06a4361ad870cafa5b2cf7cbe08ce032e9bea1d14dee10fd4e10603300000000000000010a681d008ddb1b1238cf5a46e76199f5139662813dddec6a57b4c91a1ba271087e42beeb6067080dc5d0b5c9205d65b8a6aaf250a4f4137c1fc33cce0e6e77b3cc923f0308de162b3830821fd8bf4bd4208e0123abb8c3c84ede176b905a1cfaa33fa4c02be83acc6ee5393708e5ab7eda2eac5fec183194e76cab1743a89bbe0c1dce8f7d66d9dec6eb6147c7ed42ac72266408e2b2f6fddc1dcb28ce7bc7412e7298f853325f3d665ae167a165afbb3c9ac0b0385ba8c292a3ed9cdefa8f9da87b2d4dc089adce1b53e5ff9aa888def60f14f081c0e9f465f5133814366323f99cd0fa97ab1baa4e26508e735f57e78f552283ad7e9f7eba6758c5f367e846d035802ae121e65cb6748750ec0465f8a8e4ea3f70f1da9896ad8735a48877af78961f940e8e9fa83002b2ffeb586f10e3ae00453a0259fab91970cc540acc8dac003a5c9bb2297c77d7c7d60afd9063664eace8c50ac5e4724e48dd090007557163fae9b79e64a030a81d94d1a2f6b8a1c8abec00db2ad240382d409ee7994716cfecad4574b9e8db72e8a63c08ec25606533f2832a8f12680c0c5ae28e841600ddff8694621347432b5f15fdff47af05de9cd4bb251af222ef39e3fbaa46faa31dfb02564f511d4e2007728295eea7901594f235154d745f42855f753dc981b2ec0074515a8e515114af3d199980e35b2649d5342a33cc74527db826b8256e74a5a3a81204ffd3c205ae31603519ff741b2774767414114c342c5033b8e2ba6a6644e74e40551b739851746fadaf3296f014dbfb6df72bd751f06c999c87ed34db3315d2e0607f173b6d0044dcb8cc8cc60dadb7d91898b9dde8474b7a393a11acfc4eaa788a8448bdf8126f064916c22233aab3942d6297e8c2a1e5231a20f272d0e0b1f9ea3a308ed96f88ff66f18bb8794721f5b6d690817787dccd39a7b2d205b0b145e319d92ef3ca0e8bba47debc29a8f4f77c5c0fc790522bd73abd526f9c157a452084ce77499e7be6f1553e51e3302600b52b070a2aef03ff62f07948ace88273073f08b7a852e7cc172f5b38bb4426bfa1718f137acd2ad75c15d059360aeaccccc3a7852004a39e792312db8d858b911ed064cedcc3d676b512ada00f1c534666757222919251637bf7f6653b18933155f5c5d2cf955725e56b0632dc5fb018a7311d954a92236672432b2512ab22307f28f4aff1ffbb9f2ed3aebdb57b7275a0d429737f0493ce071ae4463f624d69fdafa32c66e8d964d44cf23875b1e2396694afac493da162891d15f7d32fd502a7c08b2275b5e4f14aba32444a6ff40cdb375809cf3cebaa94a0dfd4ba288ac62242606a176370849b7638584d64d9ff365b5344e77f6ec60c706a2a87e7f3fefe6f73504297fbb41b2f1962d2c6d1a12fd76f9a1a598923396b3dfbea1a991a4ce6141e54cec960831251b676e54074335c8fbf9855322f2a44933ddbd5bea43e5a92b45edece83c86ab6d9d474cb13a1f326a658e61b5275ca8016dc0a209644885339fe5a6c0e3432d0ad9206adcd830be0511af156311600247d61e6e6f71a3c26374fc442f9e6e6c2becf5752ab986630f15d3b0324e015cfe05fe7de67ca5a822dc589ea2f8d284b3d7357e79de258466583d81e2aa117378d221bf004236528309d9ece0cfcd34ae0ffc473156aa8d8081289449d8d8de7d6ceec005ab79e637579eb79c1acc53f1ce58c992313433dae79312c712521c2a65a432453671b8fb387f87144fd57f4612e387b77f96e4734396a32d4d8911334bcc83e350a922772b447e12fa54c8f7cf94f7365ac28a5e0ef2c497282a197be05398b23a1b42f8275e36a2cee583fc0b22382ca1904b43d63169fcb58fd22c54651539effee7852f60ecdfc29baf5f8a7778e05bccf375d48a62f567c586bc580bbd0036ea2508c00731e160f5a3bb6b530367ff24f9c2d714cc04983b9c5378b33098b7274a8270e37a90e19e19ff4ceb3af40546424e8a08ae24afc8254324772b5c4825f0ec230201760151f971f69668a3d1bb591075d054935b685c088e05c6e6391199695b90daf349969b89c46f908d3c6f49b8edbe980a26a1e4164a56fea5456329d41da0b8ecdb74658ee55cead4ce17721ab5127b25af2b9a8a4cb9e02cb38503c1ddacc29668b4c5d9d99a74049b730d6791e486c7d510a7f4ed1e8cea648aa40465bb22aa4c5a6d448f0c3236617ee2a1dc18f75c4703c667655d88f8b4f6470a8bb0b212e8b5976e9a4484204db6090f6fb93afd273d0f143b3655b0b45376b573b3d453babb29eacef27e42751b79a986b4f05cfec8c9c73ff8d396e53a0e0d6a8156551e0f854984ea3609fd227d9b1930ee8e09a5a6b12c43b63e5ac8c9106c752622d549075693697d277400f6a3203f1e8b3c3fc368a013a1b6814bf41b05c7409dbaa95d8829ed6a5cbffadc128cade32961d1739e7ce48d66a9430f5b94001d39e0de8f026fcb3850d36aeebfcd6b1b02f43bc8b7753bcde20a318bc4d42554e133d32b7a7e9dd6057b0c17c1fa34ef0419a84ad0680c420ac39cf8c1f47ae55017c1d13845dc1ceadb8a0ef421a1d1f392f028b90e3e7d0aeff2777b2d6c57413441d9f2d0062c9d99e44bd26720317e20332456e726b9946f25d1dcf98396588686509a06b5068f2a70f9ff7f27e88261a762e0a8bac83b103494d40aceae4879a687e453b055af0f5cb3aa02547563921987a34bdea18c5a139dc41da0c3a61641d95be6c91c13c774d784a7e48ec0cbd2e212950191658767c07843c56fbaa12cf3388318bf03c3b2bdc782c9d6c57bf491246ff7a1bb02dcc7452a52eefd30014d6cf599fa0d3c55b660edf0effcd8bc18627bb58d704795b69f91215b9853dc2a0955bd9287da6e9a2263e0145c223aa941ce85192ba5d5ccaeb868160f5f71b497ff626d5b420b49b015905de5538437afada46136e9346e8cb266d7c9188f8fe1e75c39f2749b0d80c7ebef1406c80f33c362df1cfd52d7d1de42f714e9117207103f966f83a516e45cd79cd71238e294ef2de8eafe6104512fee9e2d9427ba658d3b8e0c02f60dbd66ceb3cb8b688dbe7cb531e7c0dbd0ac8018651520c968033e8c74de267859c1ecd3052712556e918257dcbf8337c666f563a79cd95c2d48cd83005ae10cea542044d25ef5656c42ece886a12596df42ce208b35ac86f25bb4819f79135196efee8a46ce7db683eef6a0680554964cca84407dbc35c68e88fe28df14c3addfa01786146f65803ecb31deea8aeef5a5f194a77e246c33911bd2b9ee1290a788c455bd4f71e405dd78a06c26013b4666717152a72d46796c07074e9b728946b18fe9f63c99fca30fd0c30c03c4f632aeaf06f1a75fa256d3f409b9d6890b9a0247de292e6eaaa1c41fbe955e33c4f3d4bc0b4a6f0171420f36ec93c70496e6d0a2c8de6a8717a324f94fc39e69d3bcc6d3b61d1e7331163c84b4da8eec4cf92dfb01285d64feb59ca35861ce6ba5871829a0f2e956f34b98c8503cabd2906da05c942e0140efd5669f891ca6abaa01e435d0de0d1afa9e2969a899118d70037ae811c992b33111ab422e0aa1a2cb3ec24ab57da300439cc9537ad37f540c2d6aaeb30169424b4484d5859953817e9139f0c254b683dd73b2cd770db2f7646ac91749f36c6dc7a6a0e22d01306bf3b81c867bdbe63ddb9e715cd3e1d933fe609422316c54745c938c61c48cfeb9b1986b28a0ab29d00aa03a5a5ebea9a2066c74cce8754779c98b6c9363a2e0d3aca909f05decc44c6136eb99eece52632bfe0490eea1bffddcf9e582c00e89c4f60b7a6d2c9ac3aa1dae8da2d86a3805c105bcf00a6e69689395e1d4d663240cfbd68a7ecce9ee04515d169629a4597eab8c00b3a03d6c68a5fffff6e73d4ea4600855b8ea0c8723dc9a3677711c3bbf068099e8d037f0bb71a0914305d88386d8cfb70cea5d31048da3f859f9a7a96b338fde70fd2217428daa93c73565dabfd9ca12fa8af18a89a1d95b1d9617d1812e5ceca0cf5410c610ce9e118e1796101bfe10cea9bf8aeebd876cc8f9ffb1fe41319a0d99e932c702662d93ce47c77c26b68b349f5f5c59bf4e691f16b8130a8f4eaa94802d85f77c8ad35d6a7bec2ec8597e4224ff497a90b70634cf0df2e03c3b21795e88a7a9f035946c556777944d8a231643b509b655a68449fd629b14d045cd3aa76903f10e69cbd6117ab4f0848c615e49cbb8d1af3d46552743cf0b67d2a1aca8ed4591e780e45c71449f6560cae7ca7cd771d2b556a20006da80fb0d2c91a28e7785e855c07b33892f9a5ba447c33af8c21c3add8531b94ca2266dba2859dc84430c5372fb968e4aa673df876e1dbf58d8dc5d70dac0fc58b7e13e4286a2e0ceb68c3f43e26e131b767c928df49958eb0a87bfb68c438a4a017f30996a4c6638f7f72f77d20ee5257d50fb4f12ce7cc8d256c7cbfc59fe52b2a784ca28d3a1960be4d15002530e27155fe641d6b03755a2dc0a16398c40088ab4e019a52ba79852091ccf3277f028812e4ad1ab7accbaaad51386457b1a13a4bd69dcbaba24f8479d8918ddb7e0e9d3f728a7981481efb4c1fe6dbd591d2da7fc9aab77cbdfb89326f33db3e4beee16710a936c5596a17c8da21c45f99fb2a735f47fab719009ac98a27787642d2b8cddae7cd280c414bad9db1c7e097a78b227dfd5695c7e8e1852f68c26ba55672ca198c229466ed479b0b54c5d7314bcbd51cbc6f6151ad652dc38650b5eedd0a28933c2afe7a1febc351823fe9a987cbf13e0d980129a38d7a4c8d6086315283db94032d84e833da53d72f14ee0b51f1e36b5d71c47d04356d1f075247fb600ac215206fd07d1b30bff1bd9b21bada456dd11a9ca6819b017311102a6562f9afdbcbee105fcace44e69c32c685e10997b10129e0cd1ebb6248296ee4ff8340529c78db64af42b7109b3e3b5577f3a5d8ea0f6b0eeb7eb8ab09caaa5dd79619709043ef5a92451f634e6f58625bd0cc1f8daf143471f7ed649f035149cabcef070da398eca0928a63dd4320e4f4f91b1385992dc036a8b1879221a0214b9c6db46d3a023707ca6f8749213b0c84963ca1b415929c3ec60f293deec9b694b691c826e5cc999582ed50c21fc94acc227b4f945e3cea5d92bdfcbb7822dca08a2e1b138e290b912cc4b5b1e14eecee115cd840d66aee031a12d87a2579a7fe139c21bc1b69a2e7d82e5920696ff37ad6db0284637e46f725b9a3147098a545bfe881e191bb4bfe532ca8973db2c525ff475615f179c3fc215e5750055f24d80f69474a1505eb1f45a87303959539322252bac4c0061ffa7b7dc5b11dcd35497f325c986650cf4bc2efab4ab2acce3be9f82f71d3b3b5a5e61c0c6fe8e788e23aa18a4ceaf35b3c42e270f2dd2a5f7e549bfca25d01ffa5b695d66b7fea8d9a8e19de471bc5d485c53c41a000796077440eecd94d902815917b7908cc49df5e4abdb7bd6d2c9b7730247c32cd658ffd87fc0d70bdac018811807ffa349e5a1e60fe265fda521e6e6096e2ddee666f86caa4ef2bed6e2ec9f57ce13ae3e5405b5493111e2af4996b73dce964498dd305b1123a898f771fce00772ded3f37f460e3521691b23441a23784eae2dafe57c8d3d8f5de081996b92bf188d639f2d50711539ed6651fbb3a737f352fe96f6a9306e559d0790e878acdc2e1623576558fc252efcefac922fb726f393b141f7d9a576ce2a06966b545477e5147fdaccb71e5ea44c830deb31a87f13385072385c332c1bb519140be7eda33e0442d8e311a94d30a08f3d60f24e812e2865e8947d692c921b68b7400c758fe43dbf8c37ea859278061544db0aa0755108e6f90cf5c4f2819c96302000327232096d1a82ecf61cbcefe3f6bb4b2cc570beab4cd6461a9d99d60e79d53137c6075e0dc4b055ad55aa8bce73a5eb67c780b3bb548c76957055d20ee484652dd0d58b06a9c5bc0453a6006553d7250b9c9378640113ec0529fe9a84aee08c0fd4e1060330000000000000001a17bd801fbecd6d44aa5c7dc813891fb97ad58d073e0f93b72396185b875617ea296d3feb204c8eae268302f29ef06c3f202a1efcaac3ff2f1097413b604b69b12973e197127108008cc904c93a533c3f1e057a21ceabf89bf3e63d38aa64511d918adf0fdd4896ee71bb9faf59c114bc44a2d1e9aa120bbd144f48e3fffde961e0e6db917ecaf6d677d49c58e63079c704b196b4c61690258dcc054f7f874b0f52b263753a611a4655acc1c98ce634efa94c66bb93f1d9434b68902be611796ec818027a6d43765dbda57dcc34f1aa5adabbb6865ace3421ab2d51eb62f5c732677e6bdd7aa7b8fb0789562fdf70770847b4b667c84a7cfd156aae89ab76d7035af3c588c4905fe0735d093d7e15d1ea576d21ad6a97590fc5313fd6451f4c627456c4cb8b49ab9ceee34ebf787abd148058bd47c890431aa513bd84f8accaaa59db7c8e412913959405a0d56ca54f364a68fb13ebb95fd10720b8bcf649817d23b9c151fcde394b63b25704c5f5f54f3486606b40fb0d1ee430b35949b87985c19f48498dcf4d52d7c61ebc2bf19846b6b0519fdc7758fb836bac55c686bc7d78850812753a51fb4da8eb8aa81cf676c43355ff5682796514935e0fc114a534f6cbd5198caaa04fef34c4e3105e6c80b7b0c7a3f9c78201ad7ae84eea0a7a8822c7966ddb0b63e67365eb42579da8120f31676619d5eedb33c075583f3dfd4de8fec0ff9f1ce0d1b0c64a9a14a848d6b8eb44371ded67dffb41137e9fb72210ff4574c345bd16e650d2e5c9d05847f0ccaceae3db51ca74227ededc05c203e7f89ce8a5e0d417c90542ac2df63e2c606c73020e33e3cbdbfda2fb75399722abdd43cfb4846d639bdb84d865055eae7e239c0cb071dde8c739ba2b9ae9887f94c4c94ce671de676883e3402e61d74c27622ec49b26747c6729f3ac7c28222470fb8af9bdfa664ae3f15b950a9fe62179ef1548448a739f4054b8e6d4a2d7092810314355fb5f419c8bd7a2c2f0a9cb822242e719c684755ef1bcce13328f6be317b9e8a1a86b5d3de65f288e5013b8eaf839de472b202c66db5dc9c974bba5b154a58a2f67f9fe33ad646b1c40c9cb0ef8c1715ec18a24acee922bf4f0c0fabc3e43edaf858ee24b23ad1a2c01801b0eb8a54b5b14776f80b9588d75e8102b49280e9a7e6b73a205599c1bde71ec85112bad7ed46981e2a7a5d5a7b67aa22e56b8cc2e1b67a155bc6767d35e7d95dab119ccbddd00058ba365b86511206a51fa56f4fcc838ad5a1f91d31826306acb351dc36fdf5e58026c65b160a3159abacf241896ad2a4bf1db73555c2a688b901c373b3ff986b19d1b42ee6f945e939cbac8eb5dc55d9ad247e954eb67b129d8a9625a2eac628b67cdca3acbf8333a27304e583957ab7ad11fb88db233b0372c5c7cc9a598b44bfd87ed64f6b80fe3564d9e24aa87cdbf5da3b01bf15e9ba1477286bcaee5ddd908682d24dc05e79b10ad6d9c27560c43f71d2d8bdafbb709c3561db25997ea5ae2c08f71148f50879cec08dead14638f415dd564d7c1d05455883a3a84c07d81770be34059e290fdd1a854e3d45de6b408dfd3ada2a05795ddc8a63c7a55a53fccf6986476ead6e703fd24262523f3069f56a48ef751c442ac901fd79b0af6676299dbfaf60b0a541f69e7482e9c8290e481ee98e14b2ac4de5c9eeb0601dbe3d19fe6539a84f405f9d5a432975a6c52aa397752b39ed7db65775c67a68a534c33fa61c22f9ad793ef0230fba4efd1a611a9776e39cf506f9b33b509dfa71242444106fb6b0c221125ccf82065aa06c6ead9e21eb0956ccfb406d71de0e9a53012bc52abc210294db90672f7d64eaa95eb122d5e477a79813a2db5e3982216b86dda6a2d11290db2b1af4fe693ab98b1647a7d934b192b254fff35ea441d965642b5c15d4af3c2996a627e101b379d477fc679632d74444e8d02f66f6b803d3bec62bcfcd738d0bae5a899e0ab85a124cbc6c0ac14956add647a0fe98a0ff007fbde6cfd5aa476ce0efe263cb742f3514ee1f859b15d9e45e8fc3bc6e905eb91817ddb1ccdbd7ed08099991139e43faa20bfd9577166d6099f28e1b69a5aaebe07f60ff642ed772a3430fec167ce63b71ae391b7924daa992e3137cc1d34c68b554a20bfbc50632356a5454246057f9f2a703fa7cbfd519e5a054d4bad914a5cd97a15cafbcb87a1c8f78119c6b8c08f06466c1dc863a5761b0c05f6535701689ec2e6f69893e84643ad41976fc9986ec505ef42aeaf0583807f3b2d713840e3636806962ad4a06460558a1bb04aed5c87a94ef1b9bb551a3a77df28ddc8a673ee2d5dd9f665703ae9619e5384b5bee10b3ca10be7e24d231b8de242d7f6fa759780d825e053c902d814a407408c46086b66c1e3c9844ecad6cb1df93b1f6730f03126eacf34fa5f8d2c2473802ec07f9c6a8f56d125ac59860240a57a5fe9d17903ce3c01d1e0a88798749a920092d44c57707e5c7f2431957424f3505a88f9fdb34b1ddbcb3ce25c82fbd22ae07eb5baeb5cf440fa94ce8e1059dae595fcf93fbf491fbaf032db776c62d41cb589a22e542c8db63962faf43221fd1fcbc47740f0252692a854e1436d159c53027d1c2e4a8a81523b999bddcbf56d6f5d94118c2a2d8c7edbe89132bfc50b1f95c45f24b9641a0eff4210fe5b1e1636b485b7e252084724e0a4a7b40547ab6a44500f8ebbf8a7ab1aeeca93373a479b70db6667ccbb4598d35c0891a3ca7535a9090c0894df776dcec823c8a5af8481ce2bacb857cfeebd8b08d738f00f93912f804561ea32d86928cf622dd250aa1e3751ce48389b80c425a53aec185efdb11e1196e473144a5a26b76cb31aece2f85fb4ad70c66e0dda82acd66373a28769de943705170dfe9eba298270ed6a280c8ee36f6135393d88b01396b78911f6b682bd99f23221cfec36aced43b4d4c52b872d29cd5ec4879fb43020fb3bf7ef7635d797021db7f3fb8ee334f2b30fee5ee5a666f3b154930418e090ffa39affeeb086a83baa760c47f3a3398389aa77698e829ac153c45ec9acc3d19d5b17a71e9fe7622d8133281083565bd71a32c5978cb7e91bb6afd83359d4217f9c50de6ea829099ea1fc011989e88c648c6a79f28f1733a11f7c1a7962cbaaf73710951e67279c79245063d1a0cc905781445c5bdc90979744287aa5b80f367dc17654bf3b5796cac1b027c72cdcf79b12b894e48f2d15c0c9880d64f4799af9a711001690d7c9e45cc5f1b6a9f2cd07390692f54dc6fe7e8584601f10ff5c33c4a4e72165ec5c4818109b89244b46814921bb231cffc5a281f98e4332835e1715038a1dbecd230f06f48119753da38784f5ffc5d7e7d89aa1bdbf47fbe3bb04e1b83da4199f6b0f4bc8e5dc58b7c961e0912fe9cb0184860eb5da860ae08e67f4dd1544269bbacddf2f17757e0d86f0d0dce2390aa2a9ff98dd4a65052d2bcb5a5ae103e6303ab8c92694e49df9b158b2b0e3938d2927c2be9fd2eeeb152d24d13cd4bb5af104fe856017d315a19348e8ec417ea0e7d0a650d845a562daad993db81dbc7138ff2c86172e3d2749f69f61d532fbd99f92897668f4ebd2d49d590cc2486c83cc9b8911286b6e610e430d3bb2c6125244e2aefe7cf124455ecb159be1df64066f36317ea8b4146836f71d351613c4e9d3c9f5f0c9f5cf99010697ea550d21bd74fcb9f9582c6b958122672fdb90183e446022710cdf9df0cef3e15f6f29025fcffc2ef15484df2b001cb919be46fd6821cd4f9c259859b600e61bb020338c9ce1ba362930165eec3340aadced8be80bb41db674f1215926e2104930a36a0873405d3d19dbd34f4383c5a96b4a363fa90f25da756768dbf289214db61632aaa0f0b4c39100c209f9059f8c840133d1412a7ee508f85f9286a7709a40b8bd1da7fae5906f5090e81a090a8ef689a639ac14b9f7e1182db7d6939c5cab757b2e6b5e384ece941c552f6f32dd5fc9d66752c1c1808531f31e039841f9cb610082b49fde69268aacd2c93db1af3e1ef1c2be6d124585979ee53bb39c4296f34356cb04fd3605a436dd39b6268e5213cff6f8429dd9eddb4602a6353e14b625f554d3472ea3afdd0353ebab6d80dc5ac2fa077d75a7d9ee224dd8a97a35abc1dcb4209fd4df8c8137a7e25bc46c6d961fe480da57638e9c82d5b98c0c4638aa18f2dddf26d52c6da811bf40739f604068f5375f21c14723d081a482b83d6e258dbffc12ac16cb53fba4934f3128f6b2444a7fa6582df34045564fdf17150977a4820a9c842ffc49cb4b112f17d6caef48a6b1fd8c15e61dcce152caef791c1b537f6bb2796bfc3961f3d5b1c487ab00e31399278fecac5ee64501079a2eb4b5c36175becdc2f0eb4f7ede7fa6591b4e508303137675dd8b61951f7585807e4b00d0c71ab87a7a34f314cc1208a306702a771110ac51c16e8ba7f68c5328f3dcddeb569351e8d69034a6b2c7c9d2cb42f9bcc6c67dad7d980c9c350d46c681f0c1498a2b9497cf30c5e8d6f1602107c52b8d07538579e2a5a5a8519c17d0466a6f5dd6a7e9c7267968e556d5728859122309dea1617b9f4d3c04c2d78388c7c00c38d01d17d619ebecc72e1e7be03ae1528b0a985ffe7f59ca0dd8c967bf13569b63e1fb093191986109522e0a942c560f14367d9f47672bbcdddd11a759042c0194e8e8924f5ba95cc2281ddf430fbe7873a0022d23b353a87f025562b86e3ab7fe5598e4349b62671ed0171763d75c972b0f7c1b6dcdf661ccf06d3b9f811021f7359cf472b20b49254e89945fbf7d86cc5e3863c415d61126de01401e5e3e1d268f3a2dd53edafb71cec77f0358bd1633194cfec66fab07c9f7232425dde93a97833a512967e50a21e515e053415ef42953c0fbfaecce64f723fd7c2ac67e5f2ce642455ba5de2fb14f6f4892d6fc6a173e2faab450e1a6db158a78ede3a1f9f4682275be675e82119a2139082d3f56afc000c3b72a644ae6d45389b1afa4eafa9037ecd3d52bbe469c714b58298f15850b2f8a31c7f03990dfccdfce485a12ef5179ab36c5774fcbc1c745b2062ea8a8550ea6fa8c9f97393137aa4b44fb3df98cbd4028c041cba5d82b1bb04f68f286853470e1e4c25136c29e2441292d0d50e100fd00406d3144304215e4390403c524fe017f4f9b2ad509f9b1d230be16b47d1813700b5a44cc5766510792a13191b2c033ee560f8cb369ee8525b5dff14a651130d5f3f36aaa67124cb3a2f9024783d4795611421167c9ca8d3783efd303591f5da1cee431d7eb425804325eed8c7e8241423669e6d0991d6db640c88d52c12177424bd50f56f2103b1dfea4648943b98c66152c12639dea44ffd06aac91ffd6398a8998ffa6cdb686cf2258399c0aa96cdda90a7d3561392ce061c6f2f7961ab8d6ec457aa08b3c60fabd338639e006a77f59b4d7a06c9d2125c92bddfa0b748da6f5d58f7e837f4f40968cbb9f55435cf086d20928834c314d84121c1dc9aaf40df8c26314dfa0a6ee2a64404a617b5f28fd84c9529025db4d14b4f2a8fd913cb341a8a1e75af6c344045d70acc3f9eb329e7454469ce2d5802a018e1924851267a8cb1477bccb8cc85f07cdd729fc15384b26b0e681821360266743f72a252ab0f4ff3b1bb81b4ea73fff7105df82c7c197594ccd192e0e07e562361f01d66b1d64a39bfb08b9d2ce909439879323d86096852b4ec291c6639bd37c16dc602bc56932ae88110deb95bbb2c0de30c5a890ca546587d482118d80ba07e4e099021aca2071f9988c955cd4c87c938cfd0b1d65f6a58401a1020b564864076146061f88f431849cb3e6fa76a98ec9fb5b80472677d292d9d2ef3b7168eb08a0000"; + Object tx = Wally.tx_from_hex(tx_hex, Wally.WALLY_TX_FLAG_USE_ELEMENTS); + + final byte[] genesis_hex = h("00902a6b70c2ca83b5d9c815d96a0e2f4202179316970d14ea1847dae5b1ca21"); + byte[] genesis = new byte[32]; + for(int i = 0; i < genesis.length; i++) { + genesis[i] = genesis_hex[genesis_hex.length - i - 1]; + } + + final Object scripts = Wally.map_init(2); + final Object values = Wally.map_init(2); + final Object assets = Wally.map_init(2); + final Object cache = Wally.map_init(16); // TODO: Add a wally constant for this + + Wally.map_add_integer(scripts, 0, h("5120900d1d75269396d4220c4529527dbcb746a6093c7209cea2d76a87c8ab9447fc")); + Wally.map_add_integer(scripts, 1, h("5120b850370392dafc3e7d02db13b447c927e98b6439681fea582401e570904cd6a5")); + Wally.map_add_integer(values, 0, h("083696f3aefdf18c044cab5ef189c575d79a096db1c6bc17f152cdf1fd3cb136f3")); + Wally.map_add_integer(values, 1, h("097dfabf3388968a388633a058784a5bff414a53801cf32109be34b92123d3096e")); + Wally.map_add_integer(assets, 0, h("0aacb400cb406593951f7f7e61b63f10db73ee63b861c31fd266cce84f145f87f2")); + Wally.map_add_integer(assets, 1, h("0ae983aaefe54f21571238e95a93a8c965ed737bc217ea480485be1e1969adc279")); + + final int input_idx = 0, key_version = 0; + final int sighash = Wally.WALLY_SIGHASH_DEFAULT, sighash_type = Wally.WALLY_SIGTYPE_SW_V1; + final long codesep_pos = 0xFFFFFFFFL; + final byte[] tapleaf_script = null, annex = null; + + final String expected = "2c478ce6d5637e0ea8be37a53090e0955b6c501773fccf6738520cfcc5442150"; + + // Compute the signature hash + Wally.tx_get_input_signature_hash(tx, input_idx, scripts, assets, values, + tapleaf_script, key_version, codesep_pos, annex, genesis, sighash, sighash_type, + cache, bytes_out + ); + assert_eq(expected, h(bytes_out), "different sighash"); + // Compute again to ensure the cache works as expected + Wally.tx_get_input_signature_hash(tx, input_idx, scripts, assets, values, + tapleaf_script, key_version, codesep_pos, annex, genesis, sighash, sighash_type, + cache, bytes_out + ); + assert_eq(expected, h(bytes_out), "different sighash"); + // Compute with the cache disabled (passed as null) + Wally.tx_get_input_signature_hash(tx, input_idx, scripts, assets, values, + tapleaf_script, key_version, codesep_pos, annex, genesis, sighash, sighash_type, + null, bytes_out + ); + assert_eq(expected, h(bytes_out), "different sighash"); + + Wally.map_free(cache); + Wally.map_free(assets); + Wally.map_free(values); + Wally.map_free(scripts); + } + + public static void main(final String[] args) { + final test_elements_tx t = new test_elements_tx(); + t.test_elements_taproot_sighash(); + } +} diff --git a/src/swig_java/swig.i b/src/swig_java/swig.i index 14d7f9f6d..5ce5d2ae7 100644 --- a/src/swig_java/swig.i +++ b/src/swig_java/swig.i @@ -393,9 +393,13 @@ static jobjectArray create_jstringArray(JNIEnv *jenv, char **p, size_t len) { %typemap(jtype) const struct NAME * "Object" %typemap(jni) const struct NAME * "jobject" %typemap (in) struct NAME * { - $1 = (struct NAME *)get_obj_or_throw(jenv, $input, ID, "NAME"); - if (!$1) - return $null; + if (strcmp("NAME", "wally_map") == 0) + $1 = (struct NAME *)get_obj(jenv, $input, ID); + else { + $1 = (struct NAME *)get_obj_or_throw(jenv, $input, ID, "NAME"); + if (!$1) + return $null; + } } %typemap(jtype) struct NAME * "Object" %typemap(jni) struct NAME * "jobject"