diff --git a/README.md b/README.md
index d5a97405..855b62d7 100644
--- a/README.md
+++ b/README.md
@@ -37,15 +37,26 @@ MIT
## Addresses
+
+v3.2
+
+| Name | Address |
+| -------------------- | ------------------------------------------ |
+| Meta Factory | [0xd703aaE79538628d27099B8c4f621bE4CCd142d5](https://contractscan.xyz/contract/0xd703aae79538628d27099b8c4f621be4ccd142d5) |
+| Factory | [0x4600A1e70fB9e4C9A3feC6d9105f6807aDEACbe2](https://contractscan.xyz/contract/0x4600A1e70fB9e4C9A3feC6d9105f6807aDEACbe2) |
+| Kernel | [0x97EBdCa9c606d493daD1bE10188Dd78cadB2a139](https://contractscan.xyz/contract/0x97EBdCa9c606d493daD1bE10188Dd78cadB2a139) |
+
+
+
v3.1
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Meta Factory | 0xd703aaE79538628d27099B8c4f621bE4CCd142d5 |
-| Factory | 0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419 |
-| Kernel | 0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D |
-| ECDSA Validator | 0x845ADb2C711129d4f3966735eD98a9F09fC4cE57 |
+| Meta Factory | [0xd703aaE79538628d27099B8c4f621bE4CCd142d5](https://contractscan.xyz/contract/0xd703aae79538628d27099b8c4f621be4ccd142d5) |
+| Factory | [0xaac5D4240AF87249B3f71BC8E4A2cae074A3E419](https://contractscan.xyz/contract/0xaac5d4240af87249b3f71bc8e4a2cae074a3e419) |
+| Kernel | [0xBAC849bB641841b44E965fB01A4Bf5F074f84b4D](https://contractscan.xyz/contract/0xbac849bb641841b44e965fb01a4bf5f074f84b4d) |
+| ECDSA Validator | [0x845ADb2C711129d4f3966735eD98a9F09fC4cE57](https://contractscan.xyz/contract/0x845adb2c711129d4f3966735ed98a9f09fc4ce57) |
@@ -54,10 +65,10 @@ MIT
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Meta Factory | 0xd703aaE79538628d27099B8c4f621bE4CCd142d5 |
-| Factory | 0x6723b44Abeec4E71eBE3232BD5B455805baDD22f |
-| Kernel | 0x94F097E1ebEB4ecA3AAE54cabb08905B239A7D27 |
-| ECDSA Validator | 0x8104e3Ad430EA6d354d013A6789fDFc71E671c43 |
+| Meta Factory | [0xd703aaE79538628d27099B8c4f621bE4CCd142d5](https://contractscan.xyz/contract/0xd703aae79538628d27099b8c4f621be4ccd142d5) |
+| Factory | [0x6723b44Abeec4E71eBE3232BD5B455805baDD22f](https://contractscan.xyz/contract/0x6723b44abeec4e71ebe3232bd5b455805badd22f) |
+| Kernel | [0x94F097E1ebEB4ecA3AAE54cabb08905B239A7D27](https://contractscan.xyz/contract/0x94f097e1ebeb4eca3aae54cabb08905b239a7d27) |
+| ECDSA Validator | [0x8104e3Ad430EA6d354d013A6789fDFc71E671c43](https://contractscan.xyz/contract/0x8104e3ad430ea6d354d013a6789fdfc71e671c43) |
@@ -66,10 +77,10 @@ MIT
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Kernel | 0xd3082872F8B06073A021b4602e022d5A070d7cfC |
-| KernelFactory | 0x5de4839a76cf55d0c90e2061ef4386d962E15ae3 |
-| SessionKeyValidator | 0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5 |
-| ECDSA Validator | 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390 |
+| Kernel | [0xd3082872F8B06073A021b4602e022d5A070d7cfC](https://contractscan.xyz/contract/0xd3082872f8b06073a021b4602e022d5a070d7cfc) |
+| KernelFactory | [0x5de4839a76cf55d0c90e2061ef4386d962E15ae3](https://contractscan.xyz/contract/0x5de4839a76cf55d0c90e2061ef4386d962e15ae3) |
+| SessionKeyValidator | [0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5](https://contractscan.xyz/contract/0x5c06ce2b673fd5e6e56076e40dd46ab67f5a72a5) |
+| ECDSA Validator | [0xd9AB5096a832b9ce79914329DAEE236f8Eea0390](https://contractscan.xyz/contract/0xd9ab5096a832b9ce79914329daee236f8eea0390) |
@@ -77,11 +88,11 @@ MIT
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Kernel | 0xD3F582F6B4814E989Ee8E96bc3175320B5A540ab |
-| KernelFactory | 0x5de4839a76cf55d0c90e2061ef4386d962E15ae3 |
-| KernelLite | 0x482EC42E88a781485E1B6A4f07a0C5479d183291 |
-| SessionKeyValidator | 0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5 |
-| ECDSA Validator | 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390 |
+| Kernel | [0xD3F582F6B4814E989Ee8E96bc3175320B5A540ab](https://contractscan.xyz/contract/0xd3f582f6b4814e989ee8e96bc3175320b5a540ab) |
+| KernelFactory | [0x5de4839a76cf55d0c90e2061ef4386d962E15ae3](https://contractscan.xyz/contract/0x5de4839a76cf55d0c90e2061ef4386d962e15ae3) |
+| KernelLite | [0x482EC42E88a781485E1B6A4f07a0C5479d183291](https://contractscan.xyz/contract/0x482ec42e88a781485e1b6a4f07a0c5479d183291) |
+| SessionKeyValidator | [0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5](https://contractscan.xyz/contract/0x5c06ce2b673fd5e6e56076e40dd46ab67f5a72a5) |
+| ECDSA Validator | [0xd9AB5096a832b9ce79914329DAEE236f8Eea0390](https://contractscan.xyz/contract/0xd9ab5096a832b9ce79914329daee236f8eea0390) |
@@ -89,11 +100,11 @@ MIT
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Kernel | 0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5 |
-| KernelFactory | 0x5de4839a76cf55d0c90e2061ef4386d962E15ae3 |
-| KernelLite | 0xbEdb61Be086F3f15eE911Cc9AB3EEa945DEbFa96 |
-| SessionKeyValidator | 0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5 |
-| ECDSA Validator | 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390 |
+| Kernel | [0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5](https://contractscan.xyz/contract/0x0da6a956b9488ed4dd761e59f52fdc6c8068e6b5) |
+| KernelFactory | [0x5de4839a76cf55d0c90e2061ef4386d962E15ae3](https://contractscan.xyz/contract/0x5de4839a76cf55d0c90e2061ef4386d962e15ae3) |
+| KernelLite | [0xbEdb61Be086F3f15eE911Cc9AB3EEa945DEbFa96](https://contractscan.xyz/contract/0xbedb61be086f3f15ee911cc9ab3eea945debfa96) |
+| SessionKeyValidator | [0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5](https://contractscan.xyz/contract/0x5c06ce2b673fd5e6e56076e40dd46ab67f5a72a5) |
+| ECDSA Validator | [0xd9AB5096a832b9ce79914329DAEE236f8Eea0390](https://contractscan.xyz/contract/0xd9ab5096a832b9ce79914329daee236f8eea0390) |
@@ -102,10 +113,10 @@ MIT
| Name | Address |
| -------------------- | ------------------------------------------ |
-| Kernel | 0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb |
-| KernelFactory | 0x5de4839a76cf55d0c90e2061ef4386d962E15ae3 |
-| SessionKeyValidator | 0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5 |
-| ECDSA Validator | 0xd9AB5096a832b9ce79914329DAEE236f8Eea0390 |
+| Kernel | [0xf048AD83CB2dfd6037A43902a2A5Be04e53cd2Eb](https://contractscan.xyz/contract/0xf048ad83cb2dfd6037a43902a2a5be04e53cd2eb) |
+| KernelFactory | [0x5de4839a76cf55d0c90e2061ef4386d962E15ae3](https://contractscan.xyz/contract/0x5de4839a76cf55d0c90e2061ef4386d962e15ae3) |
+| SessionKeyValidator | [0x5C06CE2b673fD5E6e56076e40DD46aB67f5a72A5](https://contractscan.xyz/contract/0x5c06ce2b673fd5e6e56076e40dd46ab67f5a72a5) |
+| ECDSA Validator | [0xd9AB5096a832b9ce79914329DAEE236f8Eea0390](https://contractscan.xyz/contract/0xd9ab5096a832b9ce79914329daee236f8eea0390) |
@@ -113,9 +124,9 @@ MIT
| Name | Address |
| --------------- | ------------------------------------------ |
-| Kernel | 0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957 |
-| TempKernel | 0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995 |
-| KernelFactory | 0x12358cA00141D09cB90253F05a1DD16bE93A8EE6 |
-| ECDSA Validator | 0x180D6465F921C7E0DEA0040107D342c87455fFF5 |
-| ECDSA Factory | 0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE |
+| Kernel | [0xeB8206E02f6AB1884cfEa58CC7BabdA7d55aC957](https://contractscan.xyz/contract/0xeb8206e02f6ab1884cfea58cc7babda7d55ac957) |
+| TempKernel | [0x727A10897e70cd3Ab1a6e43d59A12ab0895A4995](https://contractscan.xyz/contract/0x727a10897e70cd3ab1a6e43d59a12ab0895a4995) |
+| KernelFactory | [0x12358cA00141D09cB90253F05a1DD16bE93A8EE6](https://contractscan.xyz/contract/0x12358ca00141d09cb90253f05a1dd16be93a8ee6) |
+| ECDSA Validator | [0x180D6465F921C7E0DEA0040107D342c87455fFF5](https://contractscan.xyz/contract/0x180d6465f921c7e0dea0040107d342c87455fff5) |
+| ECDSA Factory | [0xAf299A1f51560F51A1F3ADC0a5991Ac74b61b0BE](https://contractscan.xyz/contract/0xaf299a1f51560f51a1f3adc0a5991ac74b61b0be) |
diff --git a/broadcast/DeployKernel.s.sol/11155111/run-1733513810.json b/broadcast/DeployKernel.s.sol/11155111/run-1733513810.json
new file mode 100644
index 00000000..bb459f3c
--- /dev/null
+++ b/broadcast/DeployKernel.s.sol/11155111/run-1733513810.json
@@ -0,0 +1,124 @@
+{
+ "transactions": [
+ {
+ "hash": "0x47be68e002906a800851804d2f520ab6374cda01a940d973245dbbfe7f10a8d4",
+ "transactionType": "CREATE2",
+ "contractName": "Kernel",
+ "contractAddress": "0x97ebdca9c606d493dad1be10188dd78cadb2a139",
+ "function": null,
+ "arguments": [
+ "0x0000000071727De22E5E9d8BAf0edAc6f37da032"
+ ],
+ "transaction": {
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "gas": "0x733196",
+ "value": "0x0",
+ "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020357602081615ddd80380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615b9e908161023f8239608051816147a9015260a051816147cc015260c0518161483c015260e05181614862015261010051816147880152610120518181816103b40152818161069d0152818161084301528181610a9f01528181610e1e01528181611136015281816112aa015281816113000152818161182d0152818161195d015281816125ac01526130090152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612eb75761001b612e86565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b12565b611af4565b611a9a565b611a64565b611936565b6117b8565b6116d6565b611689565b6115b6565b6114a5565b611439565b611407565b6112d9565b611295565b61123d565b61110f565b610ff8565b610ee9565b610dee565b610d50565b610cca565b610c6f565b610bbc565b610a1e565b610988565b61080d565b610665565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d65565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f2a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632576103ef6020820135613294565b9092919084836001600160f81b0319861615610619575b82610411939461348d565b9361043661042661042184611cf7565b6120ca565b946001600160f81b031916151590565b9384806105d8575b6105c957602001516001600160a01b031690819081156104d15760019261046f61048e925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b0361053c57826104e0575b50506104d157816104bb925b6104bf575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104aa565b631a0a9b9f60e21b5f5260045ffd5b61053592506105319161051561050f6105096104fe61052a95611d2e565b9360608101906120f6565b90611b72565b90611cc1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f80610499565b82919291610596575b506104d15761050981606061055b9301906120f6565b638dd7712f60e01b916001600160e01b03199161057791611cc1565b160361058757816104bb926104a5565b63dbbb044b60e01b5f5260045ffd5b6105c3915061052a6105aa61053192611d2e565b61051561050f6105bd60608801886120f6565b90611b61565b5f610545565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106116106085f516020615b7e5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615b7e5f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610679610641565b61069a6106945f516020615b7e5f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610803575b156107f95760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f916107ca575b50156106325760405163d68f602560e01b8152915f838061072f363433600485016121bd565b038183865af192831561079d575f936107a2575b5061074d906136a1565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061077990600483016121e2565b03925af1801561079d5761078957005b806107975f61001b93610fa1565b80610d22565b611f1f565b61074d9193506107c3903d805f833e6107bb8183610fa1565b81019061215b565b9290610743565b6107ec915060203d6020116107f2575b6107e48183610fa1565b810190612128565b5f610709565b503d6107da565b5061001b906136a1565b50303314156106cd565b60203660031901126102225760043561082581610211565b6108406106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061093c575b156109325760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f91610913575b50156106325760405163d68f602560e01b8152915f83806108d5363433600485016121bd565b038183865af192831561079d575f936108f3575b5061074d906121f3565b61074d91935061090c903d805f833e6107bb8183610fa1565b92906108e9565b61092c915060203d6020116107f2576107e48183610fa1565b5f6108af565b5061001b906121f3565b5030331415610873565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109a581610946565b6024356109b181610211565b6044356001600160401b038111610222576109d0903690600401610233565b6064939193356001600160401b038111610222576109f2903690600401610233565b91608435956001600160401b03871161022257610a1661001b973690600401610958565b969095612339565b608036600319011261022257600435610a3681610946565b602435610a4281610211565b6044356001600160401b03811161022257610a61903690600401610233565b6064356001600160401b03811161022257610a80903690600401610233565b91610a9c6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ba0575b15610b915760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa90811561079d575f91610b72575b50156106325760405163d68f602560e01b8152955f8780610b32363433600485016121bd565b0381838a5af196871561079d575f97610b52575b5061074d959697612482565b61074d969750610b6b903d805f833e6107bb8183610fa1565b9695610b46565b610b8b915060203d6020116107f2576107e48183610fa1565b5f610b0c565b50919361001b95939193612482565b5030331415610acf565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104bb610bfd600435610bdf81610baa565b5f60408051610bed81610f2f565b8281528260208201520152611e57565b600160405191610c0c83610f2f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cbe600435610c9381610946565b610ca860243591610ca383610baa565b611d2e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610cff600435610cec81610211565b5f604051610cf981610f4f565b52613065565b60405190610d0c82610f4f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610d8f610d9d610d6e6139ee565b604092919251938493600f60f81b855260e0602086015260e0850190610d2c565b908382036040850152610d2c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610dd5575050500390f35b8251845285945060209384019390920191600101610dc7565b6040366003190112610222576004356001600160401b03811161022257610e19903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632575f908152602081905260409020546001600160a01b03169060609060018314159081610eb9575b610e8e610e87826060610e959401906120f6565b8091611b80565b9030613ad6565b5015610eaa57610ea157005b61001b91613afb565b63f21e646b60e01b5f5260045ffd5b9150610e95610e8e610e87610edf610ed7610e8760608801886120f6565b903489613a8b565b9492505050610e73565b34610222575f36600319011261022257602063ffffffff5f516020615b7e5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f4a57604052565b610f1b565b602081019081106001600160401b03821117610f4a57604052565b604081019081106001600160401b03821117610f4a57604052565b61012081019081106001600160401b03821117610f4a57604052565b90601f801991011681019081106001600160401b03821117610f4a57604052565b60405190610231604083610fa1565b6040519061023161012083610fa1565b6001600160401b038111610f4a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611023903690600401610958565b602435916001600160401b038311610222573660238401121561022257826004013561104e81610fe1565b9361105c6040519586610fa1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ce575050506044356001600160401b038111610222576110a2903690600401610958565b90606435946001600160401b038611610222576110c661001b963690600401610958565b959094612587565b60408336031261022257602060409182516110e881610f6a565b6110f186610654565b81528286013561110081610211565b83820152815201920191611079565b61111836610260565b6111336106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611233575b156112285760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f91611209575b50156106325760405163d68f602560e01b8152935f85806111c9363433600485016121bd565b038183885af194851561079d575f956111e9575b5061074d939495612754565b61074d949550611202903d805f833e6107bb8183610fa1565b94936111dd565b611222915060203d6020116107f2576107e48183610fa1565b5f6111a3565b509161001b93612754565b5030331415611166565b34610222575f366003190112610222576104bb60405161125e604082610fa1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d2c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6112e236610260565b6112fd6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113fd575b156113f25760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f916113d3575b50156106325760405163d68f602560e01b8152935f8580611393363433600485016121bd565b038183885af194851561079d575f956113b3575b5061074d939495612ac3565b61074d9495506113cc903d805f833e6107bb8183610fa1565b94936113a7565b6113ec915060203d6020116107f2576107e48183610fa1565b5f61136d565b509161001b93612ac3565b5030331415611330565b34610222575f36600319011261022257602063ffffffff5f516020615b7e5f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061146960043561145b81610946565b611463612c6b565b50611cf7565b81519061147582610f6a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114c1600435610211565b6114cc602435610211565b6044356001600160401b038111610222576114eb903690600401610958565b50506064356001600160401b0381116102225761150c903690600401610958565b50506084356001600160401b0381116102225761152d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115965750505090565b82516001600160501b031916845260209384019390920191600101611589565b34610222576020366003190112610222576115f56004356115d681610baa565b6060604080516115e581610f2f565b5f81525f60208201520152611e8d565b60016040519161160483610f2f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611666576104bb858761165581880382610fa1565b604082015260405191829182611541565b825460501b6001600160501b03191684526020909301926001928301920161163d565b346102225760203660031901126102225760206102bb600435612c83565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116df366116a7565b90916001600160a01b036116f233613065565b54169182156117a95760609060018414159485611792575b611714929361436d565b92611782575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061175357505050500390f35b919360019193955060206117728192603f198a82030186528851610d2c565b9601920192018594939192611744565b61178b91613afb565b5f8061171a565b61171492506117a2363487613a32565b925061170a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117d081610946565b6024356001600160401b038111610222576117ef903690600401610233565b6044356001600160401b0381116102225761180e903690600401610233565b9061182a6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061192c575b1561191f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa90811561079d575f91611900575b50156106325760405163d68f602560e01b8152945f86806118c0363433600485016121bd565b038183895af195861561079d575f966118e0575b5061074d949596612d5b565b61074d9596506118f9903d805f833e6107bb8183610fa1565b95946118d4565b611919915060203d6020116107f2576107e48183610fa1565b5f61189a565b5091909261001b94612d5b565b503033141561185d565b61193f366116a7565b61195a6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a5a575b15611a4f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa90811561079d575f91611a30575b50156106325760405163d68f602560e01b8152925f84806119f0363433600485016121bd565b038183875af193841561079d575f94611a10575b5061074d929394612d70565b61074d939450611a29903d805f833e6107bb8183610fa1565b9392611a04565b611a49915060203d6020116107f2576107e48183610fa1565b5f6119ca565b509061001b92612d70565b503033141561198d565b34610222575f3660031901126102225760205f516020615b7e5f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ab6600435610211565b611ac1602435610211565b6084356001600160401b03811161022257611ae0903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612d7b565b34610222576040366003190112610222576004356001600160401b03811161022257611b59611b476020923690600401610371565b60243590611b5482610211565b612d88565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cdc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611db457506001600160a01b0392611dae9250611d9e915060581b600160581b600160f81b0316600160f81b17611cf7565b5460201c6001600160a01b031690565b16151590565b60028103611df457506001600160a01b0392611dae9250611de89150611ddb908416613065565b546001600160a01b031690565b6001600160a01b031690565b600303611e3457611e15611e1061050f600193611e2395611b72565b611e57565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e49575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ed881610baa565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ed8949260609260018060a01b0316825260208201528160408201520191611edb565b6040513d5f823e3d90fd5b91611f349161309d565b919080836001600160f81b03198416156120aa575b6020811015918261206d575b82612057575b506001600160a01b039050611f75611de8611d9e86611cf7565b16156104d1576001600160f81b03198316600160f81b0361200a5790611fa26020949392611fc0966131ce565b604051637aa8f17760e11b8152958694859384933360048601611efb565b039160581c6001600160a01b03165afa90811561079d575f91611fe1575090565b611ed8915060203d602011612003575b611ffb8183610fa1565b810190611ec3565b503d611ff1565b929160081b93600160f11b61203861202b61202488611e8d565b5460f01b90565b6001600160f01b03191690565b1661204857611ed894339061311a565b635b71057960e01b5f5260045ffd5b819295506120659350611bab565b925f80611f5b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6120a361209d8385611b9d565b90611e3b565b1491611f55565b92506120c45f516020615b7e5f395f51905f525460581b90565b92611f49565b906040516120d781610f6a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f4a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f820112156102225780519061218e82612140565b9261219c6040519485610fa1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ed8939260609260018060a01b03168252602082015281604082015201905f611edb565b906020611ed8928181520190610d2c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b1561224d57565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615b7e5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e45761029b9160051b8101906120f6565b6122b9565b908092918237015f815290565b60405190612305602083610fa1565b5f8252565b3d15612334573d9061231b82612140565b916123296040519384610fa1565b82523d5f602084013e565b606090565b949392919096959661237c6001600160581b03196123756123685f516020615b7e5f395f51905f525460581b90565b6001600160581b03191690565b1615612246565b6001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061246a575b61245b57856123b561240297613766565b6123d66123c0610fc2565b60018152925b6001600160a01b03166020840152565b5f516020615b7e5f395f51905f52805463ffffffff60a81b1916600160a81b1790556137cc565b6137cc565b5f5b81811061241057505050565b5f8061241d8385876122cd565b9061242d604051809381936122e9565b039082305af161243b61230a565b501561244957600101612404565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b14156123a4565b94939291906001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061252d575b61245b576124bc86613766565b6001600160a01b036124d0611d9e88611cf7565b16156124df575b505050505050565b612522956123fd6125055f516020615b7e5f395f51905f525463ffffffff9060a81c1690565b926123c660405194612518604087610fa1565b63ffffffff168552565b5f80808080806124d7565b506001600160f81b03198616600160f91b14156124af565b9060405161255281610f2f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946125a96106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806126f9575b156126ea5760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa90811561079d575f916126cb575b50156106325760405163d68f602560e01b8152965f888061263f363433600485016121bd565b0381838b5af197881561079d575f986126ab575b5061265f969798613b74565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061268b90600483016121e2565b03925af1801561079d5761269d575b50565b806107975f61023193610fa1565b61265f9798506126c4903d805f833e6107bb8183610fa1565b9796612653565b6126e4915060203d6020116107f2576107e48183610fa1565b5f612619565b50919390929461023196613b74565b50303314156125dc565b916020611ed8938181520191611edb565b356bffffffffffffffffffffffff19811692919060148210612734575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b60018103612894575060581b600160581b600160f81b0316600160f81b179061278961277f83611cf7565b5463ffffffff1690565b5f516020615b7e5f395f51905f525460a81c63ffffffff169063ffffffff80831691161461287c575b5061281b6127f4611de86127ee6127e86127e15f516020615b7e5f395f51905f525463ffffffff9060a81c1690565b9786611bd9565b90612714565b60601c90565b61280b6127ff610fc2565b63ffffffff9096168652565b6001600160a01b03166020850152565b61285560148201358201916034810135810190605481013501946014860135936034601484013593019160346014830135920190876137cc565b60048114612863575b505050565b61050f6128769160346102319501611b72565b90613fb8565b61288e9060010163ffffffff16612288565b5f6127b2565b600281036128f05750916128e1610231936128c6611de86127ee6127e860148801358801966034890135890198611bd9565b928391601482013591603401906001600160a01b0316613f27565b60346014830135920190613d69565b90919060038103612970575061296b611de861295b610231958461295660186127ee97013582016127ee603884013584019961292f61050f8787611b72565b90612950611de86129408989611bc8565b6018880135976038019691612714565b91613be1565b611bc8565b6018860135956038019491612714565b613d69565b9060048203612a04576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b03925af192831561079d575f516020615b3e5f395f51905f52936129f0575b50604080519182526001600160a01b03909216602082015290819081015b0390a1565b806107975f6129fe93610fa1565b5f6129cd565b60058203612a41576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b60068203612a7e576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b631092ef5760e11b5f5260045ffd5b929192612a9982612140565b91612aa76040519384610fa1565b829481845281830111610222578281602093845f960137010152565b60018103612aec575061269a92919060581b600160581b600160f81b0316600160f81b1761420c565b60028103612b09575061269a9291906001600160a01b0316614189565b60038103612b34575050612b2e8280612b2861050f61269a9686611b72565b93611b80565b916140db565b909160048203612bc657612b936129cd915f516020615b5e5f395f51905f5295612b6c5f516020615b7e5f395f51905f525460581b90565b612b78611d9e82611cf7565b6001600160a01b03888116911614612b99575b503691612a8d565b8361401d565b612ba5612bc091611cf7565b8054640100000000600160c01b031916640100000000179055565b5f612b8b565b60058203612c4c575f516020615b7e5f395f51905f525460581b5b612bee61209d8684611b9d565b906001600160f81b03198116600160f91b14612c24575b5050612b936129cd915f516020615b5e5f395f51905f52953691612a8d565b60081b6001600160e01b03191614612c3d575f80612c05565b6313002bdd60e31b5f5260045ffd5b60068203612a7e575f516020615b7e5f395f51905f525460581b612be1565b60405190612c7882610f6a565b5f6020838281520152565b612c97818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612d47575b81612d32575b81612d19575b50611e345760ff60f81b16600160f81b8114159081612d0f575b50612d09576001600160e01b031916612d04576001600160501b031916612d0057600190565b5f90565b505f90565b50505f90565b905015155f612cda565b6001600160f81b031916607f60f91b141590505f612cc0565b6001600160f81b031980821614159150612cba565b6001600160f81b0319811615159150612cb4565b91612d6b9161023195949361420c565b61458c565b9061269a929161436d565b60071115612d0057600190565b612e4490612e8090612da36001600160a01b03823516611de8565b90612e526020820135612e44612dc5612dbf60408601866120f6565b9061461e565b93612dd6612dbf60608301836120f6565b90608081013560a082013590612df8612dbf60c08501359460e08101906120f6565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fa1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ed3612ece5f356001600160e01b031916611e57565b612545565b80516001600160a01b0390612ee9908216611de8565b16156130565780516060906001600160a01b0390612f08908216611de8565b16600181141580613045575b15612ff95750508051612f33906001600160a01b031636903490613a32565b60408201516001600160f81b03191680612fb957506020820151612f5f906001600160a01b0316614629565b92905b15612fb157516001600160a01b03169060018214158281612f9c575b50612f8c575b825160208401f35b612f9591613afb565b5f80612f84565b6001600160a01b03908116141590505f612f7e565b825160208401fd5b6001600160f81b031990811603612fea576020820151612fe3906001600160a01b03163690613ab1565b9290612f62565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b0303612f3357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612f33576348f5c3ed60e01b5f5260045ffd5b506001600160a01b03811415612f14565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f146130e157806001146130d4576002146130be575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b9092608092611ed89694835260018060a01b0316602083015260408201528160608201520191611edb565b61313365ffffffffffff939561313f979587858561466b565b9692959198909861475a565b50911642109081156131bc575b506131a85761316061318a916020976131ce565b60405163392dffaf60e01b8152978896879586959193916001600160e01b031916600487016130ef565b03916001600160a01b03165afa90811561079d575f91611fe1575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f61314c565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c83835260408201526040815261320d606082610fa1565b519020901561328b5760a06132206139ee565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a5260426018205f603a5290565b611ed890614786565b90818060081b9160ff839260f01c166002146132ac57565b6001600160d81b031983169150565b9080601f8301121561022257816020611ed893359101612a8d565b91909161012081840312610222576132ec610fd1565b926132f682610226565b84526020820135602085015260408201356001600160401b03811161022257816133219184016132bb565b604085015260608201356001600160401b03811161022257816133459184016132bb565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161022257816133879184016132bb565b60e08501526101008201356001600160401b038111610222576133aa92016132bb565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ed8916020820151602082015261010061344261341261340060408601516101206040870152610120860190610d2c565b60608601518582036060870152610d2c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d2c565b92015190610100818403910152610d2c565b9392916134719060409286526060602087015260608601906133c1565b930152565b9291906134716020916040865260408601906133c1565b919290925f9261349d36836132d6565b916101008101916134ae83836120f6565b929093848460208110159182613669575b5050613634575b50506001600160f81b031916600160f81b145b61360e575b6001600160f81b03198616600160f81b03613574575050604051639700320360e01b815293602092859283915f91839161351b9160048401613476565b039260581c6001600160a01b03165af190811561079d57611ed8925f92613543575b50614c74565b61356691925060203d60201161356d575b61355e8183610fa1565b8101906133b2565b905f61353d565b503d613554565b909460081b93909291600160f01b61359161202b61202488611e8d565b166135ff575f6135b16135ab6020966135db99858a614a95565b94614c74565b604051630ccab7a160e01b8152979096889586948593926001600160e01b03191660048501613454565b03926001600160a01b03165af190811561079d57611ed8925f926135435750614c74565b6314b9743f60e01b5f5260045ffd5b9061361b92945085614898565b919391613629368284612a8d565b6101008401526134de565b6134d9929650613661945081935061364f90613656926120f6565b8091611bab565b939093923390612d88565b94905f6134c6565b7f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a92506136999161209d91611b9d565b145f806134bf565b5f516020615b7e5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff82116137525763ffffffff83811692168211613743576136eb9060c81c63ffffffff16610608565b10156105c9575f516020615b7e5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c16811161373a5750565b61023190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615b7e5f395f51905f525416175f516020615b7e5f395f51905f5255604051906001600160581b0319168152a1565b9294909391936137de61277f85611cf7565b5f516020615b7e5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146139d6575b506020810180516001600160a01b0316156139cd575b5f516020615b7e5f395f51905f525460a81c63ffffffff1663ffffffff61384b610608855163ffffffff1690565b9116148015906139a1575b6105c9576138a46138b19261386a87611cf7565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613990575b5050506001600160f81b03198116600160f81b0361396d5760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613912919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613959575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107975f61396793610fa1565b5f613937565b91506001600160f81b03198216600160f91b0361245b576102319160081b614e27565b61399992613d69565b5f80806138c4565b506139ae61277f86611cf7565b63ffffffff6139c4610608855163ffffffff1690565b91161015613856565b6001815261381d565b6139e89060010163ffffffff16612288565b5f613807565b60409081516139fd8382610fa1565b600681526512d95c9b995b60d21b602082015291613a1d81519182610fa1565b6005815264181719971960d91b602082015290565b91613a59925f8080946040519687958694859363d68f602560e01b85523360048601611efb565b03926001600160a01b03165af190811561079d575f91613a77575090565b611ed891503d805f833e6107bb8183610fa1565b5f9283613a5995936040519687958694859363d68f602560e01b85523360048601611efb565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613b38906024830190610d2c565b03925af1801561079d57613b495750565b5f61023191610fa1565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613bcd57600190613bc78a89613bb38489613bac828060051b8c013595613ba787610946565b613b60565b51946122cd565b90613bbf868d8d6122cd565b9490936137cc565b01613b7d565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615613d5a575b613c0090611e57565b93613c2c613c1f613c118684613bd8565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613d32576001600160a01b03841691613c5391908190611be7565b823b1561022257613c7d925f92836040518096819582946306d61fe760e41b845260048401612703565b03925af194851561079d57613ce1613d019360019361023198613d1e575b5060408051600381526001600160a01b03881660208201525f516020615b3e5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107975f613d2c93610fa1565b5f613c9b565b50909390506001600160f81b031980841603612fea576001613d0191613ce161023196613cc5565b6001600160a01b039150613bf7565b6001600160a01b0316919082158015613f1d575b61285e5760405163d60b347f60e01b8152306004820152602081602481875afa90811561079d575f91613efe575b50613e42579080613dbb92611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613de6919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613e2e575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107975f613e3c93610fa1565b5f613e0b565b81151580613edf575b613e69575b50506129eb5f516020615b3e5f395f51905f5291613e0d565b9080613e7492611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613e9f919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613ecb575b5091613e50565b806107975f613ed993610fa1565b5f613ec4565b506001600160f81b031980613ef7613c118585613bd8565b1614613e4b565b613f17915060203d6020116107f2576107e48183610fa1565b5f613dab565b5060018314613d7d565b92613f329084615132565b81613f815750505f80916040518260208201916306d61fe760e41b8352613f6b81612e4460248201604090602081525f60208201520190565b51926001600160a01b03165af15061269a61230a565b6001600160a01b039092169190823b156102225761268b925f92836040518096819582946306d61fe760e41b845260048401612703565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a91606091613fea82610ca883611d2e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f806040519361407d8561406f6020820196638a91b0e360e01b88526020602484018181520190610d2c565b03601f198101875286610fa1565b6040519361408c602086610fa1565b828552602085019583908a905f368a375193f1913d90816140d3575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016129eb565b5f91506140a8565b6140e89093929193611e57565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b1615614138575b505081546001600160a81b03191690915550565b61415692614147913691612a8d565b906001600160a01b031661401d565b50805460408051600381526001600160a01b0390921660208301525f516020615b5e5f395f51905f5291a15f8080614124565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615b5e5f395f51905f52936141fc916141f691369190612a8d565b8261401d565b50815190600282526020820152a1565b92919061423c61422a5f516020615b7e5f395f51905f525460581b90565b6001600160581b031980871691161490565b612c3d5761424c611d9e85611cf7565b9361426d61425982611cf7565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b036142b057916139376141f66129eb935f516020615b5e5f395f51905f529560018060a01b039060581c16933691612a8d565b91506001600160f81b03198216600160f91b0361245b576102319160081b6151b8565b604080519091906142e48382610fa1565b6001815291601f1901825f5b8281106142fc57505050565b8060606020809385010152016142f0565b9061431782610fe1565b6143246040519182610fa1565b8281528092614335601f1991610fe1565b01905f5b82811061434557505050565b806060602080938501015201614339565b906040611ed8925f81528160208201520190610d2c565b600881901b9291906001600160f81b03198116600160f81b03614400575090614395916153d4565b90916001600160f81b031981166143b05750611ed8916154ec565b6001600160f81b031916600160f81b036143cd57611ed891615440565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166144b857509061441d91615356565b916144266142d3565b956001600160f81b0319811661445357506144409361539e565b61444983613b53565b5261269a82613b53565b6001600160f81b031916600160f81b036143cd5761447093615377565b61447984613b53565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129eb6144ab84613b53565b5160405191829182614356565b909391906001600160f81b0319908116036143cd576144e26144e8916144dc6142d3565b9561532e565b91613ad6565b6144f485939293613b53565b526001600160f81b03198116600160f81b0361453f57501561451257565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129eb6144ab84613b53565b6001600160f81b0319166143cd576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b031680158015614614575b61285e5781156122e4575f516020615b5e5f395f51905f52926129eb926001600160f81b031982358116146145f4575b505060408051600481526001600160a01b03909216602083015290918291820190565b614605816141f69261460c94611be7565b3691612a8d565b505f806145d1565b50600181146145a1565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b949184846146ec92969593966040519061468482610f85565b5f82525f602083015260408201995f8b526146e6606084019a8b925f84525f60808701525f60a0870152606060c08701526146d760e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b52615577565b60ff806147056146ff613c118786613bd8565b60f81c90565b160361474b5761473461471f8461472f9561474494611be7565b9490955163ffffffff60e01b1690565b611e8d565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c16918215600114614778575b60d01c92565b65ffffffffffff9250614772565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615614811575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206147f4565b6148a0612c6b565b926148ab9083611bd9565b6148b491612714565b60601c602084018190525f516020615b7e5f395f51905f525460a81c63ffffffff168085526034601485810135860182810197605488013588018085019690840135959194808a01358a018086013595910193013591889161491736858e612a8d565b80519060200120913661492b908888612a8d565b805190602001203661493e908b8d612a8d565b8051602091820120604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c5059381019384526001600160581b0319989098169088015263ffffffff9390931660608701526001600160a01b0393909316608086015260a085019390935260c084019290925260e080840192909252908252906149ca61010082610fa1565b5190206149d690614786565b607489013589016014810135906034016149ef926157e5565b986149fa94886137cc565b614a048183615984565b614a0d91611b72565b614a1691611cc1565b614a1f91613fb8565b609481013501909160348201916014013590565b80548210156122e4575f5260205f2001905f90565b356001600160c01b0319811692919060088210614a63575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ed89392815281602082015201906133c1565b93929190935f926001614aa783611e8d565b015f5b8154811015614c3757614ad8614ad0614ac38385614a33565b90549060031b1c60501b90565b908160501c90565b939095614af4614aee6146ff613c118585613bd8565b60ff1690565b808403614c095750908181614b2d614b21614b1b614b1584614b4b98611c03565b90614a48565b60c01c90565b6001600160401b031690565b600901918c610100614b43614605868686611c14565b910152611ca9565b939093955b600160f01b1615614b68575b50600101939193614aaa565b604051633894f6e760e11b81529196906020908390815f81614b988f6001600160e01b03198d1660048401614a7e565b03926001600160a01b03165af191821561079d575f92614be9575b506001600160a01b038216614bd557600191614bce91614c74565b9590614b5c565b631f24c1fb60e11b5f52600487905260245ffd5b614c0291925060203d811161356d5761355e8183610fa1565b905f614bb3565b9196909491831115614c2457630760bdcf60e11b5f5260045ffd5b614c2c6122f6565b6101008b0152614b50565b505091929460ff80614c4f6146ff613c118789613bd8565b160361474b57610100614c6c6146058561473496611ed898611be7565b910152611e8d565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614ca4575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614d24575b65ffffffffffff60a01b84168015614d14575b858110908618028086189514614d03575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614ceb565b5065ffffffffffff60a01b614cda565b65ffffffffffff60a01b9450614cc7565b8054905f815581614d44575050565b5f5260205f20908101905b818110614d5a575050565b5f8155600101614d4f565b356001600160501b0319811692919060168210614d80575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f4a57614dbd91600182018155614a33565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210614e0c575050565b6001600160f01b031960029290920360031b82901b16169150565b91908035016020810190359260fe8411801561512a575b61511b576001614e4d82611e8d565b0154615102575b5f1984015f5b818110614fc4575090614f19614f128387614eb2614f03614eea61202b614ee4614ede87614f359e9f8e614ed9614f439f8f90611de86127ee6127e8614ea4614eaa9489896122cd565b90611c3f565b9a8b91611e8d565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611c6d565b90614df1565b614ef388611e8d565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611c50565b6040519586939092906001600160e01b03191660208501614ddc565b03601f198101845283610fa1565b803b15610222575f614f6992604051809481926306d61fe760e41b8352600483016121e2565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92614fb0575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107975f614fbe93610fa1565b5f614f8e565b61505f9061500a6001614fd686611e8d565b01615004614ff7614ff1614feb868d8c6122cd565b90611c31565b90614d65565b6001600160501b03191690565b90614d9b565b615024611de8611de86127ee6127e8614ea4868d8c6122cd565b615032614f12838a896122cd565b60405194918591615051916001600160e01b03198a1660208501614ddc565b03601f198101855284610fa1565b803b15610222576040516306d61fe760e41b8152925f91849182908490829061508b90600483016121e2565b03925af191821561079d576001926150ee575b505f516020615b3e5f395f51905f526150e56150c46127ee6127e8614ea4868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a101614e5a565b806107975f6150fc93610fa1565b5f61509e565b615116600161511083611e8d565b01614d35565b614e54565b63b62d956d60e01b5f5260045ffd5b508315614e3e565b5f516020615b3e5f395f51905f52916040916001600160a01b038216156151af575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615154565b9190803501916020830192356151cd82611e8d565b9260018401906001825401830361531f575f5b825481101561527457805f516020615b5e5f395f51905f5261526b89615249612e446141f68b61522d888d61521e614ad08f60019e614ac391614a33565b90508c8060a01b0316976122cd565b6040519485939092906001600160e01b03191660208501614ddc565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151e0565b5094614f359150916152bb6102319594614f196152c095615299600161511085611e8d565b87546152b09060101c6001600160a01b0316611de8565b945f198101916122cd565b61401d565b5080545f516020615b5e5f395f51905f529061530c906152eb9060101c6001600160a01b0316611de8565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b91601382111561534957823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561534957813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156153cb573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c176153495783016020810193813593846153f857505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c17615349578061540057505050565b919061544b8161430d565b925f5b82811061545a57505050565b8061548460019260051b840135840160408101358101906020823592019060208101359035615377565b61548e8389613b60565b521561549b575b0161544e565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76154e46154c98389613b60565b51604051918291858352604060208401526040830190610d2c565b0390a1615495565b91906154f78161430d565b925f5b82811061550657505050565b8061553060019260051b84013584016040810135810190602082359201906020810135903561539e565b61553a8288613b60565b526155458187613b60565b50016154fa565b9092608092611ed89594835260018060a01b0316602083015260408201528160608201520190610d2c565b91606083019060016155cc615593845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106155e35750505050505050565b6155f3614ad0614ac38385614a33565b6001600160a01b031660a089019081526080890194909161561c906001600160f01b0319168652565b61563661562f6146ff613c118985613bd8565b60ff168a52565b615644614aee8a5160ff1690565b8084036157b35750858181615669614b21614b1b614b156156be9b9c61569198611c03565b8c60c061568461460560208401948086526009018688611c14565b9101525160090191611ca9565b949094955b51600160f11b906156b0906001600160f01b03191661202b565b166001600160f01b03191690565b156156cd575b506001016155d3565b516156e0906001600160a01b0316611de8565b60206157066156f96156f9895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b81529586949093859384936157459390926001600160a01b0316906004860161554c565b03915afa90811561079d575f91615795575b506001600160a01b038116615781579060019161577960408a01918251614c74565b9052906156c4565b631f24c1fb60e11b5f52600482905260245ffd5b6157ad915060203d811161356d5761355e8183610fa1565b5f615757565b9094908311156157cc57630760bdcf60e11b5f5260045ffd5b6156be906157db365f88612a8d565b60c08b0152615696565b5f516020615b7e5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b036158a057916158459391615826611de860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611efb565b03915afa90811561079d575f91615881575b505b6001600160e01b0319166374eca2c160e11b0161587257565b6362467c7760e11b5f5260045ffd5b61589a915060203d60201161200357611ffb8183610fa1565b5f615857565b9094509091906001600160f81b03198116600160f91b0361245b576020916158ce9160081b9584308861466b565b60405163392dffaf60e01b8152929792958694938593849361590193909230906001600160e01b031916600487016130ef565b03916001600160a01b03165afa90811561079d575f91615922575b50615859565b61593b915060203d60201161200357611ffb8183610fa1565b5f61591c565b1561594857565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b61599161050f8383611b72565b9060048310156159a057505050565b602c8310615b2f576159bb611de86127ee6127e88685611bc8565b602c8201358201602c604c820191013591604c8401358401946159f56159e7613c1f613c118787613bd8565b6001600160f81b0319161590565b80615a9f575b94615a3c61296b95611de895615a41956102319b956127ee9a615a51575b615a2c611de86127ee6127e88a8a611c98565b916001600160a01b031690613be1565b611c98565b602c86013595604c019491612714565b615a9a606c8701358701615a94602c604c830192013580615a7b611de86127ee6127e88488611bd9565b93615a8f856001600160a01b038a16615132565b611c7b565b91613d69565b615a19565b5091939092956040519163ecd0596160e01b835260208380615ac960048201906002602083019252565b03816001600160a01b0389165afa92831561079d57610231986127ee9761296b97611de897615a4197615a3c955f91615b10575b50959a50959b50955095509550506159fb565b615b29915060203d6020116107f2576107e48183610fa1565b5f615afd565b50506004610231911461594156fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032",
+ "nonce": "0xe2",
+ "chainId": "0xaa36a7"
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ },
+ {
+ "hash": "0x4d2259bb7e34df8bcc26e79970e58918d8bc1196727545ac20130e6fc660c282",
+ "transactionType": "CREATE2",
+ "contractName": "KernelFactory",
+ "contractAddress": "0x4600a1e70fb9e4c9a3fec6d9105f6807adeacbe2",
+ "function": null,
+ "arguments": [
+ "0x97EBdCa9c606d493daD1bE10188Dd78cadB2a139"
+ ],
+ "transaction": {
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "gas": "0x5d17a",
+ "value": "0x0",
+ "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c0576040525600000000000000000000000097ebdca9c606d493dad1be10188dd78cadb2a139",
+ "nonce": "0xe3",
+ "chainId": "0xaa36a7"
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ },
+ {
+ "hash": "0x19f2551fa1b77002634fd5eb5cb6496327b869a998d6b8c7d8b3a26b9e96b4f0",
+ "transactionType": "CALL",
+ "contractName": "FactoryStaker",
+ "contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
+ "function": "approveFactory(address,bool)",
+ "arguments": [
+ "0x4600A1e70fB9e4C9A3feC6d9105f6807aDEACbe2",
+ "true"
+ ],
+ "transaction": {
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
+ "gas": "0xfa0a",
+ "value": "0x0",
+ "input": "0x6e7dbabb0000000000000000000000004600a1e70fb9e4c9a3fec6d9105f6807adeacbe20000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0xe4",
+ "chainId": "0xaa36a7"
+ },
+ "additionalContracts": [],
+ "isFixedGasLimit": false
+ }
+ ],
+ "receipts": [
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x9a21cf",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x47be68e002906a800851804d2f520ab6374cda01a940d973245dbbfe7f10a8d4",
+ "transactionIndex": "0x33",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0x4ec3d2",
+ "effectiveGasPrice": "0x44a3b9d2c",
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "contractAddress": null
+ },
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x9e1c42",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x4d2259bb7e34df8bcc26e79970e58918d8bc1196727545ac20130e6fc660c282",
+ "transactionIndex": "0x34",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0x3fa73",
+ "effectiveGasPrice": "0x44a3b9d2c",
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
+ "contractAddress": null
+ },
+ {
+ "status": "0x1",
+ "cumulativeGasUsed": "0x9ed149",
+ "logs": [],
+ "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "type": "0x2",
+ "transactionHash": "0x19f2551fa1b77002634fd5eb5cb6496327b869a998d6b8c7d8b3a26b9e96b4f0",
+ "transactionIndex": "0x35",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0xb507",
+ "effectiveGasPrice": "0x44a3b9d2c",
+ "from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
+ "to": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
+ "contractAddress": null
+ }
+ ],
+ "libraries": [],
+ "pending": [],
+ "returns": {},
+ "timestamp": 1733513810,
+ "chain": 11155111,
+ "commit": "06ec0da"
+}
\ No newline at end of file
diff --git a/broadcast/DeployKernel.s.sol/11155111/run-latest.json b/broadcast/DeployKernel.s.sol/11155111/run-latest.json
index 12e71c02..bb459f3c 100644
--- a/broadcast/DeployKernel.s.sol/11155111/run-latest.json
+++ b/broadcast/DeployKernel.s.sol/11155111/run-latest.json
@@ -1,10 +1,10 @@
{
"transactions": [
{
- "hash": "0x5476e320d4a6d399f6b2efc50a95cba1ee44d36cd5973d7b4866eb4bbc2ac1fd",
+ "hash": "0x47be68e002906a800851804d2f520ab6374cda01a940d973245dbbfe7f10a8d4",
"transactionType": "CREATE2",
"contractName": "Kernel",
- "contractAddress": "0xca6e20d0ba4cc864f6160dc165a0a477581b594b",
+ "contractAddress": "0x97ebdca9c606d493dad1be10188dd78cadb2a139",
"function": null,
"arguments": [
"0x0000000071727De22E5E9d8BAf0edAc6f37da032"
@@ -12,53 +12,53 @@
"transaction": {
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
- "gas": "0x650349",
+ "gas": "0x733196",
"value": "0x0",
- "input": "0x00000000000000000000000000000000000000000000000000000000000000006101403461020457601f61574438819003918201601f191683019291906001600160401b0384118385101761020957816020928492604096875283398101031261020457516001600160a01b038116810361020457306080524660a05260a082516100698161021f565b600681526005602082016512d95c9b995b60d21b81526020865161008c8161021f565b838152019264302e332e3160d81b845251902091208160c0528060e0528451917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301528482015246606082015230608082015220916101009283526101209182528051602081019063deadbeef60e01b8252600481526101108161021f565b5190516001600160581b0319918282169190601581106101ef575b505090507f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f9060581c60018060a81b03198254161790555190615509928361023b8439608051836142d7015260a051836142fa015260c0518361436c015260e05183614392015251826142b60152518181816103af015281816106d30152818161088901528181610c22015281816110020152818161132901528181611491015281816114f101528181611a1901528181611b5f0152818161259d0152612e9d0152f35b8391925060150360031b1b161680388061012b565b600080fd5b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b038211176102095760405256fe6080604052600436101561001d575b36612d585761001b612d27565b005b60003560e01c8063112d3a7d146101fd578063150b7a02146101f85780631626ba7e146101f357806319822f7c146101ee5780631f1b92e3146101e95780633659cfe6146101e45780633c3b752b146101df57806352141cd9146101da57806357b3a5f4146101d55780636e6fa0c6146101d0578063721e67f4146101cb57806384b0196e146101c65780638dd7712f146101c157806390ef8862146101bc5780639198bdf5146101b75780639517e29f146101b25780639cfd7cff146101ad578063a65d69d4146101a8578063a71763a8146101a3578063adb610a31461019e578063b8afe17d14610199578063bc197c8114610194578063c3e589781461018f578063d03c79141461018a578063d691c96414610185578063e6f3d50a14610180578063e9ae5c531461017b578063f1f7f0f914610176578063f23a6e61146101715763f2dc691d0361000e57611cec565b611c92565b611c5a565b611b2e565b61199e565b6118ba565b61186d565b611791565b61168a565b611620565b6115ec565b6114c0565b61147b565b611424565b6112f8565b6111f1565b6110d0565b610fcc565b610f2a565b610e7e565b610e21565b610d73565b610b99565b6109c2565b610849565b610691565b610371565b610311565b6102b7565b610291565b6001600160a01b0381160361021357565b600080fd5b359061022382610202565b565b9181601f84011215610213578235916001600160401b038311610213576020838186019501011161021357565b6060600319820112610213576004359160243561026e81610202565b91604435906001600160401b0382116102135761028d91600401610225565b9091565b346102135760206102ad6102a436610252565b92919091611eec565b6040519015158152f35b34610213576080366003190112610213576102d3600435610202565b6102de602435610202565b6064356001600160401b038111610213576102fd903690600401610225565b5050604051630a85bd0160e11b8152602090f35b34610213576040366003190112610213576024356001600160401b0381116102135761034f6103466020923690600401610225565b9060043561209c565b6040516001600160e01b03199091168152f35b90816101209103126102135790565b606036600319011261021357600480356001600160401b0381116102135761039c9036908301610362565b60243590604435906001600160a01b03907f00000000000000000000000000000000000000000000000000000000000000008216330361065c578084926103e66020830135613093565b6001600160f81b031990911615959093909186610632575b908461040a9392613278565b9561041c61041784611e7a565b6121db565b94159485806105f0575b6105df57602001516001600160a01b03169182169081156105ce5760019261045b61047a926000526000602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b0361052d57826104cf575b50506104be576104a89250805b6104ac575b506040519081529081906020820190565b0390f35b3490349034903490335af15038610497565b604051631a0a9b9f60e21b81528390fd5b6105269250610522916105046104fe6104f86104ed61051b95611eb3565b936060810190612207565b90611d1b565b90611e4e565b63ffffffff60e01b16600052602052604060002090565b5460ff1690565b1590565b3880610485565b8291929161059b575b5061058a576104f881606061054c930190612207565b638dd7712f60e01b916001600160e01b03199161056891611e4e565b1603610579576104a8925080610492565b60405163dbbb044b60e01b81528390fd5b604051631a0a9b9f60e21b81528490fd5b6105c8915061051b6105af61052292611eb3565b6105046104fe6105c26060880188612207565b90611d0a565b38610536565b604051631a0a9b9f60e21b81528990fd5b604051633ab3447f60e11b81528990fd5b50805163ffffffff1663ffffffff61062a6106216000805160206154e98339815191525463ffffffff9060c81c1690565b63ffffffff1690565b911610610426565b93509061040a916106526000805160206154e98339815191525460581b90565b94909192506103fe565b6040516348f5c3ed60e01b81528590fd5b6004359063ffffffff8216820361021357565b359063ffffffff8216820361021357565b6020366003190112610213576106a561066d565b6106c76106c16000805160206154e98339815191525460581b90565b60581c90565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061083f575b156108345760405163ecd0596160e01b8152600480820152911690602081602481855afa9081156107c557600091610805575b50156107f35760405163d68f602560e01b81529160008380610756363433600485016122ca565b038183865af19283156107c5576000936107ca575b506107759061341f565b803b1561021357604051630b9dfbed60e11b81529160009183918290849082906107a29060048301612306565b03925af180156107c5576107b257005b806107bf61001b9261111a565b80610ed7565b612090565b6107759193506107ec903d806000833e6107e4818361119f565b81019061226c565b929061076b565b6040516348f5c3ed60e01b8152600490fd5b610827915060203d60201161082d575b61081f818361119f565b810190612239565b3861072f565b503d610815565b505061001b9061341f565b50303314156106fc565b60203660031901126102135760043561086181610202565b61087d6106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610976575b1561096b5760405163ecd0596160e01b8152600480820152911690602081602481855afa9081156107c55760009161094c575b50156107f35760405163d68f602560e01b8152916000838061090c363433600485016122ca565b038183865af19283156107c55760009361092b575b5061077590612317565b610775919350610945903d806000833e6107e4818361119f565b9290610921565b610965915060203d60201161082d5761081f818361119f565b386108e5565b505061001b90612317565b50303314156108b2565b6001600160581b031981160361021357565b9181601f84011215610213578235916001600160401b038311610213576020808501948460051b01011161021357565b346102135760a03660031901126102135760048035906109e182610980565b602435906109ee82610202565b6001600160401b0360443581811161021357610a0d9036908401610225565b909160643581811161021357610a269036908601610225565b92909160843590811161021357610a409036908701610992565b9490966001600160581b0319610a8081610a79610a6c6000805160206154e98339815191525460581b90565b6001600160581b03191690565b161561236b565b891615610b88576001600160f81b03198916600160f81b8114159081610b79575b50610b685788610ab6610b049798999a6134e8565b610ad7610ac16111c0565b60018152925b6001600160a01b03166020840152565b6000805160206154e9833981519152805463ffffffff60a81b1916600160a81b179055613543565b613543565b60005b818110610b1057005b600080610b1e8385886123f5565b60409391610b30855180938193612411565b039082305af1610b3e612432565b5015610b4d5750600101610b07565b51636534eae560e11b81528084019182529081906020010390fd5b6040516361c4e91b60e11b81528790fd5b600160f91b1415905038610aa1565b604051631a0a9b9f60e21b81528790fd5b6080366003190112610213576004803590610bb382610980565b60243591610bc083610202565b6001600160401b039260443584811161021357610be09036908501610225565b909460643590811161021357610bf99036908601610225565b91610c166106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580610d57575b15610d4657169660405163ecd0596160e01b815260208180610c748b8201906004602083019252565b03818c5afa9081156107c557600091610d27575b5015610d165760405163d68f602560e01b81529460008680610cae3634338e85016122ca565b0381838d5af19586156107c557600096610cf7575b50610cce9596612462565b823b15610213576107a29260009283604051809681958294630b9dfbed60e11b84528301612306565b610cce9650610d10903d806000833e6107e4818361119f565b95610cc3565b6040516348f5c3ed60e01b81528790fd5b610d40915060203d60201161082d5761081f818361119f565b38610c88565b505092909361001b96929550612462565b5030331415610c4b565b6001600160e01b031981160361021357565b34610213576020366003190112610213576104a8610db5600435610d9681610d61565b600060408051610da581611132565b8281528260208201520152611fc3565b60405190610dc282611132565b80546001600160a01b0390811680845260019092015480821660208086019182526001600160f81b031960589390931b831660409687019081528651958652915190931692840192909252905116918101919091529081906060820190565b3461021357604036600319011261021357602060ff610e72600435610e4581610980565b610e5a60243591610e5583610d61565b611eb3565b9063ffffffff60e01b16600052602052604060002090565b54166040519015158152f35b34610213576020366003190112610213576020610eb4600435610ea081610202565b6000604051610eae8161114d565b52612ef1565b60405190610ec18261114d565b546001600160a01b031690819052604051908152f35b600091031261021357565b60005b838110610ef55750506000910152565b8181015183820152602001610ee5565b90602091610f1e81518092818552858086019101610ee2565b601f01601f1916010190565b3461021357600036600319011261021357610f79610f466136fb565b90604051928392600f60f81b8452610f6b60209360e0602087015260e0860190610f05565b908482036040860152610f05565b90466060840152306080840152600060a084015282820360c0840152602060605192838152019160809160005b828110610fb557505050500390f35b835185528695509381019392810192600101610fa6565b6040366003190112610213576004356001600160401b03811161021357610ff7903690600401610362565b6001600160a01b03907f0000000000000000000000000000000000000000000000000000000000000000821633036107f357602435600090815260208190526040902054606091906001906001600160a01b0316938416141590816110a0575b61107261106b826060611079940190612207565b8091611d29565b9030613842565b501561108e5761108557005b61001b91613869565b60405163f21e646b60e01b8152600490fd5b915061107961107261106b6110c66110be61106b6060880188612207565b9034896137c0565b9492505050611057565b3461021357600036600319011261021357602063ffffffff6000805160206154e98339815191525460c81c16604051908152f35b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161112d57604052565b611104565b606081019081106001600160401b0382111761112d57604052565b602081019081106001600160401b0382111761112d57604052565b604081019081106001600160401b0382111761112d57604052565b61012081019081106001600160401b0382111761112d57604052565b90601f801991011681019081106001600160401b0382111761112d57604052565b6040519061022382611168565b6040519061022382611183565b6001600160401b03811161112d5760051b60200190565b6080366003190112610213576001600160401b036004358181116102135761121d903690600401610992565b906024358381116102135736602382011215610213578060040135611241816111da565b91604091611252604051948561119f565b8084526020906024602086019160061b8401019236841161021357602401905b8382106112ba57505050505060443584811161021357611296903690600401610992565b91606435958611610213576112b261001b963690600401610992565b95909461256e565b84823603126102135782859182516112d181611168565b6112da85610680565b8152828501356112e981610202565b83820152815201910190611272565b61130136610252565b61131d6106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f0000000000000000000000000000000000000000000000000000000000000000831614158061141a575b1561140e5760405163ecd0596160e01b815260048082015291169290602081602481875afa9081156107c5576000916113ef575b50156107f35760405163d68f602560e01b815293600085806113ad363433600485016122ca565b038183885af19485156107c5576000956113ce575b5061077593949561272a565b6107759495506113e8903d806000833e6107e4818361119f565b94936113c2565b611408915060203d60201161082d5761081f818361119f565b38611386565b50509161001b9361272a565b5030331415611352565b34610213576000366003190112610213576104a860405161144481611168565b60168152756b65726e656c2e616476616e6365642e76302e332e3160501b6020820152604051918291602083526020830190610f05565b34610213576000366003190112610213576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6114c936610252565b6114e56106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806115e2575b156115d65760405163ecd0596160e01b815260048082015291169290602081602481875afa9081156107c5576000916115b7575b50156107f35760405163d68f602560e01b81529360008580611575363433600485016122ca565b038183885af19485156107c557600095611596575b50610775939495612a83565b6107759495506115b0903d806000833e6107e4818361119f565b949361158a565b6115d0915060203d60201161082d5761081f818361119f565b3861154e565b50509161001b93612a83565b503033141561151a565b3461021357600036600319011261021357602063ffffffff6000805160206154e98339815191525460a81c16604051908152f35b3461021357602036600319011261021357604061165060043561164281610980565b61164a612c1f565b50611e7a565b602082519161165e83611168565b5463ffffffff81169283815260018060a01b03928391019160201c168152835192835251166020820152f35b346102135760a0366003190112610213576116a6600435610202565b6116b1602435610202565b6001600160401b03604435818111610213576116d1903690600401610992565b5050606435818111610213576116eb903690600401610992565b505060843590811161021357611705903690600401610225565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a090920192908101919060005b828110611773575050505090565b83516001600160501b03191685529381019392810192600101611765565b3461021357602080600319360112610213576004356117af81610d61565b6117d460409160608380516117c381611132565b600081526000878201520152611ffb565b908051916117e183611132565b805460f081901b6001600160f01b031916845260101c6001600160a01b031684840152815160019182018054808352600091825286822083880197939490939092905b82821061184b576104a888888861183d818e038261119f565b818301525191829182611719565b845460501b6001600160501b0319168952978801979383019390830190611824565b346102135760203660031901126102135760206102ad600435612c38565b9060406003198301126102135760043591602435906001600160401b0382116102135761028d91600401610225565b6118c33661188b565b916001600160a01b036118d533612ef1565b541690811561198c57606060019460018414159485611975575b6118f99293613ef5565b92611965575b5050906040519060208083016020845284518091526040840191602060408360051b8701019601926000905b8382106119385786880387f35b90919293948380611954839a603f198b82030186528951610f05565b99970195949391909101910161192b565b61196e91613869565b38806118ff565b6118f9925061198536348761373c565b92506118ef565b60405163710c949760e01b8152600490fd5b60603660031901126102135760048035906119b882610980565b6001600160401b0391602435838111610213576119d89036908401610225565b93604435908111610213576119f09036908501610225565b90611a0d6106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580611b24575b15611b1457169560405163ecd0596160e01b815260208180611a6b8a8201906004602083019252565b03818b5afa9081156107c557600091611af5575b5015611ae45760405163d68f602560e01b81529360008580611aa53634338d85016122ca565b0381838c5af19485156107c557600095611ac5575b50610cce9495612cfa565b610cce9550611ade903d806000833e6107e4818361119f565b94611aba565b6040516348f5c3ed60e01b81528690fd5b611b0e915060203d60201161082d5761081f818361119f565b38611a7f565b50509261001b9592919450612cfa565b5030331415611a42565b611b373661188b565b611b536106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f00000000000000000000000000000000000000000000000000000000000000008316141580611c50575b15611c445760405163ecd0596160e01b815260048082015291169190602081602481865afa9081156107c557600091611c25575b50156107f35760405163d68f602560e01b81529260008480611be3363433600485016122ca565b038183875af19384156107c557600094611c04575b50610775929394612d0f565b610775939450611c1e903d806000833e6107e4818361119f565b9392611bf8565b611c3e915060203d60201161082d5761081f818361119f565b38611bbc565b50509061001b92612d0f565b5030331415611b88565b346102135760003660031901126102135760206000805160206154e98339815191525460581b604051906001600160581b0319168152f35b346102135760a036600319011261021357611cae600435610202565b611cb9602435610202565b6084356001600160401b03811161021357611cd8903690600401610225565b505060405163f23a6e6160e01b8152602090f35b346102135760203660031901126102135760206102ad600435612d1a565b906008116102135760040190600490565b906004116102135790600490565b909291928360041161021357831161021357600401916003190190565b906018116102135760040190601490565b906014116102135790601490565b906020116102135790602090565b909291928360011161021357831161021357600101916000190190565b909291928360141161021357831161021357601401916013190190565b906009116102135760010190600890565b909291928360091161021357831161021357600901916008190190565b906016116102135790601690565b906016116102135760020190601490565b909291928360161161021357831161021357601601916015190190565b906002116102135790600290565b90602c116102135760180190601490565b90939293848311610213578411610213578101920390565b6001600160e01b03199035818116939260048110611e6b57505050565b60040360031b82901b16169150565b6001600160581b0319166000527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f850602052604060002090565b6001600160581b0319166000527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f851602052604060002090565b90929060018103611f3b57506001600160a01b0392611f359250611f25915060581b600160581b600160f81b0316600160f81b17611e7a565b5460201c6001600160a01b031690565b16151590565b60028103611f7b57506001600160a01b0392611f359250611f6f9150611f62908416612ef1565b546001600160a01b031690565b6001600160a01b031690565b600303611fbb57611f9c611f976104fe600193611faa95611d1b565b611fc3565b01546001600160a01b031690565b6001600160a01b0390811691161490565b505050600090565b63ffffffff60e01b166000527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b602052604060002090565b63ffffffff60e01b166000527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f852602052604060002090565b90816020910312610213575161204881610d61565b90565b908060209392818452848401376000828201840152601f01601f1916010190565b612048949260609260018060a01b031682526020820152816040820152019161204b565b6040513d6000823e3d90fd5b916120a691612f18565b91906001600160f81b0319808316156121ba575b6001600160a01b0390816120d3611f6f611f2587611e7a565b16156121a8578316600160f81b03612158579060209392916120f76121159661304a565b604051637aa8f17760e11b815296879586948593336004860161206c565b039260581c165afa9081156107c55760009161212f575090565b612048915060203d602011612151575b612149818361119f565b810190612033565b503d61213f565b509060081b92600160f11b61218661217961217287611ffb565b5460f01b90565b6001600160f01b03191690565b1661219657612048933390612f99565b604051635b71057960e01b8152600490fd5b604051631a0a9b9f60e21b8152600490fd5b91506121d56000805160206154e98339815191525460581b90565b916120ba565b906040516121e881611168565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561021357018035906001600160401b0382116102135760200191813603831361021357565b90816020910312610213575180151581036102135790565b6001600160401b03811161112d57601f01601f191660200190565b602081830312610213578051906001600160401b038211610213570181601f8201121561021357805161229e81612251565b926122ac604051948561119f565b81845260208284010111610213576120489160208085019101610ee2565b916080939160018060a01b03168352602083015260606040830152806060830152806000848401376000828201840152601f01601f1916010190565b906020612048928181520190610f05565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2565b1561237257565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b6000805160206154e9833981519152805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b600052603260045260246000fd5b9082101561240c5761028d9160051b810190612207565b6123df565b908092918237016000815290565b6040519061242c8261114d565b60008252565b3d1561245d573d9061244382612251565b91612451604051938461119f565b82523d6000602084013e565b606090565b94939291906001600160581b03198616156121a8576001600160f81b03198616600160f81b811415908161251e575b5061250c5761249f866134e8565b6001600160a01b036124b3611f2588611e7a565b16156124c2575b505050505050565b61250195610aff6124e96000805160206154e98339815191525463ffffffff9060a81c1690565b92610ac76124f56111c0565b63ffffffff9095168552565b3880808080806124ba565b6040516361c4e91b60e11b8152600490fd5b600160f91b1415905038612491565b9060405161253a81611132565b82546001600160a01b039081168252600190930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946125916106c16000805160206154e98339815191525460581b90565b6001600160a01b0390337f000000000000000000000000000000000000000000000000000000000000000083161415806126de575b156126ce5760405163ecd0596160e01b8152600480820152911695906020816024818a5afa9081156107c5576000916126af575b50156107f35760405163d68f602560e01b81529660008880612621363433600485016122ca565b0381838b5af19788156107c55760009861268e575b506126429697986138e2565b803b1561021357604051630b9dfbed60e11b815291600091839182908490829061266f9060048301612306565b03925af180156107c557612681575b50565b806107bf6102239261111a565b6126429798506126a8903d806000833e6107e4818361119f565b9796612636565b6126c8915060203d60201161082d5761081f818361119f565b386125fa565b50509193909294610223966138e2565b50303314156125c6565b91602061204893818152019161204b565b6bffffffffffffffffffffffff19903581811693926014811061271b57505050565b60140360031b82901b16169150565b60018103612863575060581b600160581b600160f81b0316600160f81b17906127ee6127c7611f6f6127c16127bb6127b461277161276789611e7a565b5463ffffffff1690565b6000805160206154e983398151915290612793825463ffffffff9060a81c1690565b9063ffffffff9081168183161461284f575b50505460a81c63ffffffff1690565b9786611d57565b906126f9565b60601c90565b6127de6127d26111c0565b63ffffffff9096168652565b6001600160a01b03166020850152565b6128286014820135820191603481013581019060548101350194601486013593603460148401359301916034601483013592019087613543565b60048114612836575b505050565b6104fe6128499160346102239501611d1b565b90613bf1565b600161285c9201166123ad565b38806127a5565b600281036128bf5750916128b061022393612895611f6f6127c16127bb60148801358801966034890135890198611d57565b928391601482013591603401906001600160a01b0316613b63565b60346014830135920190613a9b565b9091906003810361293f575061293a611f6f61292a610223958461292560186127c197013582016127c160388401358401996128fe6104fe8787611d1b565b9061291f611f6f61290f8989611d46565b60188801359760380196916126f9565b91613950565b611d46565b60188601359560380194916126f9565b613a9b565b9091906004810361298057506001600160a01b031691823b156102135761266f92600092836040518096819582946306d61fe760e41b8452600484016126e8565b600581036129be57506001600160a01b031691823b156102135761266f92600092836040518096819582946306d61fe760e41b8452600484016126e8565b6006036129fa576001600160a01b031691823b156102135761266f92600092836040518096819582946306d61fe760e41b8452600484016126e8565b604051631092ef5760e11b8152600490fd5b359060208110612a1a575090565b6000199060200360031b1b1690565b919060405190612a388261114d565b819360008352116102135760206000910152565b929192612a5882612251565b91612a66604051938461119f565b829481845281830111610213578281602093846000960137010152565b92919060018403612aad5761267e935060581b600160581b600160f81b0316600160f81b17613da9565b60028403612ac85761267e93506001600160a01b0316613d5f565b90919060038403612af7575061267e92508080612aeb6104fe612af19486611d1b565b93611d29565b91613d05565b919260048103612b7d575061267e92612b4a91612b236000805160206154e98339815191525460581b90565b612b2f611f2582611e7a565b6001600160a01b03868116911614612b50575b503691612a4c565b90613c56565b612b5c612b7791611e7a565b8054640100000000600160c01b031916640100000000179055565b38612b42565b60058103612c0057506000805160206154e98339815191525460581b5b612bad612ba78386611d65565b90612a0c565b906001600160f81b03198116600160f91b14612bd5575b505061267e92612b4a913691612a4c565b60081b6001600160e01b03191614612bee573880612bc4565b6040516313002bdd60e31b8152600490fd5b6006036129fa576000805160206154e98339815191525460581b612b9a565b60405190612c2c82611168565b60006020838281520152565b612c4c818060081b918160301b9160501b90565b929091600160f81b916001600160f81b031991908216838114159081612cf0575b81612ce5575b81612cd6575b50612ccc5716908114159081612cc2575b50612cbb576001600160e01b031916612cb5576001600160501b031916612cb057600190565b600090565b50600090565b5050600090565b9050151538612c8a565b5050505050600090565b607f60f91b1415905038612c79565b838114159150612c73565b8015159150612c6d565b91612d0a91610223959493613da9565b6140fa565b9061267e9291613ef5565b60071115612cb057600190565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612d75612d706000356001600160e01b031916611fc3565b61252d565b80516001600160a01b03908190612d8d908216611f6f565b1615612edf57815160609082908190612dae906001600160a01b0316611f6f565b16600181141580612ed5575b15612e955750508251612dda91506001600160a01b03163690349061373c565b60408301516001600160f81b031990811680612e5e5750506020830151612e09906001600160a01b0316614157565b93905b15612e5657516001600160a01b0316918083169060018214159182612e4b575b5050612e3b575b825160208401f35b612e4491613869565b3880612e33565b141590503880612e2c565b835160208501fd5b03612e83576020830151612e7c906001600160a01b0316369061381b565b9390612e0c565b604051632d6a6bb760e01b8152600490fd5b03612dda57337f0000000000000000000000000000000000000000000000000000000000000000831614612dda576040516348f5c3ed60e01b8152600490fd5b5081811415612dba565b604051631cd4b64760e21b8152600490fd5b6001600160a01b031660009081526000805160206154c98339815191526020526040902090565b9182358060f81c80600014612f5e5780600114612f5157600214612f3b57600080fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b5050600160009301916000190190565b90926080926120489694835260018060a01b031660208301526040820152816060820152019161204b565b909192612fb894612fac91858585614197565b9492939196909661428b565b509065ffffffffffff809116421091821561303e575b505061302b5761300c612fe260209661304a565b60405163392dffaf60e01b8152978896879586959193916001600160e01b03191660048701612f6e565b03916001600160a01b03165afa9081156107c55760009161212f575090565b506001600160e01b031995945050505050565b16421190503880612fce565b6120489060405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c83835260408201526040815261308b81611132565b5190206142b4565b90818060081b9160ff839260f01c166002146130ab57565b6001600160d81b031983169150565b9080601f830112156102135781602061204893359101612a4c565b919061012083820312610213576130ea6111cd565b926130f481610218565b8452602081013560208501526040810135916001600160401b039283811161021357816131229184016130ba565b60408601526060820135838111610213578161313f9184016130ba565b60608601526080820135608086015260a082013560a086015260c082013560c086015260e0820135838111610213578161317a9184016130ba565b60e086015261010092838301359081116102135761319892016130ba565b90830152565b90816020910312610213575190565b80516001600160a01b03168252612048919061322b6131fb6131e961012060208501516020870152604085015190806040880152860190610f05565b60608401518582036060870152610f05565b6080830151608085015260a083015160a085015260c083015160c085015260e083015184820360e0860152610f05565b916101008092015191818403910152610f05565b93929161325c9060409286526060602087015260608601906131ad565b930152565b92919061325c6020916040865260408601906131ad565b92909260009261328836826130d5565b91610100918281019161329b8383612207565b90949093600160f81b936001600160f81b031993841685146133e4575b505050871603613345575050604051639700320360e01b8152936020928592839160009183916132eb9160048401613261565b039260581c6001600160a01b03165af19081156107c55761204892600092613314575b506147ca565b61333791925060203d60201161333e575b61332f818361119f565b81019061319e565b903861330e565b503d613325565b909460081b93909291600160f01b61336261217961217288611ffb565b166133d257600061338361337d6020966133ad99858a6145ca565b946147ca565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161323f565b03926001600160a01b03165af19081156107c5576120489260009261331457506147ca565b6040516314b9743f60e01b8152600490fd5b909195506134009398506133f9929450612207565b90886143c8565b9691929093613413858995993691612a4c565b908601523880806132b8565b6000805160206154e983398151915280549163ffffffff92600a848260a81c1601908482116134d25782851691851682116134c05760c81c841610156134ae576000805160206154e9833981519152805463ffffffff60c81b191660c89290921b63ffffffff60c81b1691909117905554818160c81c1691829160a81c16106134a55750565b610223906123ad565b604051633ab3447f60e11b8152600490fd5b60405163e60fd64760e01b8152600490fd5b634e487b7160e01b600052601160045260246000fd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88916000805160206154e98339815191528160581c6001600160581b0360a81b825416179055604051906001600160581b0319168152a1565b919390929461355461276784611e7a565b936000805160206154e983398151915294613577865463ffffffff9060a81c1690565b63ffffffff8092818084169116146136e7575b50506020820180516001600160a01b03979192916135b7918916156136de575b5460a81c63ffffffff1690565b816135c9610621865163ffffffff1690565b911614908115916136b4575b506134ae57613624613631926135ea87611e7a565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b916001858416036136a3575b5050506001600160f81b03198116600160f81b8103613687575060581c1691823b156102135761266f92600092836040518096819582946306d61fe760e41b8452600484016126e8565b909350600160f91b1415905061250c576102239160081b61494c565b6136ac92613a9b565b38808061363d565b90506136c261276787611e7a565b906136d4610621855163ffffffff1690565b91161015386135d5565b600184526135aa565b60016136f49201166123ad565b388161358a565b60405161370781611168565b600681526512d95c9b995b60d21b60208201529060405161372781611168565b6005815264302e332e3160d81b602082015290565b60405163d68f602560e01b815233600482015260248101929092526060604483015260648201839052600092839183918290849060849083908084838501378181018301849052601f01601f191681010301926001600160a01b03165af19182156107c55780926137ac57505090565b61204892503d8091833e6107e4818361119f565b600092836137e795936040519687958694859363d68f602560e01b8552336004860161206c565b03926001600160a01b03165af19081156107c557600091613806575090565b61204891503d806000833e6107e4818361119f565b60009060405192808385378338925af4913d82523d6000602084013e60203d830101604052565b60009192806040519485378338925af4913d82523d6000602084013e60203d830101604052565b6001600160a01b0316803b1561021357604051630b9dfbed60e11b8152602060048201529160009183918290849082906138a7906024830190610f05565b03925af180156107c5576138b85750565b6102239061111a565b80511561240c5760200190565b805182101561240c5760209160051b010190565b96959192939694909460005b86811061390057505050505050509050565b806139418a60019360051b85013561391781610980565b61392d84613925818c6138ce565b51938c6123f5565b90613939868b8b6123f5565b949093613543565b016138ee565b901561240c5790565b6001600160a01b03939192919084831615613a93575b61396f90611fc3565b9461399b61398e6139808385613947565b356001600160f81b03191690565b6001600160f81b03191690565b946001600160f81b031980871680613a7457505090806139bd92861693611d73565b823b15610213576139e892600092836040518096819582946306d61fe760e41b8452600484016126e8565b03925af19485156107c557613a24613a449360019361022398613a61575b505b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107bf613a6e9261111a565b38613a06565b925092505094919403612e83576001613a4491613a2461022396613a08565b849250613966565b6001600160a01b03169182158015613b59575b6128315760405163d60b347f60e01b8152306004820152602081602481875afa9081156107c557600091613b3a575b5015613b05576001600160f81b031980613afa6139808486613947565b1614613b0557505050565b80613b0f92611d73565b823b156102135761266f92600092836040518096819582946306d61fe760e41b8452600484016126e8565b613b53915060203d60201161082d5761081f818361119f565b38613add565b5060018314613aae565b919392916001600160a01b039081841615613be8575b1660008181526000805160206154c98339815191526020526040812080546001600160a01b0319166001600160a01b0390951694909417909355803b15613be4576138a79394836040518096819582946306d61fe760e41b845260206004850152602484019161204b565b8280fd5b60019350613b79565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a91606091613c2382610e5a83611eb3565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b60407f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3919392935a825195613cb687613ca86020820193638a91b0e360e01b8552602060248401526044830190610f05565b03601f19810189528861119f565b6000918291828587519a613cc98c61114d565b828c525193f1943d9081613cfc575b6020818360009352013e81516001600160a01b0390911681528415156020820152a1565b60009150613cd8565b613d15613d489194939294611fc3565b80546001600160a01b031981168255600190910180546001600160a01b03928316969194921691612b4a91369190612a4c565b5080546001600160a81b03191660ff60a01b179055565b6001600160a01b0390811660008181526000805160206154c98339815191526020526040902080546001600160a01b03198116909155909116939261267e92612b4a913691612a4c565b90929192613ddb613dc96000805160206154e98339815191525460581b90565b6001600160581b031980851691161490565b612bee57613deb611f2583611e7a565b93613e0c613df884611e7a565b8054640100000000600160c01b0319169055565b6001600160f81b03198316600160f81b8103613e45575061267e9291613e33913691612a4c565b9060581c6001600160a01b0316613c56565b600160f91b1415905061250c576102239160081b614bac565b604051613e6a81611168565b600181528060005b602080821015613e8d57906060602092828501015201613e72565b50505090565b90613e9d826111da565b613eaa604051918261119f565b8281528092613ebb601f19916111da565b019060005b828110613ecc57505050565b806060602080938501015201613ec0565b90604061204892600081528160208201520190610f05565b613f09818060081b918160301b9160501b90565b5090936001600160f81b031993600160f81b939092508416838103613f94575050613f3b908035019060208201913590565b929093168015600014613f5357505061204891614e2a565b03613f615761204891614d6d565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b94959490919080614036575090613faa91614cc1565b93909294613fb6613e5e565b971680613fdb575050613fc893614d12565b613fd1836138c1565b5261267e826138c1565b03613f6157613fe993614ce9565b613ff2846138c1565b52610223577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb7614031614024846138c1565b5160405191829182613edd565b0390a1565b919593918203613f615761406d9061406761404f613e5e565b97806140616127c16127bb8387611d57565b93611d90565b91613842565b614079879592956138c1565b52169081036140b757501561408a57565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb7614031614024846138c1565b613f61576102235760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b6001600160a01b0316908115801561414d575b61283157821561240c576001600160f81b0319813581161461412e57505050565b826001116102135761267e92612b4a9136916000190190600101612a4c565b506001821461410d565b600080604092835136810185523683823784516014810186523360601b90528260143601925af1918151913d83523d6000602085013e60203d8401019052565b848461421a926142059796949895604051916141b283611183565b61421460009b8c92838652836020870152604086019d8e52606086019c8d918583528560808901528560a0890152606060c089015260e088019286845261010089019687529063ffffffff60e01b169052565b6001600160a01b039091169052565b52614ec3565b60ff8061423361422d6139808786613947565b60f81c90565b16036142795761426261424d8461425d9561427294611d73565b9490955163ffffffff60e01b1690565b611ffb565b5460101c6001600160a01b031690565b9351929190565b60405163b32eeb6960e01b8152600490fd5b8065ffffffffffff91828160a01c169283156001146142ac575b5060d01c92565b9250386142a5565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615614341575b671901000000000000600052601a52603a526042601820906000603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220614322565b919290926143d4612c1f565b906143df9085611d57565b6143e8916126f9565b60601c602082018190526000805160206154e98339815191525460a81c63ffffffff1680835260349560148082013582018089019791959294919360548601358601808b019490880135939092878c01358801808a013593908d0192918a0135918891908d84369061445992612a4c565b80519060200120913661446d908888612a4c565b8051906020012036614480908b8d612a4c565b8051602091820120604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c5059381019384526001600160581b0319989098169088015263ffffffff9390931660608701526001600160a01b0393909316608086015260a085019390935260c084019290925260e0808401929092529082529061450c6101008261119f565b519020614518906142b4565b607489013589018d8b820135910161452f92615115565b9a61453a9488613543565b61454481836152b2565b61454d91611d1b565b61455691611e4e565b61455f91613bf1565b6094810135019293830192013590565b805482101561240c5760005260206000200190600090565b6001600160c01b031990358181169392600881106145a457505050565b60080360031b82901b16169150565b6040906120489392815281602082015201906131ad565b6000949391600186816145dc85611ffb565b016000835b614629575b5050505060ff806145fd61422d6139808789613947565b16036142795761010061462161461a856142629661204898611d73565b3691612a4c565b910152611ffb565b81979697548110156147c25761465a614652614645838561456f565b90549060031b1c60501b90565b908160501c90565b98909761467661467061422d6139808585613947565b60ff1690565b80840361479157509081816146af6146a361469d614697846146cc98611dad565b90614587565b60c01c90565b6001600160401b031690565b600901916146c161461a848484611dbe565b6101008b0152611e36565b989098975b600160f01b16156146e6575b508301836145e1565b9986614723929b60018060a01b036040918983518092633894f6e760e11b8252818b868260209c8d9760049c63ffffffff60e01b168d84016145b3565b0393165af19586156107c5578896614772575b5050841661475857505061474e8594939285926147ca565b9a919293506146dd565b51631f24c1fb60e11b81529081018c815281906020010390fd5b614789929650803d1061333e5761332f818361119f565b933880614736565b90999198908311156147af57604051630760bdcf60e11b8152600490fd5b6147b761241f565b6101008801526146d1565b9695966145e6565b6001600160a01b03818318811615606083811b848601821b9081149186901b1417176001146147fb57505050600190565b65ffffffffffff60a01b80831693906001600160d01b03198481169190831690861561485d575b8381168015614856575b87811090881802808818971461484e575b508181119082180218921716171790565b95503861483d565b508061482c565b955085614822565b805490600090600081558261487957505050565b6000526020600020918201915b82811061489257505050565b818155600101614886565b6001600160501b031990358181169392601681106148ba57505050565b60160360031b82901b16169150565b80546801000000000000000081101561112d576148eb9160018201815561456f565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701016000815290565b6001600160f01b0319903581811693926002811061493d57505050565b60020360031b82901b16169150565b90803501906020808301923560fe81118015614ba4575b614b925760018061497385611ffb565b0154614b79575b60001982019260005b848110614a9c5750614a619594614a6f949093614a459350614a3e92506149de614a2f614a16612179614a10614a0a87878e614a058e6149d6611f6f6127c16127bb6149d08989896123f5565b90611de9565b9a8b91611ffb565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6123f5565b90611e17565b90614920565b614a1f88611ffb565b9060f01c61ffff19825416179055565b6001600160a01b0316966123f5565b8091611dfa565b6040519586939092906001600160e01b0319166020850161490a565b03601f19810184528361119f565b803b15610213576040516306d61fe760e41b815291600091839182908490829061266f9060048301612306565b614af3611f6f611f6f6127c16127bb6149d0868a8e614a058f614abf8e91611ffb565b01614aed614ae0614ada614ad48888886123f5565b90611ddb565b9061489d565b6001600160501b03191690565b906148c9565b90614b02614a3e82878b6123f5565b90614b23604091614a6183519485928d63ffffffff60e01b168a850161490a565b833b15610213576000938492614b4d92519586809481936306d61fe760e41b835260048301612306565b03925af19182156107c5578492614b66575b5001614983565b806107bf614b739261111a565b38614b5f565b614b8d6001614b8786611ffb565b01614865565b61497a565b60405163b62d956d60e01b8152600490fd5b508015614963565b91908035019160209060208401933590614bc581611ffb565b92600190600185019060018254018503614caf57906000835b614c41575b50505050614c3091614c2b82614a456102239798614c086001614b87614a6198611ffb565b8754614c1f9060101c6001600160a01b0316611f6f565b946000198101916123f5565b613c56565b5080546001600160b01b0319169055565b8154811015614caa57908382614ca0614a618c614c928a614c77868e614c6f6146526146458c9f9e8e61456f565b9690506123f5565b6040519586939092906001600160e01b0319168c850161490a565b6001600160a01b0316613c56565b5001909192614bde565b614be3565b60405163013dcc8d60e31b8152600490fd5b908060141161021357813560601c928160341161021357601483013592603401916033190190565b906000928491604051958692833738935af1913d82523d6000602084013e60203d830101604052565b9092600092819594604051968792833738935af115614d41573d82523d6000602084013e60203d830101604052565b503d6000823e3d90fd5b919081101561240c5760051b81013590605e1981360301821215610213570190565b919091614d7983613e93565b9260005b818110614d8957505050565b80614d976001928486614d4b565b8035614da281610202565b614dc360208093604093614db885830183612207565b939092013590614ce9565b614dcd858b6138ce565b5215614ddc575b505001614d7d565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb791614e20614e0b858b6138ce565b51838051948594888652850152830190610f05565b0390a13880614dd4565b919091614e3683613e93565b9260005b818110614e4657505050565b80614e7c6020614e596001948688614d4b565b8035614e6481610202565b614e716040830183612207565b939092013590614d12565b614e8682886138ce565b52614e9181876138ce565b5001614e3a565b90926080926120489594835260018060a01b0316602083015260408201528160608201520190610f05565b9190606083016001936001614ee261425d845163ffffffff60e01b1690565b01936000936000958054965b878110614f0057505050505050505050565b80614f126146526146458c948661456f565b6001600160a01b031660a0880190815260808801959091614f3b906001600160f01b0319168752565b614f55614f4e61422d6139808a85613947565b60ff168952565b614f63614670895160ff1690565b8084036150dd5750868181614f886146a361469d614697614fdc9c9d614faf98611dad565b60208c018181528c60c0614fa461461a60099586018789611dbe565b910152510191611e36565b959095965b51600160f11b90614fce906001600160f01b031916612179565b166001600160f01b03191690565b15614fe9575b5001614eee565b51909150614fff906001600160a01b0316611f6f565b865161502390615016906001600160e01b03191681565b6001600160e01b03191690565b60e08701519091906001600160a01b0316916150686101008901519360c08a01516040948551808095819463184dfdbb60e11b835260209a8b9760049a8b8601614e98565b03915afa9384156107c5578b946150be575b50506001600160a01b0383166150a35750860180518b939261509b916147ca565b905238614fe2565b9051631f24c1fb60e11b815290810183815281906020010390fd5b6150d5929450803d1061333e5761332f818361119f565b91388061507a565b8391969450106000146150fc57604051630760bdcf60e11b8152600490fd5b614fdc8b9361510b3688612a29565b60c08a0152614fb4565b6000805160206154e98339815191525460009493929060581b916001600160f81b03198316600160f81b81036151d85750604051637aa8f17760e11b815293602093859390928492839261516d92306004860161206c565b039160581c6001600160a01b03165afa9081156107c5576000916151b9575b505b6001600160e01b0319166374eca2c160e11b016151a757565b6040516362467c7760e11b8152600490fd5b6151d2915060203d60201161215157612149818361119f565b3861518c565b919550929190600160f91b0361250c576020916151fb9160081b95843088614197565b60405163392dffaf60e01b8152929792958694938593849361522e93909230906001600160e01b03191660048701612f6e565b03916001600160a01b03165afa9081156107c557600091615250575b5061518e565b615269915060203d60201161215157612149818361119f565b3861524a565b1561527657565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b6152bf6104fe8383611d1b565b9060048310156152ce57505050565b602c831061545e576152e9611f6f6127c16127bb8685611d46565b602c8201358201602c604c820191013591604c84013584019461532361531561398e6139808787613947565b6001600160f81b0319161590565b806153cd575b9461536a61293a95611f6f9561536f956102239b956127c19a61537f575b61535a611f6f6127c16127bb8a8a611e25565b916001600160a01b031690613950565b611e25565b602c86013595604c0194916126f9565b6153c8606c87013587016153c2602c604c8301920135806153a9611f6f6127c16127bb8488611d57565b936153bd856001600160a01b038a1661546c565b611d90565b91613a9b565b615347565b5091939092956040519163ecd0596160e01b8352602083806153f760048201906002602083019252565b03816001600160a01b0389165afa9283156107c557610223986127c19761293a97611f6f9761536f9761536a9560009161543f575b50959a50959b5095509550955050615329565b615458915060203d60201161082d5761081f818361119f565b3861542c565b50506004610223911461526f565b61022391906001600160a01b0390818316156154bf575b166000526000805160206154c983398151915260205260406000209060018060a01b03166bffffffffffffffffffffffff60a01b825416179055565b6001925061548356fe1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b867bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032",
- "nonce": "0x53",
+ "input": "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020357602081615ddd80380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615b9e908161023f8239608051816147a9015260a051816147cc015260c0518161483c015260e05181614862015261010051816147880152610120518181816103b40152818161069d0152818161084301528181610a9f01528181610e1e01528181611136015281816112aa015281816113000152818161182d0152818161195d015281816125ac01526130090152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612eb75761001b612e86565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b12565b611af4565b611a9a565b611a64565b611936565b6117b8565b6116d6565b611689565b6115b6565b6114a5565b611439565b611407565b6112d9565b611295565b61123d565b61110f565b610ff8565b610ee9565b610dee565b610d50565b610cca565b610c6f565b610bbc565b610a1e565b610988565b61080d565b610665565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d65565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f2a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632576103ef6020820135613294565b9092919084836001600160f81b0319861615610619575b82610411939461348d565b9361043661042661042184611cf7565b6120ca565b946001600160f81b031916151590565b9384806105d8575b6105c957602001516001600160a01b031690819081156104d15760019261046f61048e925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b0361053c57826104e0575b50506104d157816104bb925b6104bf575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104aa565b631a0a9b9f60e21b5f5260045ffd5b61053592506105319161051561050f6105096104fe61052a95611d2e565b9360608101906120f6565b90611b72565b90611cc1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f80610499565b82919291610596575b506104d15761050981606061055b9301906120f6565b638dd7712f60e01b916001600160e01b03199161057791611cc1565b160361058757816104bb926104a5565b63dbbb044b60e01b5f5260045ffd5b6105c3915061052a6105aa61053192611d2e565b61051561050f6105bd60608801886120f6565b90611b61565b5f610545565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106116106085f516020615b7e5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615b7e5f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610679610641565b61069a6106945f516020615b7e5f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610803575b156107f95760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f916107ca575b50156106325760405163d68f602560e01b8152915f838061072f363433600485016121bd565b038183865af192831561079d575f936107a2575b5061074d906136a1565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061077990600483016121e2565b03925af1801561079d5761078957005b806107975f61001b93610fa1565b80610d22565b611f1f565b61074d9193506107c3903d805f833e6107bb8183610fa1565b81019061215b565b9290610743565b6107ec915060203d6020116107f2575b6107e48183610fa1565b810190612128565b5f610709565b503d6107da565b5061001b906136a1565b50303314156106cd565b60203660031901126102225760043561082581610211565b6108406106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061093c575b156109325760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f91610913575b50156106325760405163d68f602560e01b8152915f83806108d5363433600485016121bd565b038183865af192831561079d575f936108f3575b5061074d906121f3565b61074d91935061090c903d805f833e6107bb8183610fa1565b92906108e9565b61092c915060203d6020116107f2576107e48183610fa1565b5f6108af565b5061001b906121f3565b5030331415610873565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109a581610946565b6024356109b181610211565b6044356001600160401b038111610222576109d0903690600401610233565b6064939193356001600160401b038111610222576109f2903690600401610233565b91608435956001600160401b03871161022257610a1661001b973690600401610958565b969095612339565b608036600319011261022257600435610a3681610946565b602435610a4281610211565b6044356001600160401b03811161022257610a61903690600401610233565b6064356001600160401b03811161022257610a80903690600401610233565b91610a9c6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ba0575b15610b915760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa90811561079d575f91610b72575b50156106325760405163d68f602560e01b8152955f8780610b32363433600485016121bd565b0381838a5af196871561079d575f97610b52575b5061074d959697612482565b61074d969750610b6b903d805f833e6107bb8183610fa1565b9695610b46565b610b8b915060203d6020116107f2576107e48183610fa1565b5f610b0c565b50919361001b95939193612482565b5030331415610acf565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104bb610bfd600435610bdf81610baa565b5f60408051610bed81610f2f565b8281528260208201520152611e57565b600160405191610c0c83610f2f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cbe600435610c9381610946565b610ca860243591610ca383610baa565b611d2e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610cff600435610cec81610211565b5f604051610cf981610f4f565b52613065565b60405190610d0c82610f4f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610d8f610d9d610d6e6139ee565b604092919251938493600f60f81b855260e0602086015260e0850190610d2c565b908382036040850152610d2c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610dd5575050500390f35b8251845285945060209384019390920191600101610dc7565b6040366003190112610222576004356001600160401b03811161022257610e19903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632575f908152602081905260409020546001600160a01b03169060609060018314159081610eb9575b610e8e610e87826060610e959401906120f6565b8091611b80565b9030613ad6565b5015610eaa57610ea157005b61001b91613afb565b63f21e646b60e01b5f5260045ffd5b9150610e95610e8e610e87610edf610ed7610e8760608801886120f6565b903489613a8b565b9492505050610e73565b34610222575f36600319011261022257602063ffffffff5f516020615b7e5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f4a57604052565b610f1b565b602081019081106001600160401b03821117610f4a57604052565b604081019081106001600160401b03821117610f4a57604052565b61012081019081106001600160401b03821117610f4a57604052565b90601f801991011681019081106001600160401b03821117610f4a57604052565b60405190610231604083610fa1565b6040519061023161012083610fa1565b6001600160401b038111610f4a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611023903690600401610958565b602435916001600160401b038311610222573660238401121561022257826004013561104e81610fe1565b9361105c6040519586610fa1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ce575050506044356001600160401b038111610222576110a2903690600401610958565b90606435946001600160401b038611610222576110c661001b963690600401610958565b959094612587565b60408336031261022257602060409182516110e881610f6a565b6110f186610654565b81528286013561110081610211565b83820152815201920191611079565b61111836610260565b6111336106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611233575b156112285760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f91611209575b50156106325760405163d68f602560e01b8152935f85806111c9363433600485016121bd565b038183885af194851561079d575f956111e9575b5061074d939495612754565b61074d949550611202903d805f833e6107bb8183610fa1565b94936111dd565b611222915060203d6020116107f2576107e48183610fa1565b5f6111a3565b509161001b93612754565b5030331415611166565b34610222575f366003190112610222576104bb60405161125e604082610fa1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d2c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6112e236610260565b6112fd6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113fd575b156113f25760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f916113d3575b50156106325760405163d68f602560e01b8152935f8580611393363433600485016121bd565b038183885af194851561079d575f956113b3575b5061074d939495612ac3565b61074d9495506113cc903d805f833e6107bb8183610fa1565b94936113a7565b6113ec915060203d6020116107f2576107e48183610fa1565b5f61136d565b509161001b93612ac3565b5030331415611330565b34610222575f36600319011261022257602063ffffffff5f516020615b7e5f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061146960043561145b81610946565b611463612c6b565b50611cf7565b81519061147582610f6a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114c1600435610211565b6114cc602435610211565b6044356001600160401b038111610222576114eb903690600401610958565b50506064356001600160401b0381116102225761150c903690600401610958565b50506084356001600160401b0381116102225761152d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115965750505090565b82516001600160501b031916845260209384019390920191600101611589565b34610222576020366003190112610222576115f56004356115d681610baa565b6060604080516115e581610f2f565b5f81525f60208201520152611e8d565b60016040519161160483610f2f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611666576104bb858761165581880382610fa1565b604082015260405191829182611541565b825460501b6001600160501b03191684526020909301926001928301920161163d565b346102225760203660031901126102225760206102bb600435612c83565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116df366116a7565b90916001600160a01b036116f233613065565b54169182156117a95760609060018414159485611792575b611714929361436d565b92611782575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061175357505050500390f35b919360019193955060206117728192603f198a82030186528851610d2c565b9601920192018594939192611744565b61178b91613afb565b5f8061171a565b61171492506117a2363487613a32565b925061170a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117d081610946565b6024356001600160401b038111610222576117ef903690600401610233565b6044356001600160401b0381116102225761180e903690600401610233565b9061182a6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061192c575b1561191f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa90811561079d575f91611900575b50156106325760405163d68f602560e01b8152945f86806118c0363433600485016121bd565b038183895af195861561079d575f966118e0575b5061074d949596612d5b565b61074d9596506118f9903d805f833e6107bb8183610fa1565b95946118d4565b611919915060203d6020116107f2576107e48183610fa1565b5f61189a565b5091909261001b94612d5b565b503033141561185d565b61193f366116a7565b61195a6106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a5a575b15611a4f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa90811561079d575f91611a30575b50156106325760405163d68f602560e01b8152925f84806119f0363433600485016121bd565b038183875af193841561079d575f94611a10575b5061074d929394612d70565b61074d939450611a29903d805f833e6107bb8183610fa1565b9392611a04565b611a49915060203d6020116107f2576107e48183610fa1565b5f6119ca565b509061001b92612d70565b503033141561198d565b34610222575f3660031901126102225760205f516020615b7e5f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ab6600435610211565b611ac1602435610211565b6084356001600160401b03811161022257611ae0903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612d7b565b34610222576040366003190112610222576004356001600160401b03811161022257611b59611b476020923690600401610371565b60243590611b5482610211565b612d88565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cdc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611db457506001600160a01b0392611dae9250611d9e915060581b600160581b600160f81b0316600160f81b17611cf7565b5460201c6001600160a01b031690565b16151590565b60028103611df457506001600160a01b0392611dae9250611de89150611ddb908416613065565b546001600160a01b031690565b6001600160a01b031690565b600303611e3457611e15611e1061050f600193611e2395611b72565b611e57565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e49575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ed881610baa565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ed8949260609260018060a01b0316825260208201528160408201520191611edb565b6040513d5f823e3d90fd5b91611f349161309d565b919080836001600160f81b03198416156120aa575b6020811015918261206d575b82612057575b506001600160a01b039050611f75611de8611d9e86611cf7565b16156104d1576001600160f81b03198316600160f81b0361200a5790611fa26020949392611fc0966131ce565b604051637aa8f17760e11b8152958694859384933360048601611efb565b039160581c6001600160a01b03165afa90811561079d575f91611fe1575090565b611ed8915060203d602011612003575b611ffb8183610fa1565b810190611ec3565b503d611ff1565b929160081b93600160f11b61203861202b61202488611e8d565b5460f01b90565b6001600160f01b03191690565b1661204857611ed894339061311a565b635b71057960e01b5f5260045ffd5b819295506120659350611bab565b925f80611f5b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6120a361209d8385611b9d565b90611e3b565b1491611f55565b92506120c45f516020615b7e5f395f51905f525460581b90565b92611f49565b906040516120d781610f6a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f4a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f820112156102225780519061218e82612140565b9261219c6040519485610fa1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ed8939260609260018060a01b03168252602082015281604082015201905f611edb565b906020611ed8928181520190610d2c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b1561224d57565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615b7e5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e45761029b9160051b8101906120f6565b6122b9565b908092918237015f815290565b60405190612305602083610fa1565b5f8252565b3d15612334573d9061231b82612140565b916123296040519384610fa1565b82523d5f602084013e565b606090565b949392919096959661237c6001600160581b03196123756123685f516020615b7e5f395f51905f525460581b90565b6001600160581b03191690565b1615612246565b6001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061246a575b61245b57856123b561240297613766565b6123d66123c0610fc2565b60018152925b6001600160a01b03166020840152565b5f516020615b7e5f395f51905f52805463ffffffff60a81b1916600160a81b1790556137cc565b6137cc565b5f5b81811061241057505050565b5f8061241d8385876122cd565b9061242d604051809381936122e9565b039082305af161243b61230a565b501561244957600101612404565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b14156123a4565b94939291906001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061252d575b61245b576124bc86613766565b6001600160a01b036124d0611d9e88611cf7565b16156124df575b505050505050565b612522956123fd6125055f516020615b7e5f395f51905f525463ffffffff9060a81c1690565b926123c660405194612518604087610fa1565b63ffffffff168552565b5f80808080806124d7565b506001600160f81b03198616600160f91b14156124af565b9060405161255281610f2f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946125a96106945f516020615b7e5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806126f9575b156126ea5760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa90811561079d575f916126cb575b50156106325760405163d68f602560e01b8152965f888061263f363433600485016121bd565b0381838b5af197881561079d575f986126ab575b5061265f969798613b74565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061268b90600483016121e2565b03925af1801561079d5761269d575b50565b806107975f61023193610fa1565b61265f9798506126c4903d805f833e6107bb8183610fa1565b9796612653565b6126e4915060203d6020116107f2576107e48183610fa1565b5f612619565b50919390929461023196613b74565b50303314156125dc565b916020611ed8938181520191611edb565b356bffffffffffffffffffffffff19811692919060148210612734575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b60018103612894575060581b600160581b600160f81b0316600160f81b179061278961277f83611cf7565b5463ffffffff1690565b5f516020615b7e5f395f51905f525460a81c63ffffffff169063ffffffff80831691161461287c575b5061281b6127f4611de86127ee6127e86127e15f516020615b7e5f395f51905f525463ffffffff9060a81c1690565b9786611bd9565b90612714565b60601c90565b61280b6127ff610fc2565b63ffffffff9096168652565b6001600160a01b03166020850152565b61285560148201358201916034810135810190605481013501946014860135936034601484013593019160346014830135920190876137cc565b60048114612863575b505050565b61050f6128769160346102319501611b72565b90613fb8565b61288e9060010163ffffffff16612288565b5f6127b2565b600281036128f05750916128e1610231936128c6611de86127ee6127e860148801358801966034890135890198611bd9565b928391601482013591603401906001600160a01b0316613f27565b60346014830135920190613d69565b90919060038103612970575061296b611de861295b610231958461295660186127ee97013582016127ee603884013584019961292f61050f8787611b72565b90612950611de86129408989611bc8565b6018880135976038019691612714565b91613be1565b611bc8565b6018860135956038019491612714565b613d69565b9060048203612a04576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b03925af192831561079d575f516020615b3e5f395f51905f52936129f0575b50604080519182526001600160a01b03909216602082015290819081015b0390a1565b806107975f6129fe93610fa1565b5f6129cd565b60058203612a41576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b60068203612a7e576001600160a01b03831693843b15610222576129ae945f92836040518098819582946306d61fe760e41b845260048401612703565b631092ef5760e11b5f5260045ffd5b929192612a9982612140565b91612aa76040519384610fa1565b829481845281830111610222578281602093845f960137010152565b60018103612aec575061269a92919060581b600160581b600160f81b0316600160f81b1761420c565b60028103612b09575061269a9291906001600160a01b0316614189565b60038103612b34575050612b2e8280612b2861050f61269a9686611b72565b93611b80565b916140db565b909160048203612bc657612b936129cd915f516020615b5e5f395f51905f5295612b6c5f516020615b7e5f395f51905f525460581b90565b612b78611d9e82611cf7565b6001600160a01b03888116911614612b99575b503691612a8d565b8361401d565b612ba5612bc091611cf7565b8054640100000000600160c01b031916640100000000179055565b5f612b8b565b60058203612c4c575f516020615b7e5f395f51905f525460581b5b612bee61209d8684611b9d565b906001600160f81b03198116600160f91b14612c24575b5050612b936129cd915f516020615b5e5f395f51905f52953691612a8d565b60081b6001600160e01b03191614612c3d575f80612c05565b6313002bdd60e31b5f5260045ffd5b60068203612a7e575f516020615b7e5f395f51905f525460581b612be1565b60405190612c7882610f6a565b5f6020838281520152565b612c97818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612d47575b81612d32575b81612d19575b50611e345760ff60f81b16600160f81b8114159081612d0f575b50612d09576001600160e01b031916612d04576001600160501b031916612d0057600190565b5f90565b505f90565b50505f90565b905015155f612cda565b6001600160f81b031916607f60f91b141590505f612cc0565b6001600160f81b031980821614159150612cba565b6001600160f81b0319811615159150612cb4565b91612d6b9161023195949361420c565b61458c565b9061269a929161436d565b60071115612d0057600190565b612e4490612e8090612da36001600160a01b03823516611de8565b90612e526020820135612e44612dc5612dbf60408601866120f6565b9061461e565b93612dd6612dbf60608301836120f6565b90608081013560a082013590612df8612dbf60c08501359460e08101906120f6565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fa1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ed3612ece5f356001600160e01b031916611e57565b612545565b80516001600160a01b0390612ee9908216611de8565b16156130565780516060906001600160a01b0390612f08908216611de8565b16600181141580613045575b15612ff95750508051612f33906001600160a01b031636903490613a32565b60408201516001600160f81b03191680612fb957506020820151612f5f906001600160a01b0316614629565b92905b15612fb157516001600160a01b03169060018214158281612f9c575b50612f8c575b825160208401f35b612f9591613afb565b5f80612f84565b6001600160a01b03908116141590505f612f7e565b825160208401fd5b6001600160f81b031990811603612fea576020820151612fe3906001600160a01b03163690613ab1565b9290612f62565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b0303612f3357337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612f33576348f5c3ed60e01b5f5260045ffd5b506001600160a01b03811415612f14565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f146130e157806001146130d4576002146130be575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b9092608092611ed89694835260018060a01b0316602083015260408201528160608201520191611edb565b61313365ffffffffffff939561313f979587858561466b565b9692959198909861475a565b50911642109081156131bc575b506131a85761316061318a916020976131ce565b60405163392dffaf60e01b8152978896879586959193916001600160e01b031916600487016130ef565b03916001600160a01b03165afa90811561079d575f91611fe1575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f61314c565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c83835260408201526040815261320d606082610fa1565b519020901561328b5760a06132206139ee565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a5260426018205f603a5290565b611ed890614786565b90818060081b9160ff839260f01c166002146132ac57565b6001600160d81b031983169150565b9080601f8301121561022257816020611ed893359101612a8d565b91909161012081840312610222576132ec610fd1565b926132f682610226565b84526020820135602085015260408201356001600160401b03811161022257816133219184016132bb565b604085015260608201356001600160401b03811161022257816133459184016132bb565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161022257816133879184016132bb565b60e08501526101008201356001600160401b038111610222576133aa92016132bb565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ed8916020820151602082015261010061344261341261340060408601516101206040870152610120860190610d2c565b60608601518582036060870152610d2c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d2c565b92015190610100818403910152610d2c565b9392916134719060409286526060602087015260608601906133c1565b930152565b9291906134716020916040865260408601906133c1565b919290925f9261349d36836132d6565b916101008101916134ae83836120f6565b929093848460208110159182613669575b5050613634575b50506001600160f81b031916600160f81b145b61360e575b6001600160f81b03198616600160f81b03613574575050604051639700320360e01b815293602092859283915f91839161351b9160048401613476565b039260581c6001600160a01b03165af190811561079d57611ed8925f92613543575b50614c74565b61356691925060203d60201161356d575b61355e8183610fa1565b8101906133b2565b905f61353d565b503d613554565b909460081b93909291600160f01b61359161202b61202488611e8d565b166135ff575f6135b16135ab6020966135db99858a614a95565b94614c74565b604051630ccab7a160e01b8152979096889586948593926001600160e01b03191660048501613454565b03926001600160a01b03165af190811561079d57611ed8925f926135435750614c74565b6314b9743f60e01b5f5260045ffd5b9061361b92945085614898565b919391613629368284612a8d565b6101008401526134de565b6134d9929650613661945081935061364f90613656926120f6565b8091611bab565b939093923390612d88565b94905f6134c6565b7f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a92506136999161209d91611b9d565b145f806134bf565b5f516020615b7e5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff82116137525763ffffffff83811692168211613743576136eb9060c81c63ffffffff16610608565b10156105c9575f516020615b7e5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c16811161373a5750565b61023190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615b7e5f395f51905f525416175f516020615b7e5f395f51905f5255604051906001600160581b0319168152a1565b9294909391936137de61277f85611cf7565b5f516020615b7e5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146139d6575b506020810180516001600160a01b0316156139cd575b5f516020615b7e5f395f51905f525460a81c63ffffffff1663ffffffff61384b610608855163ffffffff1690565b9116148015906139a1575b6105c9576138a46138b19261386a87611cf7565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613990575b5050506001600160f81b03198116600160f81b0361396d5760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613912919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613959575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107975f61396793610fa1565b5f613937565b91506001600160f81b03198216600160f91b0361245b576102319160081b614e27565b61399992613d69565b5f80806138c4565b506139ae61277f86611cf7565b63ffffffff6139c4610608855163ffffffff1690565b91161015613856565b6001815261381d565b6139e89060010163ffffffff16612288565b5f613807565b60409081516139fd8382610fa1565b600681526512d95c9b995b60d21b602082015291613a1d81519182610fa1565b6005815264181719971960d91b602082015290565b91613a59925f8080946040519687958694859363d68f602560e01b85523360048601611efb565b03926001600160a01b03165af190811561079d575f91613a77575090565b611ed891503d805f833e6107bb8183610fa1565b5f9283613a5995936040519687958694859363d68f602560e01b85523360048601611efb565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613b38906024830190610d2c565b03925af1801561079d57613b495750565b5f61023191610fa1565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613bcd57600190613bc78a89613bb38489613bac828060051b8c013595613ba787610946565b613b60565b51946122cd565b90613bbf868d8d6122cd565b9490936137cc565b01613b7d565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615613d5a575b613c0090611e57565b93613c2c613c1f613c118684613bd8565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613d32576001600160a01b03841691613c5391908190611be7565b823b1561022257613c7d925f92836040518096819582946306d61fe760e41b845260048401612703565b03925af194851561079d57613ce1613d019360019361023198613d1e575b5060408051600381526001600160a01b03881660208201525f516020615b3e5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107975f613d2c93610fa1565b5f613c9b565b50909390506001600160f81b031980841603612fea576001613d0191613ce161023196613cc5565b6001600160a01b039150613bf7565b6001600160a01b0316919082158015613f1d575b61285e5760405163d60b347f60e01b8152306004820152602081602481875afa90811561079d575f91613efe575b50613e42579080613dbb92611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613de6919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613e2e575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107975f613e3c93610fa1565b5f613e0b565b81151580613edf575b613e69575b50506129eb5f516020615b3e5f395f51905f5291613e0d565b9080613e7492611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613e9f919060048401612703565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92613ecb575b5091613e50565b806107975f613ed993610fa1565b5f613ec4565b506001600160f81b031980613ef7613c118585613bd8565b1614613e4b565b613f17915060203d6020116107f2576107e48183610fa1565b5f613dab565b5060018314613d7d565b92613f329084615132565b81613f815750505f80916040518260208201916306d61fe760e41b8352613f6b81612e4460248201604090602081525f60208201520190565b51926001600160a01b03165af15061269a61230a565b6001600160a01b039092169190823b156102225761268b925f92836040518096819582946306d61fe760e41b845260048401612703565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a91606091613fea82610ca883611d2e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f806040519361407d8561406f6020820196638a91b0e360e01b88526020602484018181520190610d2c565b03601f198101875286610fa1565b6040519361408c602086610fa1565b828552602085019583908a905f368a375193f1913d90816140d3575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016129eb565b5f91506140a8565b6140e89093929193611e57565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b1615614138575b505081546001600160a81b03191690915550565b61415692614147913691612a8d565b906001600160a01b031661401d565b50805460408051600381526001600160a01b0390921660208301525f516020615b5e5f395f51905f5291a15f8080614124565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615b5e5f395f51905f52936141fc916141f691369190612a8d565b8261401d565b50815190600282526020820152a1565b92919061423c61422a5f516020615b7e5f395f51905f525460581b90565b6001600160581b031980871691161490565b612c3d5761424c611d9e85611cf7565b9361426d61425982611cf7565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b036142b057916139376141f66129eb935f516020615b5e5f395f51905f529560018060a01b039060581c16933691612a8d565b91506001600160f81b03198216600160f91b0361245b576102319160081b6151b8565b604080519091906142e48382610fa1565b6001815291601f1901825f5b8281106142fc57505050565b8060606020809385010152016142f0565b9061431782610fe1565b6143246040519182610fa1565b8281528092614335601f1991610fe1565b01905f5b82811061434557505050565b806060602080938501015201614339565b906040611ed8925f81528160208201520190610d2c565b600881901b9291906001600160f81b03198116600160f81b03614400575090614395916153d4565b90916001600160f81b031981166143b05750611ed8916154ec565b6001600160f81b031916600160f81b036143cd57611ed891615440565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166144b857509061441d91615356565b916144266142d3565b956001600160f81b0319811661445357506144409361539e565b61444983613b53565b5261269a82613b53565b6001600160f81b031916600160f81b036143cd5761447093615377565b61447984613b53565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129eb6144ab84613b53565b5160405191829182614356565b909391906001600160f81b0319908116036143cd576144e26144e8916144dc6142d3565b9561532e565b91613ad6565b6144f485939293613b53565b526001600160f81b03198116600160f81b0361453f57501561451257565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129eb6144ab84613b53565b6001600160f81b0319166143cd576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b031680158015614614575b61285e5781156122e4575f516020615b5e5f395f51905f52926129eb926001600160f81b031982358116146145f4575b505060408051600481526001600160a01b03909216602083015290918291820190565b614605816141f69261460c94611be7565b3691612a8d565b505f806145d1565b50600181146145a1565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b949184846146ec92969593966040519061468482610f85565b5f82525f602083015260408201995f8b526146e6606084019a8b925f84525f60808701525f60a0870152606060c08701526146d760e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b52615577565b60ff806147056146ff613c118786613bd8565b60f81c90565b160361474b5761473461471f8461472f9561474494611be7565b9490955163ffffffff60e01b1690565b611e8d565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c16918215600114614778575b60d01c92565b65ffffffffffff9250614772565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615614811575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206147f4565b6148a0612c6b565b926148ab9083611bd9565b6148b491612714565b60601c602084018190525f516020615b7e5f395f51905f525460a81c63ffffffff168085526034601485810135860182810197605488013588018085019690840135959194808a01358a018086013595910193013591889161491736858e612a8d565b80519060200120913661492b908888612a8d565b805190602001203661493e908b8d612a8d565b8051602091820120604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c5059381019384526001600160581b0319989098169088015263ffffffff9390931660608701526001600160a01b0393909316608086015260a085019390935260c084019290925260e080840192909252908252906149ca61010082610fa1565b5190206149d690614786565b607489013589016014810135906034016149ef926157e5565b986149fa94886137cc565b614a048183615984565b614a0d91611b72565b614a1691611cc1565b614a1f91613fb8565b609481013501909160348201916014013590565b80548210156122e4575f5260205f2001905f90565b356001600160c01b0319811692919060088210614a63575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ed89392815281602082015201906133c1565b93929190935f926001614aa783611e8d565b015f5b8154811015614c3757614ad8614ad0614ac38385614a33565b90549060031b1c60501b90565b908160501c90565b939095614af4614aee6146ff613c118585613bd8565b60ff1690565b808403614c095750908181614b2d614b21614b1b614b1584614b4b98611c03565b90614a48565b60c01c90565b6001600160401b031690565b600901918c610100614b43614605868686611c14565b910152611ca9565b939093955b600160f01b1615614b68575b50600101939193614aaa565b604051633894f6e760e11b81529196906020908390815f81614b988f6001600160e01b03198d1660048401614a7e565b03926001600160a01b03165af191821561079d575f92614be9575b506001600160a01b038216614bd557600191614bce91614c74565b9590614b5c565b631f24c1fb60e11b5f52600487905260245ffd5b614c0291925060203d811161356d5761355e8183610fa1565b905f614bb3565b9196909491831115614c2457630760bdcf60e11b5f5260045ffd5b614c2c6122f6565b6101008b0152614b50565b505091929460ff80614c4f6146ff613c118789613bd8565b160361474b57610100614c6c6146058561473496611ed898611be7565b910152611e8d565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614ca4575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614d24575b65ffffffffffff60a01b84168015614d14575b858110908618028086189514614d03575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614ceb565b5065ffffffffffff60a01b614cda565b65ffffffffffff60a01b9450614cc7565b8054905f815581614d44575050565b5f5260205f20908101905b818110614d5a575050565b5f8155600101614d4f565b356001600160501b0319811692919060168210614d80575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f4a57614dbd91600182018155614a33565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210614e0c575050565b6001600160f01b031960029290920360031b82901b16169150565b91908035016020810190359260fe8411801561512a575b61511b576001614e4d82611e8d565b0154615102575b5f1984015f5b818110614fc4575090614f19614f128387614eb2614f03614eea61202b614ee4614ede87614f359e9f8e614ed9614f439f8f90611de86127ee6127e8614ea4614eaa9489896122cd565b90611c3f565b9a8b91611e8d565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611c6d565b90614df1565b614ef388611e8d565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611c50565b6040519586939092906001600160e01b03191660208501614ddc565b03601f198101845283610fa1565b803b15610222575f614f6992604051809481926306d61fe760e41b8352600483016121e2565b038183855af190811561079d575f516020615b3e5f395f51905f52926129eb92614fb0575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107975f614fbe93610fa1565b5f614f8e565b61505f9061500a6001614fd686611e8d565b01615004614ff7614ff1614feb868d8c6122cd565b90611c31565b90614d65565b6001600160501b03191690565b90614d9b565b615024611de8611de86127ee6127e8614ea4868d8c6122cd565b615032614f12838a896122cd565b60405194918591615051916001600160e01b03198a1660208501614ddc565b03601f198101855284610fa1565b803b15610222576040516306d61fe760e41b8152925f91849182908490829061508b90600483016121e2565b03925af191821561079d576001926150ee575b505f516020615b3e5f395f51905f526150e56150c46127ee6127e8614ea4868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a101614e5a565b806107975f6150fc93610fa1565b5f61509e565b615116600161511083611e8d565b01614d35565b614e54565b63b62d956d60e01b5f5260045ffd5b508315614e3e565b5f516020615b3e5f395f51905f52916040916001600160a01b038216156151af575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615154565b9190803501916020830192356151cd82611e8d565b9260018401906001825401830361531f575f5b825481101561527457805f516020615b5e5f395f51905f5261526b89615249612e446141f68b61522d888d61521e614ad08f60019e614ac391614a33565b90508c8060a01b0316976122cd565b6040519485939092906001600160e01b03191660208501614ddc565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151e0565b5094614f359150916152bb6102319594614f196152c095615299600161511085611e8d565b87546152b09060101c6001600160a01b0316611de8565b945f198101916122cd565b61401d565b5080545f516020615b5e5f395f51905f529061530c906152eb9060101c6001600160a01b0316611de8565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b91601382111561534957823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561534957813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156153cb573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c176153495783016020810193813593846153f857505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c17615349578061540057505050565b919061544b8161430d565b925f5b82811061545a57505050565b8061548460019260051b840135840160408101358101906020823592019060208101359035615377565b61548e8389613b60565b521561549b575b0161544e565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76154e46154c98389613b60565b51604051918291858352604060208401526040830190610d2c565b0390a1615495565b91906154f78161430d565b925f5b82811061550657505050565b8061553060019260051b84013584016040810135810190602082359201906020810135903561539e565b61553a8288613b60565b526155458187613b60565b50016154fa565b9092608092611ed89594835260018060a01b0316602083015260408201528160608201520190610d2c565b91606083019060016155cc615593845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106155e35750505050505050565b6155f3614ad0614ac38385614a33565b6001600160a01b031660a089019081526080890194909161561c906001600160f01b0319168652565b61563661562f6146ff613c118985613bd8565b60ff168a52565b615644614aee8a5160ff1690565b8084036157b35750858181615669614b21614b1b614b156156be9b9c61569198611c03565b8c60c061568461460560208401948086526009018688611c14565b9101525160090191611ca9565b949094955b51600160f11b906156b0906001600160f01b03191661202b565b166001600160f01b03191690565b156156cd575b506001016155d3565b516156e0906001600160a01b0316611de8565b60206157066156f96156f9895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b81529586949093859384936157459390926001600160a01b0316906004860161554c565b03915afa90811561079d575f91615795575b506001600160a01b038116615781579060019161577960408a01918251614c74565b9052906156c4565b631f24c1fb60e11b5f52600482905260245ffd5b6157ad915060203d811161356d5761355e8183610fa1565b5f615757565b9094908311156157cc57630760bdcf60e11b5f5260045ffd5b6156be906157db365f88612a8d565b60c08b0152615696565b5f516020615b7e5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b036158a057916158459391615826611de860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611efb565b03915afa90811561079d575f91615881575b505b6001600160e01b0319166374eca2c160e11b0161587257565b6362467c7760e11b5f5260045ffd5b61589a915060203d60201161200357611ffb8183610fa1565b5f615857565b9094509091906001600160f81b03198116600160f91b0361245b576020916158ce9160081b9584308861466b565b60405163392dffaf60e01b8152929792958694938593849361590193909230906001600160e01b031916600487016130ef565b03916001600160a01b03165afa90811561079d575f91615922575b50615859565b61593b915060203d60201161200357611ffb8183610fa1565b5f61591c565b1561594857565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b61599161050f8383611b72565b9060048310156159a057505050565b602c8310615b2f576159bb611de86127ee6127e88685611bc8565b602c8201358201602c604c820191013591604c8401358401946159f56159e7613c1f613c118787613bd8565b6001600160f81b0319161590565b80615a9f575b94615a3c61296b95611de895615a41956102319b956127ee9a615a51575b615a2c611de86127ee6127e88a8a611c98565b916001600160a01b031690613be1565b611c98565b602c86013595604c019491612714565b615a9a606c8701358701615a94602c604c830192013580615a7b611de86127ee6127e88488611bd9565b93615a8f856001600160a01b038a16615132565b611c7b565b91613d69565b615a19565b5091939092956040519163ecd0596160e01b835260208380615ac960048201906002602083019252565b03816001600160a01b0389165afa92831561079d57610231986127ee9761296b97611de897615a4197615a3c955f91615b10575b50959a50959b50955095509550506159fb565b615b29915060203d6020116107f2576107e48183610fa1565b5f615afd565b50506004610231911461594156fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032",
+ "nonce": "0xe2",
"chainId": "0xaa36a7"
},
"additionalContracts": [],
"isFixedGasLimit": false
},
{
- "hash": "0x558b5b7a9a087a8e1a15c3062b939a50cd9f3ddc1807d3d1a6fd6294c6f88662",
+ "hash": "0x4d2259bb7e34df8bcc26e79970e58918d8bc1196727545ac20130e6fc660c282",
"transactionType": "CREATE2",
"contractName": "KernelFactory",
- "contractAddress": "0x3f95901ca906b541303048213dd5e5184462922b",
+ "contractAddress": "0x4600a1e70fb9e4c9a3fec6d9105f6807adeacbe2",
"function": null,
"arguments": [
- "0xcA6E20D0ba4cc864f6160DC165A0a477581B594B"
+ "0x97EBdCa9c606d493daD1bE10188Dd78cadB2a139"
],
"transaction": {
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
- "gas": "0x600f4",
+ "gas": "0x5d17a",
"value": "0x0",
- "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61046c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103dd908161008f823960805181818160d10152818161023401526102f00152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040818152600490600436101561001757600080fd5b600092833560e01c90816348aac39214610267575080635c60da1b1461021f5763ea6d13ac1461004657600080fd5b61004f36610352565b94919083519560209661007a86828a81019486888737868201908c820152038a8101845201826103a5565b5190209483958551917fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076875261600989527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f97602192605f60212060358601523060581b855260ff855380601586015260558520993415948b3b156101fe57505050506001916101f85785388180348c5af1156101ed57505b818652846060521561016b575b505091516001600160a01b0390931683525050f35b8082859493859483378101838152039082875af1903d156101e7573d9067ffffffffffffffff82116101d3578351916101ad601f8201601f19168801846103a5565b8252853d92013e5b156101c35738808080610156565b5163487e630960e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b506101b5565b63b12d13eb8652601cfd5b50610149565b91939a5091935034f59687156102145750610149565b63301164258652601cfd5b838234610263578160031936011261026357517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5080fd5b848334610263578260209361029d8361027f36610352565b90808a879498019788378201908982015203878101845201826103a5565b51902081517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e2076835261600985527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f6021209083528360605260ff84536035523060601b6001526015526055822091603552519060018060a01b03168152f35b9060406003198301126103a05760043567ffffffffffffffff928382116103a057806023830112156103a05781600401359384116103a057602484830101116103a057602401919060243590565b600080fd5b90601f8019910116810190811067ffffffffffffffff8211176103c757604052565b634e487b7160e01b600052604160045260246000fd000000000000000000000000ca6e20d0ba4cc864f6160dc165a0a477581b594b",
- "nonce": "0x54",
+ "input": "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c0576040525600000000000000000000000097ebdca9c606d493dad1be10188dd78cadb2a139",
+ "nonce": "0xe3",
"chainId": "0xaa36a7"
},
"additionalContracts": [],
"isFixedGasLimit": false
},
{
- "hash": "0xa461ec70b705f3614dcd7a760c7cb728de1011c6803bce226647842eaf2720c1",
+ "hash": "0x19f2551fa1b77002634fd5eb5cb6496327b869a998d6b8c7d8b3a26b9e96b4f0",
"transactionType": "CALL",
"contractName": "FactoryStaker",
"contractAddress": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
"function": "approveFactory(address,bool)",
"arguments": [
- "0x3F95901CA906B541303048213Dd5E5184462922b",
+ "0x4600A1e70fB9e4C9A3feC6d9105f6807aDEACbe2",
"true"
],
"transaction": {
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
- "gas": "0x108d1",
+ "gas": "0xfa0a",
"value": "0x0",
- "input": "0x6e7dbabb0000000000000000000000003f95901ca906b541303048213dd5e5184462922b0000000000000000000000000000000000000000000000000000000000000001",
- "nonce": "0x55",
+ "input": "0x6e7dbabb0000000000000000000000004600a1e70fb9e4c9a3fec6d9105f6807adeacbe20000000000000000000000000000000000000000000000000000000000000001",
+ "nonce": "0xe4",
"chainId": "0xaa36a7"
},
"additionalContracts": [],
@@ -68,48 +68,48 @@
"receipts": [
{
"status": "0x1",
- "cumulativeGasUsed": "0x133a75a",
+ "cumulativeGasUsed": "0x9a21cf",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
- "type": "0x0",
- "transactionHash": "0x5476e320d4a6d399f6b2efc50a95cba1ee44d36cd5973d7b4866eb4bbc2ac1fd",
- "transactionIndex": "0x85",
- "blockHash": "0x94600f6735327cd52abc0c861c6e3d7e60c9bc81d32ef6df9e466ebb85fd05c7",
- "blockNumber": "0x5cc598",
- "gasUsed": "0x492720",
- "effectiveGasPrice": "0x2925be3b1",
+ "type": "0x2",
+ "transactionHash": "0x47be68e002906a800851804d2f520ab6374cda01a940d973245dbbfe7f10a8d4",
+ "transactionIndex": "0x33",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0x4ec3d2",
+ "effectiveGasPrice": "0x44a3b9d2c",
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
- "contractAddress": "0xca6e20d0ba4cc864f6160dc165a0a477581b594b"
+ "contractAddress": null
},
{
"status": "0x1",
- "cumulativeGasUsed": "0x137c28d",
+ "cumulativeGasUsed": "0x9e1c42",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
- "type": "0x0",
- "transactionHash": "0x558b5b7a9a087a8e1a15c3062b939a50cd9f3ddc1807d3d1a6fd6294c6f88662",
- "transactionIndex": "0x86",
- "blockHash": "0x94600f6735327cd52abc0c861c6e3d7e60c9bc81d32ef6df9e466ebb85fd05c7",
- "blockNumber": "0x5cc598",
- "gasUsed": "0x41b33",
- "effectiveGasPrice": "0x2925be3b1",
+ "type": "0x2",
+ "transactionHash": "0x4d2259bb7e34df8bcc26e79970e58918d8bc1196727545ac20130e6fc660c282",
+ "transactionIndex": "0x34",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0x3fa73",
+ "effectiveGasPrice": "0x44a3b9d2c",
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0x4e59b44847b379578588920ca78fbf26c0b4956c",
- "contractAddress": "0x3f95901ca906b541303048213dd5e5184462922b"
+ "contractAddress": null
},
{
"status": "0x1",
- "cumulativeGasUsed": "0x13877a0",
+ "cumulativeGasUsed": "0x9ed149",
"logs": [],
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
- "type": "0x0",
- "transactionHash": "0xa461ec70b705f3614dcd7a760c7cb728de1011c6803bce226647842eaf2720c1",
- "transactionIndex": "0x87",
- "blockHash": "0x94600f6735327cd52abc0c861c6e3d7e60c9bc81d32ef6df9e466ebb85fd05c7",
- "blockNumber": "0x5cc598",
- "gasUsed": "0xb513",
- "effectiveGasPrice": "0x2925be3b1",
+ "type": "0x2",
+ "transactionHash": "0x19f2551fa1b77002634fd5eb5cb6496327b869a998d6b8c7d8b3a26b9e96b4f0",
+ "transactionIndex": "0x35",
+ "blockHash": "0x10469d6df60edd6edb07f5a168288721ff19ba86978c36a79a490d25e1f69e5c",
+ "blockNumber": "0x6e3f47",
+ "gasUsed": "0xb507",
+ "effectiveGasPrice": "0x44a3b9d2c",
"from": "0x9775137314fe595c943712b0b336327dfa80ae8a",
"to": "0xd703aae79538628d27099b8c4f621be4ccd142d5",
"contractAddress": null
@@ -118,7 +118,7 @@
"libraries": [],
"pending": [],
"returns": {},
- "timestamp": 1718039506,
+ "timestamp": 1733513810,
"chain": 11155111,
- "commit": "0e1c950"
+ "commit": "06ec0da"
}
\ No newline at end of file
diff --git a/lib/forge-std b/lib/forge-std
index 4513bc20..d3db4ef9 160000
--- a/lib/forge-std
+++ b/lib/forge-std
@@ -1 +1 @@
-Subproject commit 4513bc2063f23c57bee6558799584b518d387a39
+Subproject commit d3db4ef90a72b7d24aa5a2e5c649593eaef7801d
diff --git a/lib/solady b/lib/solady
index 9deb9ed3..3f2f5345 160000
--- a/lib/solady
+++ b/lib/solady
@@ -1 +1 @@
-Subproject commit 9deb9ed36a27261a8745db5b7cd7f4cdc3b1cd4e
+Subproject commit 3f2f5345261904463f5429c9031c3d2185c0f4fe
diff --git a/remappings.txt b/remappings.txt
index 03e79deb..6d024134 100644
--- a/remappings.txt
+++ b/remappings.txt
@@ -1,3 +1,4 @@
ExcessivelySafeCall/=lib/ExcessivelySafeCall/src/
forge-std/=lib/forge-std/src/
solady/=lib/solady/src/
+solady_test/=lib/solady/test/
diff --git a/src/Kernel.sol b/src/Kernel.sol
index 0b692950..7ea2fb46 100644
--- a/src/Kernel.sol
+++ b/src/Kernel.sol
@@ -17,12 +17,10 @@ import {
PassFlag,
SKIP_SIGNATURE
} from "./core/ValidationManager.sol";
-import {HookManager} from "./core/HookManager.sol";
-import {ExecutorManager} from "./core/ExecutorManager.sol";
-import {SelectorManager} from "./core/SelectorManager.sol";
import {IModule, IValidator, IHook, IExecutor, IFallback, IPolicy, ISigner} from "./interfaces/IERC7579Modules.sol";
import {EIP712} from "solady/utils/EIP712.sol";
-import {ExecLib, ExecMode, CallType, ExecType, ExecModeSelector, ExecModePayload} from "./utils/ExecLib.sol";
+import {ExecLib} from "./utils/ExecLib.sol";
+import {ExecMode, CallType, ExecType, ExecModeSelector, ExecModePayload} from "./types/Types.sol";
import {
CALLTYPE_SINGLE,
CALLTYPE_DELEGATECALL,
@@ -42,7 +40,8 @@ import {
CALLTYPE_DELEGATECALL,
CALLTYPE_SINGLE,
CALLTYPE_BATCH,
- CALLTYPE_STATIC
+ CALLTYPE_STATIC,
+ MAGIC_VALUE_SIG_REPLAYABLE
} from "./types/Constants.sol";
contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager {
@@ -152,7 +151,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager
function _domainNameAndVersion() internal pure override returns (string memory name, string memory version) {
name = "Kernel";
- version = "0.3.1";
+ version = "0.3.2";
}
receive() external payable {
@@ -321,19 +320,23 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager
if (ValidatorLib.getType(vId) == VALIDATION_TYPE_ROOT) {
vId = vs.rootValidator;
}
+ bool isReplayable = sig.length >= 32 && bytes32(sig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE;
+ if (isReplayable) {
+ sig = sig[32:];
+ }
if (address(vs.validationConfig[vId].hook) == address(0)) {
revert InvalidValidator();
}
if (ValidatorLib.getType(vId) == VALIDATION_TYPE_VALIDATOR) {
IValidator validator = ValidatorLib.getValidator(vId);
- return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash), sig);
+ return validator.isValidSignatureWithSender(msg.sender, _toWrappedHash(hash, isReplayable), sig);
} else {
PermissionId pId = ValidatorLib.getPermissionId(vId);
PassFlag permissionFlag = vs.permissionConfig[pId].permissionFlag;
if (PassFlag.unwrap(permissionFlag) & PassFlag.unwrap(SKIP_SIGNATURE) != 0) {
revert PermissionNotAlllowedForSignature();
}
- return _checkPermissionSignature(pId, msg.sender, hash, sig);
+ return _checkPermissionSignature(pId, msg.sender, hash, sig, isReplayable);
}
}
@@ -367,7 +370,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager
}
_installValidation(vId, config, validatorData, hookData);
if (selectorData.length == 4) {
- // NOTE: we don't allow configure on selector data on v3.1, but using bytes instead of bytes4 for selector data to make sure we are future proof
+ // NOTE: we don't allow configure on selector data on v3.1+, but using bytes instead of bytes4 for selector data to make sure we are future proof
_setSelector(vId, bytes4(selectorData[0:4]), true);
}
} else if (moduleType == MODULE_TYPE_EXECUTOR) {
@@ -526,7 +529,7 @@ contract Kernel is IAccount, IAccountExecute, IERC7579Account, ValidationManager
}
function accountId() external pure override returns (string memory accountImplementationId) {
- return "kernel.advanced.v0.3.1";
+ return "kernel.advanced.v0.3.2";
}
function supportsExecutionMode(ExecMode mode) external pure override returns (bool) {
diff --git a/src/core/ExecutorManager.sol b/src/core/ExecutorManager.sol
index ef2158fd..0c0591db 100644
--- a/src/core/ExecutorManager.sol
+++ b/src/core/ExecutorManager.sol
@@ -2,7 +2,7 @@
pragma solidity ^0.8.0;
-import {IHook, IExecutor} from "../interfaces/IERC7579Modules.sol";
+import {IHook, IExecutor, IModule} from "../interfaces/IERC7579Modules.sol";
import {IERC7579Account} from "../interfaces/IERC7579Account.sol";
import {ModuleLib} from "../utils/ModuleLib.sol";
import {EXECUTOR_MANAGER_STORAGE_SLOT, MODULE_TYPE_EXECUTOR} from "../types/Constants.sol";
@@ -31,7 +31,11 @@ abstract contract ExecutorManager {
function _installExecutor(IExecutor executor, bytes calldata executorData, IHook hook) internal {
_installExecutorWithoutInit(executor, hook);
- executor.onInstall(executorData);
+ if (executorData.length == 0) {
+ (bool success,) = address(executor).call(abi.encodeWithSelector(IModule.onInstall.selector, hex""));
+ } else {
+ executor.onInstall(executorData);
+ }
}
function _installExecutorWithoutInit(IExecutor executor, IHook hook) internal {
diff --git a/src/core/HookManager.sol b/src/core/HookManager.sol
index 73122a9f..4fb92fcf 100644
--- a/src/core/HookManager.sol
+++ b/src/core/HookManager.sol
@@ -34,7 +34,7 @@ abstract contract HookManager {
if (!hook.isInitialized(address(this))) {
// if hook is not installed, it should call onInstall
hook.onInstall(hookData[1:]);
- } else if (bytes1(hookData[0]) == bytes1(0xff)) {
+ } else if (hookData.length > 0 && bytes1(hookData[0]) == bytes1(0xff)) {
// 0xff means you want to explicitly call install hook
hook.onInstall(hookData[1:]);
}
diff --git a/src/core/SelectorManager.sol b/src/core/SelectorManager.sol
index 4327f1be..951c498c 100644
--- a/src/core/SelectorManager.sol
+++ b/src/core/SelectorManager.sol
@@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
import {IHook, IFallback, IModule} from "../interfaces/IERC7579Modules.sol";
import {IERC7579Account} from "../interfaces/IERC7579Account.sol";
-import {CallType} from "../utils/ExecLib.sol";
+import {CallType} from "../types/Types.sol";
import {
SELECTOR_MANAGER_STORAGE_SLOT,
CALLTYPE_DELEGATECALL,
diff --git a/src/core/ValidationManager.sol b/src/core/ValidationManager.sol
index f54758a8..3a887c2a 100644
--- a/src/core/ValidationManager.sol
+++ b/src/core/ValidationManager.sol
@@ -20,10 +20,9 @@ import {
PassFlag
} from "../utils/ValidationTypeLib.sol";
-import {CallType} from "../utils/ExecLib.sol";
import {CALLTYPE_SINGLE, MODULE_TYPE_POLICY, MODULE_TYPE_SIGNER, MODULE_TYPE_VALIDATOR} from "../types/Constants.sol";
-import {PermissionId, getValidationResult} from "../types/Types.sol";
+import {PermissionId, getValidationResult, CallType} from "../types/Types.sol";
import {_intersectValidationData} from "../utils/KernelValidationResult.sol";
import {
@@ -37,7 +36,8 @@ import {
VALIDATION_MANAGER_STORAGE_SLOT,
MAX_NONCE_INCREMENT_SIZE,
ENABLE_TYPE_HASH,
- KERNEL_WRAPPER_TYPE_HASH
+ KERNEL_WRAPPER_TYPE_HASH,
+ MAGIC_VALUE_SIG_REPLAYABLE
} from "../types/Constants.sol";
abstract contract ValidationManager is EIP712, SelectorManager, HookManager, ExecutorManager {
@@ -301,8 +301,13 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe
PackedUserOperation memory userOp = op;
bytes calldata userOpSig = op.signature;
unchecked {
+ if (userOpSig.length >= 32 && bytes32(userOpSig[0:32]) == MAGIC_VALUE_SIG_REPLAYABLE) {
+ // when replayable
+ userOpSig = op.signature[32:];
+ userOpHash = replayableUserOpHash(op, msg.sender); // NOTE : msg.sender will be entrypoint
+ }
if (vMode == VALIDATION_MODE_ENABLE) {
- (validationData, userOpSig) = _enableMode(vId, op.signature);
+ (validationData, userOpSig) = _enableMode(vId, userOpSig);
userOp.signature = userOpSig;
}
@@ -329,6 +334,58 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe
}
}
+ function replayableUserOpHash(PackedUserOperation calldata userOp, address entryPoint)
+ public
+ pure
+ returns (bytes32)
+ {
+ address sender = getSender(userOp);
+ uint256 nonce = userOp.nonce;
+ bytes32 hashInitCode = calldataKeccak(userOp.initCode);
+ bytes32 hashCallData = calldataKeccak(userOp.callData);
+ bytes32 accountGasLimits = userOp.accountGasLimits;
+ uint256 preVerificationGas = userOp.preVerificationGas;
+ bytes32 gasFees = userOp.gasFees;
+ bytes32 hashPaymasterAndData = calldataKeccak(userOp.paymasterAndData);
+
+ return keccak256(
+ abi.encode(
+ keccak256(
+ abi.encode(
+ sender,
+ nonce,
+ hashInitCode,
+ hashCallData,
+ accountGasLimits,
+ preVerificationGas,
+ gasFees,
+ hashPaymasterAndData
+ )
+ ),
+ entryPoint,
+ uint256(0)
+ )
+ );
+ }
+
+ function calldataKeccak(bytes calldata data) internal pure returns (bytes32 ret) {
+ assembly ("memory-safe") {
+ let mem := mload(0x40)
+ let len := data.length
+ calldatacopy(mem, data.offset, len)
+ ret := keccak256(mem, len)
+ }
+ }
+
+ function getSender(PackedUserOperation calldata userOp) internal pure returns (address) {
+ address data;
+ //read sender from userOp, which is first userOp member (saves 800 gas...)
+ assembly {
+ data := calldataload(userOp)
+ }
+ return address(uint160(data));
+ }
+
function _enableMode(ValidationId vId, bytes calldata packedData)
internal
returns (ValidationData validationData, bytes calldata userOpSig)
@@ -574,21 +631,60 @@ abstract contract ValidationManager is EIP712, SelectorManager, HookManager, Exe
}
}
- function _checkPermissionSignature(PermissionId pId, address caller, bytes32 hash, bytes calldata sig)
- internal
- view
- returns (bytes4)
- {
+ function _checkPermissionSignature(
+ PermissionId pId,
+ address caller,
+ bytes32 hash,
+ bytes calldata sig,
+ bool isReplayable
+ ) internal view returns (bytes4) {
(ISigner signer, ValidationData valdiationData, bytes calldata validatorSig) =
_checkSignaturePolicy(pId, caller, hash, sig);
(ValidAfter validAfter, ValidUntil validUntil,) = parseValidationData(ValidationData.unwrap(valdiationData));
if (block.timestamp < ValidAfter.unwrap(validAfter) || block.timestamp > ValidUntil.unwrap(validUntil)) {
return 0xffffffff;
}
- return signer.checkSignature(bytes32(PermissionId.unwrap(pId)), caller, _toWrappedHash(hash), validatorSig);
+ return signer.checkSignature(
+ bytes32(PermissionId.unwrap(pId)), caller, _toWrappedHash(hash, isReplayable), validatorSig
+ );
+ }
+
+ function _toWrappedHash(bytes32 hash, bool isReplayable) internal view returns (bytes32) {
+ bytes32 structHash = keccak256(abi.encode(KERNEL_WRAPPER_TYPE_HASH, hash));
+ return isReplayable ? _chainAgnosticHashTypedData(structHash) : _hashTypedData(structHash);
}
- function _toWrappedHash(bytes32 hash) internal view returns (bytes32) {
- return _hashTypedData(keccak256(abi.encode(KERNEL_WRAPPER_TYPE_HASH, hash)));
+ /// @dev Returns the EIP-712 domain separator.
+ function _buildChainAgnosticDomainSeparator() private view returns (bytes32 separator) {
+ // We will use `separator` to store the name hash to save a bit of gas.
+ bytes32 versionHash;
+ (string memory name, string memory version) = _domainNameAndVersion();
+ separator = keccak256(bytes(name));
+ versionHash = keccak256(bytes(version));
+ /// @solidity memory-safe-assembly
+ assembly {
+ let m := mload(0x40) // Load the free memory pointer.
+ mstore(m, _DOMAIN_TYPEHASH)
+ mstore(add(m, 0x20), separator) // Name hash.
+ mstore(add(m, 0x40), versionHash)
+ mstore(add(m, 0x60), 0x00) // NOTE : user chainId == 0 as eip 7702 did
+ mstore(add(m, 0x80), address())
+ separator := keccak256(m, 0xa0)
+ }
+ }
+
+ function _chainAgnosticHashTypedData(bytes32 structHash) internal view virtual returns (bytes32 digest) {
+ // we don't do cache stuff here
+ digest = _buildChainAgnosticDomainSeparator();
+ /// @solidity memory-safe-assembly
+ assembly {
+ // Compute the digest.
+ mstore(0x00, 0x1901000000000000) // Store "\x19\x01".
+ mstore(0x1a, digest) // Store the domain separator.
+ mstore(0x3a, structHash) // Store the struct hash.
+ digest := keccak256(0x18, 0x42)
+ // Restore the part of the free memory slot that was overwritten.
+ mstore(0x3a, 0)
+ }
}
}
diff --git a/src/mock/MockFallback.sol b/src/mock/MockFallback.sol
index f8fc4231..167dddab 100644
--- a/src/mock/MockFallback.sol
+++ b/src/mock/MockFallback.sol
@@ -3,7 +3,8 @@ pragma solidity ^0.8.0;
import {IERC7579Account} from "../interfaces/IERC7579Account.sol";
import {IFallback} from "../interfaces/IERC7579Modules.sol";
-import {CallType, ExecType, ExecMode, ExecLib} from "../utils/ExecLib.sol";
+import {CallType, ExecType, ExecMode} from "../types/Types.sol";
+import {ExecLib} from "../utils/ExecLib.sol";
import {EXEC_MODE_DEFAULT} from "../types/Constants.sol";
contract Callee {
@@ -63,7 +64,7 @@ contract MockFallback is IFallback {
valueStored = value;
if (isExecutor) {
IERC7579Account(msg.sender).executeFromExecutor(
- ExecLib.encodeSimpleSingle(),
+ ExecMode.wrap(bytes32(0)),
ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(Callee.calleeTest.selector))
);
}
diff --git a/src/sdk/KernelTestBase.sol b/src/sdk/KernelTestBase.sol
index d6d46cdb..4521a133 100644
--- a/src/sdk/KernelTestBase.sol
+++ b/src/sdk/KernelTestBase.sol
@@ -4,6 +4,7 @@ pragma solidity ^0.8.0;
import "../Kernel.sol";
import "../factory/KernelFactory.sol";
import "../factory/FactoryStaker.sol";
+import "solady_test/utils/TestPlus.sol";
import "forge-std/Test.sol";
import "../mock/MockValidator.sol";
import "../mock/MockPolicy.sol";
@@ -19,6 +20,7 @@ import "../core/ValidationManager.sol";
import "./TestBase/erc4337Util.sol";
import "../types/Types.sol";
import "../types/Structs.sol";
+import "solady/accounts/LibERC7579.sol";
contract MockCallee {
uint256 public value;
@@ -29,6 +31,10 @@ contract MockCallee {
value = _value;
}
+ function addValue(uint256 _value) public {
+ value += _value;
+ }
+
function emitEvent(bool shouldFail) public {
if (shouldFail) {
revert("Hello");
@@ -37,7 +43,7 @@ contract MockCallee {
}
}
-abstract contract KernelTestBase is Test {
+abstract contract KernelTestBase is TestPlus, Test {
address stakerOwner;
Kernel kernel;
KernelFactory factory;
@@ -202,7 +208,7 @@ abstract contract KernelTestBase is Test {
);
bytes32 digest =
- keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.1", address(kernel)), hash));
+ keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), hash));
return digest;
}
@@ -566,8 +572,14 @@ abstract contract KernelTestBase is Test {
}
function encodeExecute(address _to, uint256 _amount, bytes memory _data) internal view returns (bytes memory) {
+ return abi.encodeWithSelector(kernel.execute.selector, bytes32(0), ExecLib.encodeSingle(_to, _amount, _data));
+ }
+
+ function encodeBatchExecute(Execution[] memory execs) internal view returns (bytes memory) {
return abi.encodeWithSelector(
- kernel.execute.selector, ExecLib.encodeSimpleSingle(), ExecLib.encodeSingle(_to, _amount, _data)
+ kernel.execute.selector,
+ LibERC7579.encodeMode(bytes1(0x01), bytes1(0x00), bytes4(0), bytes22(0)),
+ abi.encode(execs)
);
}
@@ -988,7 +1000,7 @@ abstract contract KernelTestBase is Test {
ExecutorManager.ExecutorConfig memory config = kernel.executorConfig(mockExecutor);
assertEq(address(config.hook), withHook ? address(mockHook) : address(1));
- ExecMode mode = ExecLib.encodeSimpleSingle();
+ ExecMode mode = ExecMode.wrap(bytes32(0));
bytes memory data =
ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(MockCallee.setValue.selector, 123));
mockExecutor.sudoDoExec(IERC7579Account(kernel), mode, data);
@@ -1016,7 +1028,7 @@ abstract contract KernelTestBase is Test {
vm.expectRevert(abi.encodeWithSelector(Kernel.InvalidExecutor.selector));
vm.startPrank(address(mockExecutor));
kernel.executeFromExecutor(
- ExecLib.encodeSimpleSingle(),
+ ExecMode.wrap(bytes32(0)),
ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(MockCallee.setValue.selector, 123))
);
vm.stopPrank();
@@ -1025,7 +1037,7 @@ abstract contract KernelTestBase is Test {
function testSignatureRoot(bytes32 hash) external whenInitialized {
bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash));
bytes32 digest = keccak256(
- abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.1", address(kernel)), wrappedHash)
+ abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash)
);
bytes memory sig = _rootSignDigest(digest, true);
sig = abi.encodePacked(hex"00", sig);
@@ -1053,7 +1065,7 @@ abstract contract KernelTestBase is Test {
bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash));
bytes32 digest = keccak256(
- abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.1", address(kernel)), wrappedHash)
+ abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash)
);
bytes memory sig = _validatorSignDigest(digest, true);
sig = abi.encodePacked(hex"01", address(enabledValidator), sig);
@@ -1080,11 +1092,30 @@ abstract contract KernelTestBase is Test {
);
bytes32 wrappedHash = keccak256(abi.encode(keccak256("Kernel(bytes32 hash)"), hash));
bytes32 digest = keccak256(
- abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.1", address(kernel)), wrappedHash)
+ abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), wrappedHash)
);
bytes memory sig = _permissionSignDigest(digest, true);
sig = abi.encodePacked(hex"02", PermissionId.unwrap(enabledPermission), hex"ff", sig);
bytes4 res = kernel.isValidSignature(hash, sig);
assertEq(res, bytes4(0x1626ba7e));
}
+
+ function testExecuteBatch(uint8 length) external whenInitialized {
+ vm.startPrank(address(entrypoint));
+ ExecMode mode = ExecMode.wrap(LibERC7579.encodeMode(bytes1(0x01), bytes1(0x00), bytes4(0), bytes22(0)));
+ Execution[] memory execs = new Execution[](length);
+ uint256 sum = 0;
+ for (uint256 i = 0; i < length; i++) {
+ uint256 random = _random() % 10000;
+ sum += random;
+ execs[i] = Execution({
+ target: address(callee),
+ value: 0,
+ callData: abi.encodeWithSelector(MockCallee.addValue.selector, random)
+ });
+ }
+ bytes memory data = abi.encode(execs);
+ kernel.execute(mode, data);
+ assertEq(callee.value(), sum);
+ }
}
diff --git a/src/types/Constants.sol b/src/types/Constants.sol
index f96080e6..df9d7487 100644
--- a/src/types/Constants.sol
+++ b/src/types/Constants.sol
@@ -52,6 +52,8 @@ bytes32 constant HOOK_MANAGER_STORAGE_SLOT = 0x4605d5f70bb605094b2e761eccdc27bed
bytes32 constant VALIDATION_MANAGER_STORAGE_SLOT = 0x7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f;
bytes32 constant ERC1967_IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+bytes32 constant MAGIC_VALUE_SIG_REPLAYABLE = keccak256("kernel.replayable.signature");
+
// --- Kernel validation nonce incremental size limit ---
uint32 constant MAX_NONCE_INCREMENT_SIZE = 10;
diff --git a/src/utils/ExecLib.sol b/src/utils/ExecLib.sol
index 08485b2c..6e5cbb69 100644
--- a/src/utils/ExecLib.sol
+++ b/src/utils/ExecLib.sol
@@ -2,6 +2,7 @@
pragma solidity ^0.8.23;
import {ExecMode, CallType, ExecType, ExecModeSelector, ExecModePayload} from "../types/Types.sol";
+import {LibERC7579} from "solady/accounts/LibERC7579.sol";
import {
CALLTYPE_SINGLE,
CALLTYPE_BATCH,
@@ -29,14 +30,14 @@ library ExecLib {
// check if calltype is batch or single
if (callType == CALLTYPE_BATCH) {
// destructure executionCallData according to batched exec
- Execution[] calldata executions = decodeBatch(executionCalldata);
+ bytes32[] calldata pointers = LibERC7579.decodeBatch(executionCalldata);
// check if execType is revert or try
- if (execType == EXECTYPE_DEFAULT) returnData = execute(executions);
- else if (execType == EXECTYPE_TRY) returnData = tryExecute(executions);
+ if (execType == EXECTYPE_DEFAULT) returnData = execute(pointers);
+ else if (execType == EXECTYPE_TRY) returnData = tryExecute(pointers);
else revert("Unsupported");
} else if (callType == CALLTYPE_SINGLE) {
// destructure executionCallData according to single exec
- (address target, uint256 value, bytes calldata callData) = decodeSingle(executionCalldata);
+ (address target, uint256 value, bytes calldata callData) = LibERC7579.decodeSingle(executionCalldata);
returnData = new bytes[](1);
bool success;
// check if execType is revert or try
@@ -50,8 +51,7 @@ library ExecLib {
}
} else if (callType == CALLTYPE_DELEGATECALL) {
returnData = new bytes[](1);
- address delegate = address(bytes20(executionCalldata[0:20]));
- bytes calldata callData = executionCalldata[20:];
+ (address delegate, bytes calldata callData) = LibERC7579.decodeDelegate(executionCalldata);
bool success;
(success, returnData[0]) = executeDelegatecall(delegate, callData);
if (execType == EXECTYPE_TRY) {
@@ -66,24 +66,22 @@ library ExecLib {
}
}
- function execute(Execution[] calldata executions) internal returns (bytes[] memory result) {
- uint256 length = executions.length;
+ function execute(bytes32[] calldata pointers) internal returns (bytes[] memory result) {
+ uint256 length = pointers.length;
result = new bytes[](length);
-
for (uint256 i; i < length; i++) {
- Execution calldata _exec = executions[i];
- result[i] = execute(_exec.target, _exec.value, _exec.callData);
+ (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i);
+ result[i] = execute(target, value, data);
}
}
- function tryExecute(Execution[] calldata executions) internal returns (bytes[] memory result) {
- uint256 length = executions.length;
+ function tryExecute(bytes32[] calldata pointers) internal returns (bytes[] memory result) {
+ uint256 length = pointers.length;
result = new bytes[](length);
-
for (uint256 i; i < length; i++) {
- Execution calldata _exec = executions[i];
+ (address target, uint256 value, bytes calldata data) = LibERC7579.getExecution(pointers, i);
bool success;
- (success, result[i]) = tryExecute(_exec.target, _exec.value, _exec.callData);
+ (success, result[i]) = tryExecute(target, value, data);
if (!success) emit TryExecuteUnsuccessful(i, result[i]);
}
}
@@ -162,38 +160,12 @@ library ExecLib {
);
}
- function encodeSimpleBatch() internal pure returns (ExecMode mode) {
- mode = encode(CALLTYPE_BATCH, EXECTYPE_DEFAULT, EXEC_MODE_DEFAULT, ExecModePayload.wrap(0x00));
- }
-
- function encodeSimpleSingle() internal pure returns (ExecMode mode) {
- mode = encode(CALLTYPE_SINGLE, EXECTYPE_DEFAULT, EXEC_MODE_DEFAULT, ExecModePayload.wrap(0x00));
- }
-
function getCallType(ExecMode mode) internal pure returns (CallType calltype) {
assembly {
calltype := mode
}
}
- function decodeBatch(bytes calldata callData) internal pure returns (Execution[] calldata executionBatch) {
- /*
- * Batch Call Calldata Layout
- * Offset (in bytes) | Length (in bytes) | Contents
- * 0x0 | 0x4 | bytes4 function selector
- * 0x4 | - |
- abi.encode(IERC7579Execution.Execution[])
- */
- // solhint-disable-next-line no-inline-assembly
- assembly ("memory-safe") {
- let dataPointer := add(callData.offset, calldataload(callData.offset))
-
- // Extract the ERC7579 Executions
- executionBatch.offset := add(dataPointer, 32)
- executionBatch.length := calldataload(dataPointer)
- }
- }
-
function encodeBatch(Execution[] memory executions) internal pure returns (bytes memory callData) {
callData = abi.encode(executions);
}
diff --git a/test/ECDSAValidator.t.sol b/test/ECDSAValidator.t.sol
index 0cecfb13..0eeebb89 100644
--- a/test/ECDSAValidator.t.sol
+++ b/test/ECDSAValidator.t.sol
@@ -9,6 +9,7 @@ import {ExecLib} from "../src/utils/ExecLib.sol";
import {IHook} from "../src/interfaces/IERC7579Modules.sol";
import {ValidatorLib, ValidationId, ValidationMode, ValidationType} from "../src/utils/ValidationTypeLib.sol";
import {VALIDATION_MODE_ENABLE, VALIDATION_TYPE_VALIDATOR} from "../src/types/Constants.sol";
+import {ExecMode} from "../src/types/Types.sol";
import "forge-std/console.sol";
@@ -49,7 +50,7 @@ contract ECDSAValidatorTest is KernelTestBase {
function testExternalInteraction() external whenInitialized {
vm.startPrank(owner);
kernel.execute(
- ExecLib.encodeSimpleSingle(),
+ ExecMode.wrap(bytes32(0)),
ExecLib.encodeSingle(address(callee), 0, abi.encodeWithSelector(MockCallee.setValue.selector, 123))
);
vm.stopPrank();
@@ -103,9 +104,8 @@ contract ECDSAValidatorTest is KernelTestBase {
keccak256(abi.encodePacked(kernel.execute.selector))
)
);
- bytes32 digest = keccak256(
- abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.0-beta", address(kernel)), hash)
- );
+ bytes32 digest =
+ keccak256(abi.encodePacked("\x19\x01", _buildDomainSeparator("Kernel", "0.3.2", address(kernel)), hash));
op.signature = encodeEnableSignature(
validationConfig.hook,
validationConfig.validatorData,