Giter Club home page Giter Club logo

goevmlab's Introduction

Go evmlab

This project is inspired by EVMlab, which was written in Python. EVMlab featured a minimal "compiler", along with some tooling to view traces in a UI, and execute scripts against EVMs (parity and geth).

This is a golang rewrite from scratch of that same project, this time in go-lang to be more stable and nice to use.

Status

So far, it only contains

  • a minimal "compiler", which is not a proper compiler, but it can be used to create EVM bytecode and do some basic higher level operations.
  • Some infrastructure for writing EVM-based fuzzers

Examples

See [examples/calltree](the calltree example) to get an idea of how to use this thing, along with an analysis done using this framework.

Utilities

There are a few different utilities in this repo, based on this library.

Tracediff

Tracediff allows you to load evm (jsonl) files and find differences.

tracediff tracediff

Traceview

Traceview allows you to analyse an evm trace file

traceview

Trophy list

Bugs found via the fuzzer or via tests generated using go-evmlab in general

goevmlab's People

Contributors

0xtylerholmes avatar axic avatar chfast avatar dependabot[bot] avatar gballet avatar holiman avatar hugo-dc avatar lightclient avatar mariusvanderwijden avatar namiloh avatar prestonvanloon avatar ritzdorf avatar s1na avatar samwilsn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

goevmlab's Issues

Blockhash difference in state tests

So basically Geth, Besu and OE all return 0x0 on BLOCKHASH(0x831fc01b15af74fc30c) while Nethermind returns Keccak(0x831fc01b15af74fc30c).

Netherminds Blockhash provider:
https://github.com/NethermindEth/nethermind/blob/master/src/Nethermind/Nethermind.Evm.Test/TestBlockhashProvider.cs
https://github.com/NethermindEth/nethermind/blob/master/src/Nethermind/Ethereum.Test.Base/TestBlockhashProvider.cs

The state test documentation also states that
" Since the data of the blockchain is not given, the opcode BLOCKHASH could not return the hashes of the corresponding blocks. Therefore we define the hash of block number n to be SHA256("n")."
https://www.ethdocs.org/en/latest/contracts-and-transactions/ethereum-tests/state_tests/index.html (first paragraph)

Geth replaces the function correctly in state tests (https://github.com/ethereum/go-ethereum/blob/71c37d82adaa2b69ea98ce0c5505489d6b711c1e/tests/vm_test_util.go#L157) but I think it is not patched in the evm binary.

Test ``` { "nethermind-caller": { "env": { "currentCoinbase": "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", "currentDifficulty": "0x20000", "currentGasLimit": "0x26e1f476fe1e22", "currentNumber": "0x1", "currentTimestamp": "0x3e8", "previousHash": "0x0000000000000000000000000000000000000000000000000000000000000000" }, "pre": { "0x00000000000000000000000000000000000000aa": { "code": "0x6000600060006000600060bb612d28f1", "storage": {}, "balance": "0x5", "nonce": "0x0" }, "0x00000000000000000000000000000000000000bb": { "code": "0x690831fc01b15af74fc30c40805260006000f3", "storage": {}, "balance": "0x5", "nonce": "0x0" }, "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { "code": "0x", "storage": {}, "balance": "0xffffffff", "nonce": "0x0" } }, "transaction": { "gasPrice": "0x1", "nonce": "0x0", "to": "0x00000000000000000000000000000000000000AA", "data": [ "0x" ], "gasLimit": [ "0x7a1200" ], "value": [ "0x01" ], "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8" }, "out": "0x", "post": { "Istanbul": [ { "hash": "0000000000000000000000000000000000000000000000000000000000000000", "logs": "0000000000000000000000000000000000000000000000000000000000000000", "indexes": { "data": 0, "gas": 0, "value": 0 } } ] } } } ```
Geth output Geth:
~/go/src/github.com/ethereum/go-ethereum/build/bin/evm --json --nomemory statetest test.json
{"pc":0,"op":96,"gas":"0x79bff8","gasCost":"0x3","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":2,"op":96,"gas":"0x79bff5","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":4,"op":96,"gas":"0x79bff2","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":6,"op":96,"gas":"0x79bfef","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":8,"op":96,"gas":"0x79bfec","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":10,"op":96,"gas":"0x79bfe9","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":12,"op":97,"gas":"0x79bfe6","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xbb"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH2","error":""}
{"pc":15,"op":241,"gas":"0x79bfe3","gasCost":"0x2fe4","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xbb","0x2d28"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"CALL","error":""}
{"pc":0,"op":105,"gas":"0x2d28","gasCost":"0x3","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"PUSH10","error":""}
{"pc":11,"op":64,"gas":"0x2d25","gasCost":"0x14","memory":"0x","memSize":0,"stack":["0x831fc01b15af74fc30c"],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"BLOCKHASH","error":""}
{"pc":12,"op":128,"gas":"0x2d11","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0"],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"DUP1","error":""}
{"pc":13,"op":82,"gas":"0x2d0e","gasCost":"0x6","memory":"0x","memSize":32,"stack":["0x0","0x0"],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"MSTORE","error":""}
{"pc":14,"op":96,"gas":"0x2d08","gasCost":"0x3","memory":"0x","memSize":32,"stack":[],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"PUSH1","error":""}
{"pc":16,"op":96,"gas":"0x2d05","gasCost":"0x3","memory":"0x","memSize":32,"stack":["0x0"],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"PUSH1","error":""}
{"pc":18,"op":243,"gas":"0x2d02","gasCost":"0x0","memory":"0x","memSize":32,"stack":["0x0","0x0"],"returnStack":[],"returnData":null,"depth":2,"refund":0,"opName":"RETURN","error":""}
{"pc":16,"op":0,"gas":"0x79bd01","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x1"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"STOP","error":""}
{"output":"","gasUsed":"0x2f7","time":234049}
{"stateRoot": "aeadb62508a708210e49bbde6840e63ea913fa65b566dd7fc3bf26157a5ee44f"}
[
  {
    "name": "nethermind-caller",
    "pass": false,
    "fork": "Istanbul",
    "error": "post state root mismatch: got aeadb62508a708210e49bbde6840e63ea913fa65b566dd7fc3bf26157a5ee44f, want 0000000000000000000000000000000000000000000000000000000000000000"
  }
]
Nethermind output Nethermind:
~/ethereum/nethermind/nethtest -i test.json
{"pc":0,"op":96,"gas":"0x79bff8","gasCost":"0x3","memory":"0x","memSize":0,"stack":[],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":2,"op":96,"gas":"0x79bff5","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":4,"op":96,"gas":"0x79bff2","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0"],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":6,"op":96,"gas":"0x79bfef","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0"],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":8,"op":96,"gas":"0x79bfec","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0"],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":10,"op":96,"gas":"0x79bfe9","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0"],"depth":1,"refund":0,"opname":"PUSH1","error":""}
{"pc":12,"op":97,"gas":"0x79bfe6","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xbb"],"depth":1,"refund":0,"opname":"PUSH2","error":""}
{"pc":15,"op":241,"gas":"0x79bfe3","gasCost":"0x2fe4","memory":"0x","memSize":0,"stack":["0x0","0x0","0x0","0x0","0x0","0xbb","0x2d28"],"depth":1,"refund":0,"opname":"CALL","error":""}
{"pc":0,"op":105,"gas":"0x2d28","gasCost":"0x3","memory":"0x","memSize":0,"stack":[],"depth":2,"refund":0,"opname":"PUSH10","error":""}
{"pc":11,"op":64,"gas":"0x2d25","gasCost":"0x14","memory":"0x","memSize":0,"stack":["0x831fc01b15af74fc30c"],"depth":2,"refund":0,"opname":"BLOCKHASH","error":""}
{"pc":12,"op":128,"gas":"0x2d11","gasCost":"0x3","memory":"0x","memSize":0,"stack":["0xc23afaf993bef633220c94fba7cf577103b120a2701d597660dfbab0720a8ab4"],"depth":2,"refund":0,"opname":"DUP1","error":""}
{"pc":13,"op":82,"gas":"0x2d0e","gasCost":"0x2d0e","memory":"0x","memSize":0,"stack":["0xc23afaf993bef633220c94fba7cf577103b120a2701d597660dfbab0720a8ab4","0xc23afaf993bef633220c94fba7cf577103b120a2701d597660dfbab0720a8ab4"],"depth":2,"refund":0,"opname":"MSTORE","error":"gas uint64 overflow"}
{"output":"0x","gasUsed":"0x2ff9","time":3}
{"stateRoot":"0xde9086cdde32b9293313af622ef8553330f85a7a955a4e4a5a7413c25ccf1c19"}
[
  {
    "name": "nethermind-caller_d0g0v0",
    "pass": false,
    "fork": "Istanbul"
  }
]

Provide better call stack context

The traceview shows either NA or the current executing address.
traceview

However, it would be better to show the ful context. For example

origin: N/A
 1.CREATE -> N/A
 2. CALL: 0x234234...
 3. SCALL -> 0x234234

Crash in minimizer

martin@mediaNUK:~/go/src/github.com/holiman/goevmlab/cmd/minimizer$ ./minimizer --geth ~/workspace/evm --nethermind ~/workspace/nethtest ~/go/src/github.com/holiman/goevmlab/cmd/generic-fuzz
er/save-0053/00000053-naivefuzz-1.json                                                                                                                                                        
INFO [12-03|12:44:58.468] Mutating gas                             value=4,000,000                                                                                                            
INFO [12-03|12:44:59.008] Change ok                                                                                                                                                           
INFO [12-03|12:44:59.008] Mutating gas                             value=2,000,000                                                                                                            
INFO [12-03|12:44:59.566] Change ok                                                                                                                                                           
INFO [12-03|12:44:59.566] Mutating gas                             value=1,000,000                                                                                                            
INFO [12-03|12:45:00.113] Change ok                                                                                                                                                           
INFO [12-03|12:45:00.114] Mutating gas                             value=500,000                                                                                                              
INFO [12-03|12:45:00.660] Change ok                                                                                                                                                           
INFO [12-03|12:45:00.660] Mutating gas                             value=250,000                                                                                                              
INFO [12-03|12:45:01.196] Change ok                                                                                                                                                           
INFO [12-03|12:45:01.197] Mutating gas                             value=125,000                                                                                                              
INFO [12-03|12:45:01.740] Change ok                                                                                                                                                           
INFO [12-03|12:45:01.740] Mutating gas                             value=62500                                                                                                                
INFO [12-03|12:45:02.274] Change ok                                                                                                                                                           
INFO [12-03|12:45:02.275] Mutating gas                             value=31250                                                                                                                
INFO [12-03|12:45:02.807] Change ok                                                                                                                                                           
INFO [12-03|12:45:02.807] Mutating gas                             value=15625                                                                                                                
panic: no stateroot found                                                                                                                                                                                                                                                                                                                                                                   
goroutine 1 [running]:                                                                                                                                                                        
main.startFuzzer.func2()                                                                                                                                                                      
        /home/martin/go/src/github.com/holiman/goevmlab/cmd/minimizer/main.go:158 +0x1ad                                                                                                      
main.startFuzzer.func3(0x3d09)                                                                                                                                                                
        /home/martin/go/src/github.com/holiman/goevmlab/cmd/minimizer/main.go:175 +0xd0                                                                                                       sort.Search(0x8defa0?, 0xc0004c58d0)                                                                                                                                                          
        /usr/local/go/src/sort/search.go:65 +0x48                                                                                                                                             
main.startFuzzer(0xc0003f2400)                                                                                                                                                                
        /home/martin/go/src/github.com/holiman/goevmlab/cmd/minimizer/main.go:172 +0x39c                                                                                                      
github.com/urfave/cli/v2.(*Command).Run(0xc0003fe780, 0xc0003f2400, {0xc000024180, 0x6, 0x6})                                                                                                 
        /home/martin/go/pkg/mod/github.com/urfave/cli/[email protected]/command.go:271 +0xaab                                                                                                        
github.com/urfave/cli/v2.(*App).RunContext(0xc0001fe5a0, {0xa4ea10?, 0xc0000260a8}, {0xc000024180, 0x6, 0x6})                                                                                         /home/martin/go/pkg/mod/github.com/urfave/cli/[email protected]/app.go:329 +0x665                                                                                                            
github.com/urfave/cli/v2.(*App).Run(...)                                                                                                                                                      
        /home/martin/go/pkg/mod/github.com/urfave/cli/[email protected]/app.go:306                                                                                                                   
main.main()                                                                                                                                                                                   
        /home/martin/go/src/github.com/holiman/goevmlab/cmd/minimizer/main.go:57 +0x99                                                                                                        
martin@mediaNUK:~/go/src/github.com/holiman/goevmlab/cm

Besu/geth consensus issue (EIP-2929)

Not sure what's amiss here, just dumping for later investigation. cc @shemnon @MariusVanDerWijden

diff:

diff: 
geth: {"pc":33,"op":80,"gas":"0x1059","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x2"],"returnStack":[],"returnData":null,"depth":3,"refund":0,"opName":"POP","error":""}
besu: {"pc":33,"op":80,"gas":"0x889","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x2"],"returnStack":[],"returnData":null,"depth":3,"refund":0,"opName":"POP","error":""}
output files:  ./geth-output-0.jsonl ./besu-output-0.jsonl
closing testCh
Possible consensus error!
File: /tmp/00000003-storagefuzz-0.json

Same stateroot

martin@mediaNUK:~$ tail ./geth-output-0.jsonl  ./besu-output-0.jsonl
==> ./geth-output-0.jsonl <==
{"pc":15,"op":96,"gas":"0x3715e","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":17,"op":96,"gas":"0x3715b","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x1"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":19,"op":85,"gas":"0x37158","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x1","0x1"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"SSTORE","error":""}
{"pc":20,"op":96,"gas":"0x31b04","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":22,"op":84,"gas":"0x31b01","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x2"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"SLOAD","error":""}
{"pc":23,"op":80,"gas":"0x312cd","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0xc"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"POP","error":""}
{"pc":24,"op":96,"gas":"0x312cb","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":26,"op":96,"gas":"0x312c8","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":28,"op":243,"gas":"0x312c5","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"RETURN","error":""}
{"stateRoot":"0x04c0e714d75f4399650f26b8fed22717e153a824342efd8a8988f8e47f5ef709"}

==> ./besu-output-0.jsonl <==
{"pc":15,"op":96,"gas":"0x3715e","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":17,"op":96,"gas":"0x3715b","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x1"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":19,"op":85,"gas":"0x37158","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x1","0x1"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"SSTORE","error":""}
{"pc":20,"op":96,"gas":"0x31b04","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":22,"op":84,"gas":"0x31b01","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x2"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"SLOAD","error":""}
{"pc":23,"op":80,"gas":"0x312cd","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0xc"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"POP","error":""}
{"pc":24,"op":96,"gas":"0x312cb","gasCost":"0x0","memory":"0x","memSize":0,"stack":[],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":26,"op":96,"gas":"0x312c8","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"PUSH1","error":""}
{"pc":28,"op":243,"gas":"0x312c5","gasCost":"0x0","memory":"0x","memSize":0,"stack":["0x0","0x0"],"returnStack":[],"returnData":null,"depth":1,"refund":0,"opName":"RETURN","error":""}
{"stateRoot":"0x04c0e714d75f4399650f26b8fed22717e153a824342efd8a8988f8e47f5ef709"}

file

{"00000003-storagefuzz-0":{"env":{"currentCoinbase":"b94f5374fce5edbc8e2a8697c15331677e6ebf0b","currentDifficulty":"0x20000","currentGasLimit":"0x26e1f476fe1e22","currentNumber":"0x1","currentTimestamp":"0x3e8","previousHash":"0x0000000000000000000000000000000000000000000000000000000000000000"},"pre":{"0x00000000000000000000000000000000000000f1":{"code":"0x6000600060006000600060fa5af15060016001556002545060006000f3","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000002":"0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000005":"0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000006":"0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000a":"0x0000000000000000000000000000000000000000000000000000000000000012","0x000000000000000000000000000000000000000000000000000000000000000c":"0x0000000000000000000000000000000000000000000000000000000000000011","0x000000000000000000000000000000000000000000000000000000000000000d":"0x000000000000000000000000000000000000000000000000000000000000000b"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f2":{"code":"0x7f60025450600160045560006003556003545060095450600060015560026002556000527f60075450600160035560035450600260045560016004556006545060095450606020527e600455600260005560005450600160045560606000536002600153605460026040527f53605060035360606004536001600553606060065360016007536055600853606060527f606009536000600a536060600b536002600c536055600d536060600e536002606080527f0f5360546010536050601153606060125360006013536060601453600060155360a052606060c05360fd60c153606060c253601660c353605360c453606060c553601760c653606060c753600060c85360f360c95360ca60006000f060006000600060006000855af150506000600060006000600060f75af150600060006000600060fa5af450600160005560006004557f6001600155606060005360006001536060600253600060035360f360045360056000526060602053600060215360f36022536000602360006000f560006000600060006000855af1505060006003556004545060006000f3","storage":{"0x0000000000000000000000000000000000000000000000000000000000000001":"0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000002":"0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000003":"0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000004":"0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000005":"0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000000000000000000000000000000000000000000005"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f3":{"code":"0x60026002556000600060006000600060f55af25060006000f3","storage":{"0x0000000000000000000000000000000000000000000000000000000000000001":"0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000002":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004":"0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000006":"0x0000000000000000000000000000000000000000000000000000000000000013"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f4":{"code":"0x600454507f7f7f6003545060006004556005545060016003557f60006001556000600060006000527f606000527e6000527f600060f75af1506000545060006004556000606000527e6020527f600060006020527f600060f95a6020527ff150600254506004545060006000606040527e600060f15af4606040527f20527f5060035450606040527f0354507f6005546060527f5060016003556000600155606060527f026004557f60026040527f60026060526080527f7f55600260035560016000527f6004556080527f60035450600060006000600060a0527f60f35a60606080527f527ff4506000527f60006060a0527f03557f600260205260c0527f7f60045560016001556001600460a0527f55606080527f0160c0527f6004556060e0527f01600155606020527f035450606040527f0160600060c0527f527f0460e0527f610100527f55600660a0527f5450600454506006545060015450600060036040527f60e052610120527f610100527f7f6060527f55600160035560c0527f600260026020527f55600060610140527e55600160610120527e610100527f55600354506004546080527f606060e052610160527f7f527f50600954507f610140527f7f6009545060610120527e606040527f0355610180527f600260015560006060a061010052610160527f7f527f045560016080526101406101a0527f527f7f60005560026001557f7f6000527f6060610180527e526060527f6101206101c0527f527f7e6060c0610160527f527e5560606000536060a0526101a0527f7e6001536101e0527f60606002536000600353606061014052610180527f7f6004602052606101c052610200527f7fe0527f7f6080527f53606000602060c0527f527f527e6000526101a0527f7f610220527f616101e0527f0160527f600553606060065360610100527e6007536060600853610240527f60a0527f6101610200527fc0527f604060e0527f610180527f527f6000600953610260527f606060604052610120527f610220527f7f0a606101e0527f20527f5360f7600b610280527f6020526101a0527f7f536060c0610100610240527f527f527f5a600c536102006102a0527f527f6060610140527f527f60f1600d5360506101c0610260527f527f600e53606102c0527f606060527f600f610220527f53600060610120527f4052606101610280527f606102e0527f527fe0527f7f6101e0527f601053606060610240527f116080527f5360604061610300527f02a0527f527f026012536055601361014061018052610200527f7f610260527f610320527f527f53606102c0527f6080527f610100527f60601453600060155360605260a0610340527f527f7f6061610280526102e0527f7f0220527f606101a0527f6016610160527f610360527f53600060175360f3606060610120610300527f526102a0527f7f526018610240610380527f527f6060a0527f806101c0527f536053608153610320527f60610180527f61026103a0527fc0527f60c0527f6060825360610260527f6080527f196083610340527f6101406103c0527f526101e0527f7f536102e0527f606060845360006085536101a05261026103606103e0527f527f80527f7f6060c0527ff360865360e052610300527f7f6000610200527f60610400527f8760610380527e6000610160527f6102a0527ff560006000606101610320527f610420527fc0527fa0527f6103a0527f60006000845af4610220527f5050600460e06102c0610440527f527f527f61610340527f016103c0527e527f545060610180527f016101e0527f610460527f6002556001610240527f546102e0616103e0527f0360527f527f506000600155610480527f600060045560c0527f6002600155600061012061610400527f610200526103806104a0527f527f7f61610300527f0260527f01a0527f527f610100527f60610420527e60006104c0527f600060f75af46103a0527f507f6003545060610320527f0160025561026104406104e0527f527f80527f610220527f6003545061016103c0527fc0527f60e0610140527f52610500527f7f61610460527f0340527f7f6004610120527f546102a0527f506103e0527f7f610520527f60016061024052610480527f7f0155600454507f60610360527f046101e0527f610540527f54600052610400527f7f507f6104a0527f616102c0527f0160527f6001600155610560527f60610260610380527f527f0261016104206104c0527f527e610140527f527f60610580527f03556102006102e0527f527f60056000527f6103a0526104e0527f7f610440526105a0527f7f54506001606061610280527f0180527e527f0155600060606103610500527e6105c0527f527f20527f610460527f6103c0527f03556061610220527f0160527e546101616105e0527f0520527f206102a0527f527f600052610480527f7f506103206103e0527f527f610600527f606101a0610540527f527f0260006000527f6020527f6102406104a0527f527f610620527f5560036102c0527f61610560527f0400527f5450610340527f60026061018052610640527f7e60606104c0527f40527f206101610580527f6101c0527f40527f5261042052610660527f7f7f556102606102610360527f6104e0527fe06105a0527f527f527f60006001610680527f5560045450600154506020610440527f527f6101a0527f616105c0527f0500526106a0527f7f7f60405261610380527f01e052610300527f7f7f610280527f6104606105e06106c0527f527f527f7f7f610520527f6001545060610160527f60527f60026103a0527f606106e0527f2052610600527f7f6060405261036104610540527f80527f20527f7f046101c0610700527f52616102a0527f610620527f0200527f7f55606103c0527f0354610560527f50610720527f7f606104a0527f0854506002610640527f545060610340527f6052610180527f610740527f7f600160610580527f8061026103e0527f610660527f6104c0527fc0527f527f610760527f5460610220527f406101e0527f616105a0527f036052610680527f7f527f5060610780527e600260006104e0527f610400527f527f556060527f60616105c06106a0527f6107a0527f527f02e0527e526040526101a052610261038052610500527f7f40527f7f61046107c0527f6106c0527f20526105e0527f7f7f7f606000610200527f608060a0527f5261036107e0527e527f61056106e0527f20527f7f527f02610600527f54506103a05261044052610800527f7f7f6000600355606060610700527f610260527f527f0261054052610620527f610820527f7f6000556101c0527f610261032052610720527f7f610460527f206103c0527f610840527f527f606060610640527f80610560527f527e527e610740527f60025560c0527f610860527f60610280527f6060a0610480527f52610660527f7f20527f61610760527f6161610880527f0580527f03e0527f0340527f6060527f02600255610240527f610680527f61076108a0527f80527f6101e0526104a0527f7f606105a0527f6020527f076102a052610400526108c0527f7f7f546107a0527f6106a0527f6080610360527f527f506060a06061046105c06108e0527f527fc0527fe0527f6107c0527f527f0260206106c0527f5260c0610260527f61610900527f0420527f527f7f6000616102616107e0527f05e0527fc061036104e06106e052610920527f7f527f80527f527f0200527f556060600053610800527f600060015360610440610940527f610600527f52610700527f7f6080527f6040610500527f610820527f52610100610960527f610280526103a0527f7f526102e05261610720527f0620527f7f7f7f61084052610980527f7f60600260610460527fa0610520527f60c0610220527f527f60610740527fe06109a0527f52610860527f7f52610640527f7f6020526103c0527f605360604052616161616109c0527f0540527f6107610880527f60527f0480527f0300527f02610660527fa0527f7f6109e0527f405360606041610120527f6108a0527f536000610780527f616103e052610560610a00527f527f7f024052610680527f6104a0527f6108c0527f7f6040527f6042606107a0610a20527f527fa0610320527f527f53616102c0527f610580526108e0527f6106a0527f7f610a40527f0100527f60e0616107c0527f04006104c0527f527f527f606060610900527fc0610a60527f527f606060610140616106c0527f0261056107e0527fa0527f60610340527f61610a80527f0920527f527f527f527f43536104e0527f6061610420527f6106e0610800527f610aa0527f527f02e0610940527f527f03606105c0527f44536053604553606060527f6101610ac0527f205261036061082052610960527f7f6105610700527e527f527f7f6060465361610ae0527f6105e0527f0440527f6101610280610980527f52610840527f7e526161030061610b00527f0720527f527f0160527f7f60610520527ff3606109a0527f60610600527f6108610b20527f60527fc05260e0610380527f6104610740527f60527f527f6109c0527f7f4753610b40527f6060604860606080610880527f527f610540610620527f527f616102a06109e0610b60527f527f610760527f610320527f527f0140527f6108a0527f527f610480527f6103610b80527fa052610a00527f7f536101610640527f80610780527f52610560527f6108c052610ba0527f7f7f6004604953610a20527f60610120527f53604a536060606103406104a061610bc0527f6107a0527f066108e0527f60610a40527f527f527f527f4b6061610580527f61610be0527f03c0527f02c0527f80610100527f526161610a60527f0900527f07c0527f60e0610c00527f6101610680527f606101a0527f526104c0527f6105a0610a80527f527f7f5261610c20527f0920527f7f7f53606107e0527f056103606103e0527f6106a0527f610aa0527f610c40527f527f604c536060604d610940527f6102e0527f53610161610800527f05c0527f610c60527f610ac0527f6104e0527f40527f60a06106c052610960527f7f527f6000604e53610c80527f6060616104610ae0527e610820527f527f01c0610380527f6105e05261098052610ca0527f7f7f527f8052616106610b00527fe0527f610500527f018052610840527f7f7f610cc0527ff361610300526109a0527f7f0120610b20527f527f604f53606104610600527f610ce0527f610700527f20527e610860527f6101006109c0610b40527f527f527f60616105610d00527f20527f03a0527f50610160527f606101e0527e6061072061610b60527f088061610d20527f09e0527f527f527f610620527f60a0527e610320610440527f527ff561610b80610d40527f527f0540527f6101a0610a00527f527f6108a0527f6000610740527f60006103610d60527fc061610ba0527f0640527f527f600060c0527f610a20527f6000610140527f61610d80527f08c0527f845a61610bc0527f04606105610760527f60527f527ff46102610a40610da0527f527e52610660527f7f506103610be0527f406108e0527f527f50600061016103610dc0527fe0527f610780610a60527f527f80527f60610c00527e606101610580527fc052610de0527f610900527f610680527f610480527f610a80527f7f610c20527f610120527e60610e00527f6107a0527fa0527f6000600060f461610920527f610360527f61610c40527f0a610e20527fa0527f61040061056106a0527fa0527f527f02206107c0527f527f5a61046161610e40527f0c60527f0940527f610ac0527fa0527f60c0527ff150610160527f60006101a0610e60527f616106c0610c80527f527f01e06107e0527f610ae0527f610960527f526105c0610e80527f527f7f527f60e0527f610ca0527f610420527f6104c0527f61038052610b0052610ea0527f7f7f60006106610980527f610800610cc0527f527fe0527f5560610240527f02610ec0527f6105e0527f54610b20527f507f610140527f60610ce0527f02546109a0527f50610ee0527f60045450610820527f60610461070052610b40527f7fe052610d00527f7f6104610f00527f40527f6060005361616109c0527f0600527f6103a0527f026108610b60610d20610f20527f527f527f40527e527f61016101c0610720527f610260527f6109e0527f527f80610f40527f6105610d40527e52610b80527f7f527f60c05261610860527f0620527f610460610f60527f527f7f600260610d60527f610a00527f6107610ba0527f40527f60e0527f6101610f80527f6103c0527e527f01610880610d80527f527f5360610161052052610a610bc052610fa0527f7f20527f7f610640527f606102206107610da0527f60527f527f610280526104610fc0527f806108a0527f610be0527f527f7f610a40527f527f610dc0527f606002536061610fe0527f01e0527f036103e06106605261078052610c00527f7f7f610540610de0527f61611000527f08c0610a60527f527f527f527f60036101a0527f536055600460610c20527f61611020527f0e00527f6104a0527e527f536060616107610a80527fa0526108e0527f7f0261611040527f0680527f610e20527f610c40527fa0527f6102610560527f40527f6005536104611060527f610aa0527e527f6003610e40527f6060610900610c60527f527fe06107c0527f611080527f5261016104c06106a0527f527f20610e60527f610ac0527f610200527f610c806110a0527f527f6101610580527f610920527f80527f527f610e80527f616107e0527f61016110c0527f6102610ae0527f610ca0527fc0527fc0527f616106c0527f610ea0527f0420526110e0527f7f01610940527e616104e0527f02605261610cc0527f610b00527f6108610ec0611100527f527e527f05a0527f7f527f7f0653605460075360610960527f61610ce0527f06611120527fe0610ee0527f527f50610b20527f6008536060610220527f610820527f6102e0611140527f61044061610d610f00527e527f05006105610980527fc0610b40527f527f527f611160527f527f527f60610700527f610f20527f095360610d20527e600a610840527f5360611180527f6061028061610b60527f09a0527f52610f40527f7f6101a06101e0610d40527f6111a0527f527f527f206105e0527f5261610720527f616108610f60527f610b80527f60526111c0527f7f056109c0610d60527f527f20527f0140610460527f527f61610f80527f03006111e0527f527f606060405361610ba0527f0240610d80527f527f61610661616109e0610f611200527fa0527f527f0880527f0740527e527f0120527f6102a061610b610da0527fc052611220527f7f0540610fc0527f527f527f6061010052610480610a00527f527f7f606108a0611240527f527f60610dc0527f610fe0527f415361610be0527f0760527f600b6161062052611260527f7f0320527f606102610a20527e611000527f610de0527f527f42536105605261611280527f0c00527f6108c0527f7f6101c0527f605361611020527f0780527f61610e00526112a0527f7f0260527f610a40527f6104a061610c20527f0640527f611040527f527f61026112c0527fc0526108e052610e20527f7f7f604353606061016103406105610a60611060526112e0527f7f52610c40527f7f6107a0527f80527f610e40527f527f60527f604453600061611300527f61611080527f0900527f0660527f604553610c60527f60610a80610e60527f52611320527f7f60610161046110a0527fc0527f40616107c0527f0220527f527f6046616109611340527f610c8052610e80527f7f206110c0527f527f05a052610aa0527f7f6102e0527f611360527f610680527f6102610360527f8052610e6110e0527fa0527f61610ca0527f07e0611380527f527f7f53600c610940610ac0527f527f6101e05261611100527f04e052610ec06113a0527f527f7f7f60610120610cc0527f6105c0527f6106a0527f527f47611120527f536113c0527f6108610ae0527e610ee0527f52610960527f7f60536048610ce0527f610180616113e0527f1140527f527f53606103610380527e527f610f00527f60610261610b00527f05611400527e527f61611160527f06c0610d00527f610980527f52610820527f610f20527f611420527f7f6105e0527f405261611180527f02a0527f7f610b20527f6049610d20527f53611440527f60f3604a53610f40527f6060604b6111a0527f6109a0527f610200527f616108611460527f40527f616106e0610b610d40527f40610f60526111c0527f7f527f527f03a052611480527f7f01610600527f610520527f6109c0527f6052610320527f6111e0527f61610f6114a0527f80527f0d60527f7f5360610b60527f0d610860527f604c5360536061076112006114c0527f527e527f6102c0610fa0527f527f6109610d80527fe0527f4d61026052610b806114e0527f52611220527f7f610620527f7f53616161610fc0527f61610880527f05405261611500527f0da0527f7f03611240527fc0527f01a052610a00527f610ba0527f610fe0527f611520527f610720527f7f0140527f61611260527f034052610dc0527f7f6060604e536161611540527f08a0527f06611000527f40527f606161611280527f0bc0527f610a20527f0220611560527f527f610de0527f0e604f5361056107611020527f406112a0527f527f60527f61611580527f02e0526103e05261610be0527f08c0527f610e00527f7f610a616112c0527f106115a0527f40527f40527f7f60606050536061610660527f0280527f6161036107610c00616115c0527f12e0527f52610e20611060527f527f7f60527f60527f01805261610a60527f086115e0527fe0527f7e611300527f60610580527f515360611080527ff360610e40527f5261611600527f0c20527f6101c06104611320527e610680527f527f6107610a80526110a0527f611620527f7f80527f526109610e60527e52611340527f7f7f5360610c40527e6061030052611640527f7f536102406110c0527f527f606105a0527f611360527f61610a610e80527fa0611660527f527f0380527e606161610c60527f066110e0527f616109611380527f20527f07611680527fa0527fa0527f016102610ea0527fa0527f6061042052610ac06111006113a0526116a0527f7f527f527f7f52610c80527f7ef560006000600060006000610ec0527f6109406116c0527f526113c0527f7f61611120527f05c0526107c0527f7f610161610a610ca0527f6116e0527fe0527f06c0526113e0527f7f610ee0527f61611140527f0320527fa0526103a0611700527f527f7f855a610960527ff2611400527f61610440610cc0527f527f6161116052611720527f7f0f00527f01610b00527fe06107e052611420527f7f527f6102605261056106611740527fe0527fe0527f611180527f7f61610c610f20527fe0611440527f527f61098052611760527f7f02c052610b20527f7f5050600354506111a0527f6000600061611460527f08611780527e527f610f40527f606103610d00527f6103c0527f610460527f6111c0527f616117a0527f1480527f6109a0610b40527f527f61070052610f60527f7f40527e61060052616117c0527f0d20527f6114a0527f6111e0527f7f600060006061610820527f0180527ffa5a6117e0527f61610f80527f0b60526114c0527f7ff1506109611200527fc0527f6000610d40611800527f527f606101c06102e052610720526114e0527f7f7f610fa0527f610280611220611820527f527f526104806161610b80527f0840527f610d611500527f60527f0620526109611840527fe0527f7f610fc0611240527f527f527f6103e0527f7f6161611520527f036052611860527f7f0200527f52610ba052610d80527f7f61611260527f0740610fe0527f611540611880527f527f527f7e600060610860610a00527f527e600060f25af1506061611280527f6118a0527f0640611560527f52610da052611000527f7f7e610bc0527f546104a0527f50606118c0527f01600161046112611580527fa0527e610760610a20527f526108611020527f806118e0527f610dc0527f527f7f527f55616115a0527f0be06112c0527f527f610300527f60611900527f610380527f02600261611040527f0660526115c0527f7f6161610de0526112e0611920527f527f7f02610a40527fa0527f0161610c00527f0461086115e0527fa052611060611940527f527f7fc0610780611300527f527f527fa052610e00527f60556102611600527f611960527f20527f61610420610a60527f611080527f611320527f610c20527f527f6101e0611980527f611620527f527f61068052610e20527f6108c0527f7f01c0536060611340527f6119a0527f6110a0527f611640527f6107a0527f61616103a0610c40527f610a80527f52616119c0527f0e40527f7f611360527f611660527f6104e0527f6110c0527f0320527f01c1536119e0527f60036108e0527f6101c2536061610c611680527f611380527f60527f61610e60611a00527f527f066110e0527fa0527f610aa0527f6107c0526116a0527f7f610440526113611a20527fa0527f7f02c0527f546101c3536050616161611100527f0e806116c0527f527f611a40527f0c80527f0900527f6113c0527f61610500527f610ac0527f01c4610240616116611a60527fe0527f03c052611120527f7f6107e0610ea06113e0527f527f527f6106610ca0611a80527f527fc0611700527f527f527f53606103610920527f611140527f406161140052611aa0527f7f0ae0527f527f60611720527f610ec0527f610460527f6101c561610cc0527f611ac0527f020052616111611420527f6052611740527f7f0520527f610800527f60536102611ae0527f20610ee0527f6161610b00527f0940526114611760527f40527f7f06e0611180611b00527f527f52610ce0527f7f53606102e0527f6061026103610f611780527e527f6114611b20527f60527fe0527f21536000616111a0527f61046108610b20527f20526117a0527f611b40527f610d00527f7f8061611480527f0960527f52610f20527f7f02226111c0527f61611b60527f6117c0527f0540527f610700527f536061036114a0527f60527f6161610b610d611b80527f20527f40526117e0527f7f610f406111e0527f527f02610260527f236114c052611ba0527f7f5361610980527f0840611800527f527f60016102245360c661040061611200611bc0527f527f0d40610f6114e0527f60527f52611820527f7f527f61610b60527f046107611be0527f20527f610560527fa0527f616112205261150052611840527f7f7f09a0527f61611c00527f0261610f80527f0361610d60527f0860527e527f2553610b80611860527f5261611c20527f1520527f7f611240527f6053610226610380527f5360610fa0527f6061026118611c40527f80527f61074052610d611540527f80527f6109c0611260527f527f7f27536060611c60527f6161056118a0527f610ba0527f6108610fc052611560527f7f80527f80527f02611c80527f285361611280527f6118c0527f04c0610da0527f527f610420527f6102611580611ca0527f527f806109e0527f610fe0527f6118e0527f527f60610b6112a0527fc0527f61611cc0527f6102610760527f6115a0527f29610dc0527f611900527f536108a0527f606103611ce0527f20611000527f6112c0527f527f016161056115c0527fa0611920527f527f6161611d00527f0a00610be0527f527f03a0610de0527f527f022a536112e0527f616161194052611d20527f7f15e0527f1020527f6104e0527f60c7610261076108c0527f80527f2b610440611d40527f61611960527f0c005261611600527f1300527f610e00527f611040527f7f527f611d60527f610a20527f53611980527f605361022c53606061611620527f05c0527f611320611d80527f527f61022d5360006102a06119a0527f61611060527f610e20527f08610c6116611da0527f40527f20527fe0527f527f61611340526119c0527f7f61610a40527f07a0527f611dc0527f0261050052611080611660527f527f7f61036103616119e0527f0e40527fc052611de0527f611360527f7f40527f610c40527f61046052611680527f6105e0611a00527f52611e00527f6109006110a0527f52610a60527f7f611380527f7f7f2e610e60527f6116a061611e20527f1a20527f527f53606161026107c0527f2f610c60527f536110c0527f60016113611e40527fa0527f61611a40527f02306116c0527f5360c861610520527f02610e80527f31611e60527f610a80527f53610920611a60527f527f61106113c06116e0527f527fe0527f60611e80527f536102610c80527f325361060052611a80527f7f60606107610ea0527fe05261611ea0527f1700527f7f616113e0527f6103e0611100527f611aa0527f61048052610aa052611ec0527f7f7f527f0261610ca0611720527f527f0261094052611400611ac0527f527f7f611ee0527f610ec0527f6103611120527f60527fc0526105611740527f40527f7f33611ae0611f00527f527f53606106610800611420527f610ac0527f610cc0527f52610e6111611760611f20527f527f611b00527f40527fe0527f7f20527ff3610234536061611440527f096052611f40527f7f616102355360611b20527f611780527f016102366104a052611160527f7f53611f60527f61610f00527f0c611460527f611b40527fe0527f610a6117a0527fe0527f6061611f80527f0400527f61610820527f05605261118052611b60527f7f61610980611480527f611fa0527f6117c0527f527f0640610f20527f527f7fc9610d0052611b80527f7f61023753611fc0527f60610b00527f6111a0526117e0527f6114a0527f7f536161038052611ba0527f611fe0527f7f0238536102e0610f40527f527f606161084052611800527f61610d20526114612000527f611bc0527fc0527f7f6111c0527f09a0527f7f61026104c0610b20527f526118612020527f20527f7f39611be0527f610f60527f6106606114e0527f527f536105806111e0612040527f527f527f600161616118611c00527f40527f0d40527f023a610420527f536061612060527f09611500527fc052610f80527f7fca611c20527f610b61611860527f1200527f612080527f40527f610860527f61023b536060616161152052611c40527f7f0d60527f023c6120a0527f53611880527f6103a06106610fa052611220527f7f80527f52611c60527f7f606120c0527e610461611540527f05616118a0527f610b60527f09e0527fa0527f610d611c6120e0527f80527f80527fe052611240527f7f610fc0527f61156118c0527f60527f610880612100527f527f61611ca0527f023d5360f3610300527f61610440527f610b805261126061612120527f18e0527f527f7f61611cc0527f1580527f0261610da0610fe0527f527f06a061612140527f0a00527f527f3e536161190052611ce0527f7f023f6000600061616115a0527f612160527f1280527f08a0527ff0606105c0527e611000611d00527f52611920527f7f610b612180527f610dc0527fa0527f60006115c0527f610500526112a052611d20527f7f7f60006121a0527f610a611940527f20527f606103c0527e6061611020527f06c06115e0611d40526121c0527f7f527f527e855af2610de052611960527f6112c0527f7f506108610bc0527fc06121e0527f52611d60527f7f506000610460611600527f527f6061611980527f1040527f04612200527f61610a405261611d80527f12e0527f7f05e0527f55610e00527f610361162052612220527f6119a0527f7f2052606061611da0527f61610be0527f0520611060527f526113612240527e527f6106e0527f61086119c0527fe0611dc0527f611640527f527f7f034053612260527f6003610e20527f610a60527f610341536061611361611de0527f19e0527f2052612280527f7f108052611660527f7f546161610c00527f03e0527f03426106611e00527e526122a0527f7f53611a00527f6050610e40527f61611340611680527f527f0480526161611e6122c0527f20527f10a0527f0900527f61611a20527f610a80527f070052610c20527f7f7f6122e0527f616116611e40527fa0527f0343611360527f53606105611a40527f610e60527f612300527f6110c0527f40527f611e60527f60610344536002616116c0527f034553605461612320527f611a60527f61611380527f0661611e80527f610aa0610c40527f527f09206110612340527fe0527f616116e0527f0e611a80527f80527f611ea0527f527f20527f03466161612360527f13a0527f0720527f536050610347610400527f61611aa0611ec0527f527f1700612380527f527f6104a052611100527f7f610c6052610ea06113c0527f527f7f61611ee0526123a0527f7f0561611ac0527f0ac0527f611720527f60527f53610940527f6060610348616123c0527f11611f00527f20527f53600161611ae0527f13e0527f6106610740611740527f6123e0527f527f610ec052611f20527f7f40610c80527f527f610349611b00527f5360610a612400527fe052611140611400527f61611f40527f1760527f527f7f5461034a5360506103612420527f61611b20527f0960527f610ee0527f4b611f60527f5360606103610ca0526117612440527f80527f611420527f7f4c61611b40527f1160527f53611f80527f60610580527f612460527f61610760610b00527f527f04c06117a0527f610f00611b60527f611fa0527f52612480527f7f611440527f52610660527f7f611180527f61042061610cc0527f096117c0616124a0527f1fc0527f611b80527f527f80527f52600061044053611460527f6061610441616124c0527f0f20527f611fe0527f53616111a0611ba0527f527f6117e0527f0b20527f60036124e0527f610442536061078061612000527f611480527f0ce0527f52611bc0527f7f4d61612500527f04436105611800527fa06109610f612020527f6111c0527f40527fa0527f5261612520527f0680611be0527f6114a0527f527f7f53610b40612040527f611820527f527f60612540527f53610461610d00527f04e052611c00527f6111e0527f7f44612060527f53610f612560527f6114c0527f6052611840527f7f6060610445536107a0611c20527f527f612080612580527f527f60606109c0527f610446610b60611200527f6114611860527fe0527f527f6125a0527f611c6120a0527f40527f610d20527f53610f80527f606161044753606106a0526125c0527f7f036105c061186120c0527f80527f611c60527f527f61611500527f611220526125e0527f7f044853604e6104610761096120e0527fe061610fa0527f0d611c80527f6118612600527fa0527f40527f610b80527f611520527f52612100527f7fc0527f611240527f49612620527f536105611ca0527e527f60536118c0527f61044a5360612120527f6061044b61612640527f0fc052611540527f7f6106c0611cc0527f52610d60527f61126052612140527f612660527f6118e0527f7f7f53600061610ba0527f044c610a0052611ce0527f7f61156052612680527f612160527f7f6105e06107e0610fe0611900527f527f527f527f611280527f536126a0527f611d00527f612180527f60616104610d80527f4d53611580527f6003610461196126c0527f20527f4e53604f610bc06121a0527f611d20527f527f610520611000526112a06126e0527f527f7f527f6161610a6115a05261196121c0527f40527f7f20611d40527f527f612700527f06e0527f04610da0527f4f5360610800527f53616121e0527f04506112c0527f612720527f536119611d60527f60527f616115c0527f1020527f6060610b612200527fe052612740527f7f610600527f6104515360fd61611d80527f610dc0611980527f527f610a6122612760527f20527f61126115e0527fe0527f40527f04525361104052611da0527f7f606161612780527f045353612240527f616119a0527f0700526108610c00527f20611600527f527f6127a0527f7f611dc0527f6113612260527e527f600361610de0527f6119c0527f046105616127c0527f1060527f40527f545360611d612280527fe0527f5061611620527f0a60527f616127e0527f0455616113206119e0527f527f0620527f6122a0527f536061611e00527f0c20612800527f527f5361610e00611080611640527f527f527f0456616122c0527f1a00527f53612820527f606161611e20527f610840611340527f527f04610720527f5753606122e0527f612840527f610a80611660527f52611a2052611e40527f7f7f03610458536110a0527f610c612860527f612300527f610e2052611360527f7f40527f6051610459611e60527f61611a40612880527f527f168052612320527f7f53610560527f6060610640527f610860526110c0526128a0527f7f611e80527f7f611380612340527f527f611a60527f61045a536116a0527f616128c0527f0a610e40527fa0527f610c611ea052612360527f7f60527f6000610740527f616128e0527f611a80527f045b5360616113a0526116c0527f7f612380527f10611ec0527fe0612900527f527ff361045c53600061045d600061611aa0527f0e60527f606123a0527ef560612920527f610880611ee0527f52610c6116e0527f806113c0527f527f610a6111006123c0612940527f527f611ac0527f527fc0527f7e611f00527f60006105610660527f8061076061612960527f17006123e0527f527f610e80527f526113611ae0527fe0611f20527f527f7f52612980527f60606105a05360612400527f611120527e6105610ca0527f611720527fa153606129a0527f61611f40527f1b00527f6061612420527f610ae0527f61611400527f08a052616129c0527f0ea0527f7f05a253606111611f60527f40612440527f611740611b20527f527f6129e0527f527e6105a35360606105a4536161610c611420527f61612460527f1f80527fc0612a00527f527f0780527f0680611b40527f527f611760527f60610ec0527e61612480527f612a20527f1160527f611fa0527f610b00527f6105a5536061144052611b60527f7f6108c0612a40527f6124a0527f527f85611780527f61611fc0527f05a653605a610ce0527f6105a7612a60527f53616111806124c0527f52611b80527f7f0ee0527f606114611fe0527f60527f612a80527ff26117a0527f6105a8536124e0527f6050610561610b20527f07611ba0527fa0612aa0527f527f612000527fa953605061066108612500527f6111a0527f616117c0527f14612ac0527f80527f610d0052610f611bc0612020527f527e52612520527f7f7fe0527fa052612ae0527f60616106c05360056106c153606117e0527faa61610b612040612540527f527f612b00527f61611be0527f14a0527f6111c0527f40527f06c253605361610f20527f066125612b20527f60527f610d612060527f20611800527f611c00527f527fc3536107c0527f6114612b40527fc0527f612580527f60610900526111612080527fe0527f7f616106c453600561612b60527f1c20527f611820526125a0527f7f6106c5536061610f40527f6120a0527f0b60612b80527f526114e0527f7fab61610d40526125c0527f7f611c40527f06c6611200611840612ba0527f527f526120c0527f7f5360606106c75360006125e0527f6106c85360f3616161612bc0527f1500611c60527f527f0920610f6120e0527f60527f5261612600527f1860527f612be0527f7f07e052606161611220527f08610b610d611c80527f60612100527f61262052612c00527f7f527f80527e53611520527f600661611880527f08015360c961080253610f80612c20527f61612640527f612120527f1ca0527f527f605361611240527f08035360606108612c40527f6115406118a0612660527f527f527f04612140527f61094052611cc0527f7f61612c60527f0d80527f5360610ba0527e612680527f61080553610fa0611260612160527f52612c80527f7f6118c0527f527f611ce0527f6115606126a0527f527f606161080653600661612ca0527f08075360612180527fca61080853606061610da0526126c0527f6118611d0052612cc0527f7fe0527f7f0809536061126115806121a0527f527f80527f61096126e0527f61612ce0527f0fc0527f610bc0527f6052611d20527f7e6108611900527f6121c0527f0a5361612d00527f2700527f606061080b53600061086115a0527f0c53606112a052611d40527f7f612d20527ff5616121612720527fe0527f0dc0527f61611920527f610fe0527f080d536060612d40527f61080e5360610b6115612740527f611d60612200527f527fc0527fe0527e6161612d60527f0980526112611940527fc0527f7f612760527f080f536060610810612220527f612d80527f5360611d80527f61611000527f0de06115e052612780527f7f527e6108116119612da0527f60527f5360612240527f60610812536061611da0527f12e06127a0527f527e61612dc0527f08610c00527f135360606108146116612260527e527f611980527f61096127c0612de0527f527f6110611dc0527f20527fa0527f610e00527f53606113612280527e527e61612e00527f08156127e0527f536060610816536119a052611de0527f7f611620527f600061612e20527f086122a0527f17612800527f5360610c2052611040527f7f8561081861132052612e40527f7f611e00527f536119c05261612820527f22c0527f7f605a610e20611640527f612e60527f527f61081953606109c05260f26109e061612840527f1e20527f6122e0527f53612e80527f60616109616119e0527f1060527f611340527fe16116612860527f60527f5360612ea0527f08610961612300527f611e40527f0c40527fe253610e40527f611a612880527e612ec0527f527f601a6109e35360536109e4612320527f5360606161611e60527f16805261612ee0527f28a0527f7f1360527f611080527f6109e5611a20527f53612340527f60506109612f00527fe65360616128c0527f6109611e80527fe753610c610e60527f6116a0527f6052612f20527f7f612360527f6061136128e0527f80611a40527f527f086109e8611ea0527f53612f40527f6110a0527f601b6109e953612380612900527f527f60536109ea53606116c052612f60527f7f6061611a60527f09611ec0527feb53605061612920527f09616123a0527f13612f80527fa0527fec610e80527f536061616110c0527f0c8052611661612940527f611ee0612fa0527f527f1a806123c0527f527fe0527f7f6109ed5360086109ee53601c6161612960612fc0527f527f13c0527f09ef53605361611f6123e0527e527f09f05360611aa0527f6161612fe0527f0e61612980527f1700527fa0526110e0527f7f6109f153612400527f60086161613000527f1f20527f09610c6129a0527fa06113e0527f611ac0527f527ff253601d610961613020527f17612420527f20527ff353606129c0527f6061611f40527f09f4536000610961613040527f1100527ff561611ae0527f612440527f0e6129e0527fc0527f53611400527f60613060527ff361611f60527f611740527f09f6536109f760006061612a00527f2460527f61613080527f0cc05260611b00527e610ce05360f06161611f80527f1120527f0c612a20527f6130a0527fe1611420612480527f611760527f527f53606061610ee0611b20527f527f0ce26130c0527f612a40527f611fa0527f536000616124a0527f0ce3536060610ce4536000610c6130e0527fe553611780612a60527f527f61116114611b4052611fc0526124c0527f7f7f40613100527f527f40527f6060610ce6612a80527f536000610ce7610f00527f536060610ce8613120527f61176124e0527fa0611fe0527f5261612aa0527f1b60527f7f536000610ce953613140527f611460527f60846161116052612500527f7f0cea612ac0527f53605a61200052613160527f7f610ceb5360f4611b80527f616117c0527f0cec5360612520612ae0527f527f613180527f610f20526050610f611480612020527f527f40536061610f415361611ba0612b6131a0527e527f527f612540527f1180527f600c6117e0527f610f425360612040527fed6131c0527f610f43612b20527f536053610f4453612560527f606114a052611bc0527f7f606131e0527f610f45536050610f612b40527f46612060527f611800527f53612580527f6061613200527f6111a0527f610f4753600c610f612b60527f611be0527f485360ee610f612080613220527f527f616125a0527f14c0527f495360536161612b80527f1820527f0f4a536061613240527f610f4b53600c611c00527f61616125c0527f20a0527f0f612ba0527f6111c052613260527f7f4c5360ef610f4d53606114e0527f611840527f60610f6125e0527f612bc052613280527f7f4e5360616120c0527f1c20527e610f4f5360f3610f50536000610f516061116132a0527fe0612be0527f612600527f5260006112006118606120e0527f527f61611c40526132c0527f7f1500527f53612c00527f6060611201612620527f5360006112025360f561126132e0527f035360612100527f606112612c20527f0453600061611c60527f612640527f18613300527f80527f6112055360611520527f606112612c40527f0653612120527f60006112613320527f07536060612660527f6112085360611c80527e6112612c60527f096118a0527f613340527f53606061120a612140527f536000612680527f61611540527f12612c80527f0b613360527f53606061120c611ca0527f53600061120d536085616121606126a0527f527f61613380527f2ca0527f18c0527f61120e53605a61120f5360f2611210611560611cc0527f526133a0527f60536126612cc0527fc0527f6115612180527f8053606061158153606118e0526133c0527f7f5061158253606161612ce0527f1583536126e0527f6012611ce0527f6121a06133e0527f527f611584536011611585536053612d00527f6115865360606161612700527f613400527f1900527f15875360506115886121c0527f611d612d20527e527f536061611589613420527f53601261612720527f158a53601261158b53605361158c612d40527f61192061613440527f21e0527f527f536061611d20527f612740527f61158d53601261158e612d6052613460527f7f53601361158f53606061159053612200527f6000611591612760527f536061613480527f19612d80527f40611d40527f5260f361196053606161196153601561196122206134a0527f527f61278052612da0527f7f625360926119635360536119645360611d60527f6134c0527f6161196553601561196653612dc0527f606127a0527f612240527f93611967536134e0527f60606119685360006119695360606161612de0527f1d80527f196a6127c0527f613500527f5360006119612260527f6b5360f061196c53606061612e00527f196d53600061613520527f196e5360606127e0527f61196f611da0527f5360612280527e61612e20527f19613540527f705360606119715360006119725360612800527f606119735360006119745361613560527f2e40527f60611d6122a0527fc0527f60611975536000611976612820527f5360613580527f85611977612e60527f53605a6119785360f2611979536122c0527f605061611d6135a0527fe05260612840527f19612e80527f611e0053607a611e01536053611e025360606135c0527f611e0353606122e0527f50611e61612ea0527f2860527f04536061611e0553606135e0527f19611e0653607b611e07536053611e08536061612ec0527f6161230061288052613600527f7f527f1e09536019611e0a53607c611e0b536060611e0c53612ee0527f600061613620527f1e0d5360f3616128a0527f1e0e61232052605361234053606061234153612f00613640527f527f600061234253606161234353601e6128c0527f61234453600f6123455360613660527f6061612f20527f234653600061234753606061234853600061236128e0527f49613680527f5360f561234a53612f40527f606061234b53600061234c53606061234d5360006136a0527f61234e53612900527f606061612f60527f234f536000612350536060612351536136c0527f600061235253608461235353605a612920612f80527f526061612940536023616136e0527f29415360546129425360536129435360606129445360612fa0527ff461294553613700527f606161294653602361294753605561294853605361294953606061612fc0527f613720527f294a53605061294b53606161294c53602361294d53605661294e53605361294f613740527f612fe0527f536060612950536050612951536061612952536023612953536057613760527f6129545360613000527f53612955536061612956536023612957536058612958613780527f53606061295953600061613020527f295a5360f361295b53600061295c6000606137a05260006137c05360f56137c15360606137c25360006137c35360606137c45360006137c55360606137c65360006137c75360606137c85360006137c95360846137ca53605a6137cb5360f46137cc5360506137cd5360506137ce5360616137cf5360306137d05360406137d15360526137d25360616137d35360306137d45360606137d55360606137d65360006137d75360f36137d85360006137d960006000f560006000600060006000855af15050","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002":"0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000003":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000005":"0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000006":"0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000009":"0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000a":"0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000000b":"0x0000000000000000000000000000000000000000000000000000000000000010"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f5":{"code":"0x600354506001545060006002556000600060006000600060f75af1506002600355600160005560016003556000600255600054506002545060006000fd","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000001":"0x0000000000000000000000000000000000000000000000000000000000000009"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f6":{"code":"0x7f60016003556009545060016002556001600355600954506001600155600160046000527f556000545060006003556001600255600260025560045450600054507f6004546020527f507f7f7f600254506000545060025450600654506001545060026000556000526040527f7f60005450606000527f076000527f54600052605060205360606021536060606060527f226020527f5360606023536000606020527f24536053606020527f25536060606080527f26536000606040527f275360606028536001602953606040527f53602a53606060a0527f602b536040527f60606060527f602c536060602d536002602e536053602f606060c0527f527f53606060305360006031536080527f60606060527f60325360036033536060e0527f5360345360606080527f60355360f3603660a0527f5360606037536004603860610100527f80527f5360536039536060603a5360a0527f60056060c0527f3b536060603c53610120527f6000603d5360f3603e536060a0527e603f60006000f560c05260e0527f7f6000610140527f600060006000845af45050600060006000600060006060c0527ff25af1610100610160527f527f5060e0527f6002600155600060006000600060f65af45060006000600060610180527e60610120527ff560e0527f610100527f5af450600454507f600854506009546101a0527f50600954507f60610140527f02600455600254506002610120527f610100527f6101c0527f60045560006000606000527e610160527f600060f45af45060006001556000526101e0527f610140527f6060602053610120527f6002610180527f60215360546022536060610200527f20527f50602353606060610160527f245360006025536101a0527f6060606101610220527f40527f2653600060275360fd6028536029606040610180527f52606101c0527e610240527f60605360f360615360006062610160527f60006000f560006000600060610161610260527f01e0527fa0527e845af45050600060006000600060f35af45060610180527f02610280527f60025560610200527f01606101c0527f045560026002556004545060035450606102a0527e6003556000600060610220527f6101a0526000616101e0527f01c0536060616102c0527f01c15360006101c25360606101c3610240527f5360006101c45360606101c5616102e0527f0200527f5360f26101c653605a6101c75360f1610260527f6101c85360506101610300527fc95360606101ca5360610220526000610240536061610241610280527f536001610320527f6102425360cb61024353605361024453606061024553606061024653606102a0610340527f527f616102475360016102485360cc61024953605361024a53606061024b5360610360527e616102c0527f024c53606161024d53600161024e5360cd61024f5360536102610380527f505360606102516102e0527f5360fd61025253606161025353600161025453606103a0527fce6102555360536102565360610300527f616102575360016102585360cf61026103c0527f5953606061025a53600061025b5360f361610320527f025c5361025d600060006103e0527ff06000600060006000845af45050600254506001600161034052605561036053610400527f60606103615360006103625360606103635360006103645360f36103655361036104205260666104405360606104415360006104425360f36104435361044460006000f06000600060006000845af45050","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x000000000000000000000000000000000000000000000000000000000000000e"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f7":{"code":"0x7f6002600455600754507f600354506000600255600160005560015450600260046000527f557f600854507f7f60006000527f6002556000600455600260005560606000536020527f6000600153606000527f606002536020527f606000527e6000526060602053606040527f03602153605360225360606023536020527f6040527f60f360245360606060206060527f527f25536004602653605360275360606028536005606060527f6040527f29536080527f6060602a536000602b536040527f60f3602c53602d60006000f06080527f600060a0527f60006060527f600060006000855af1505060006000606060527e6000600060a060c0527f527f60f95af2506001546080527f5060015450600454507f7f7f60006004556060e0527f096060c0527f80527f54506002600455600260a0527f60015560085450600354610100527f50600160600060e0527f527f016000527f60a0527f556000526060c0527f6060610120527f20536060602153606060610100527f225360006023536053606020527f2460c0610140527f527f5360e0527f6060606020527f25610120527f536000602653606060275360610160527f016028536053602953606060610100527fe0527f610140527f40527f60602a53610180527f6060602b536040527f6060602c536002602d53605360610120610160527f527f6101a0527f2e5360610100527f60602f6060527f53600060305360606031536003606061016101c0527f80527f527f610140527f6032536053603353610120527f606060345360fd60806101e0527f527f606101a0527f35536060603653610160527f600460375360536038608052610200527f7f610140527f53606101c0527f606039536005603a5360a052610180527f7f60610220527f60603b536000603c5360f3603d6101e0527f53603e610160527f6000600060a0610240527f527ff06101a0527f60006000600060c0527f610200527f60006000855af15050610260527f60025450610180527f7f6002546101c0527f5060026002610220527f55600160610280527fc0527f60015560e0527f60055450600454507f6101a0526101e0527f610240526102a0527f7f7f6002600455600060026000527f5560006003556060e052610100527f7f026102c0527f60610260527f610200527f036101c0527f556000600060006000600060f260006102e0527f527f5af25060610280527e6020527f610220527f6004610120526101e0527f7f610300527f55610100527f600160046102a0527f55600060006000600060610240527e60f6610320527f5af1507f60065460610200527f20616102c0527f0140527f527f506040526101610340527f2052610260527f7f7f60606000536000600153606102e0527f60600261022052610360527f7f536000600353610160527f610280527f6060600453600060610300527f6000610380527f52610140527f606060527f610240527f40527f7f05536102a0527f60606061036103a0527f20527f0653610180527f60006007536060600853600060095360610260527f616103c0527f6102c0610340527f527f0160527f60600a53606080527ff6606101a0527f0b606103e0527f60527f536020527f610360527f60616102e0527f0280527f5a600c5360f1600d610400527f5360610180527f50600e536060610380527f6101c0527f600f610300527f5360610420527fa0526102a0527f7f600160105360606080526103a0527f7f6011536002604052610440527f6101a0610320527f527f7f6101e0527f606102c0527f126103c0527f53605560610460527f13536060601460c0527f536000610340527f601553606060165360a06103e052610480527f7f527f61616102e0527f0200527f01c0527f6000601753610360527f60fd60186104a0527f60610400527f6052605360805360e0527f606060610300527f815360196102206104c0527f52610380527f610420527f7f608253606101e0527f6060835360c0527f6000606104e0527f845360610320527ff36085610440527f6103a0527f536086606101610240527e610500527f527e6000f0600060610200527e600060610460527e606103406103c0527f527e610520527f855af1505060e0527f7f6009610260527f545060610480527f02600161012052610540527f7f55606103e0527f61610360527f0220527f045450600054506104a0527f6001610560527f6000557f60610280527e600060610400527e6000610100610380527f527f6104610580527fc0527f606000526101610240527f40527f7e60f35af1610420527f506102a0526105a0527f7f7f606104e0527f0854506103a0527f6007545060606000536000606000527f6105c0527f610440527f016161610500527f0260527f012052616102c0527f6103c0527f016105e0527f60527f7f536060606020610460610520527f527f527f02536000600353606060610600527f046000527f610280526103e0527f6102e052610540527f7f7f610480527f5360610620527e6005536060610180527f60610140527f065360602052610560527f7e610400610640527f527f606104a0527f6040527f610300527f076102a0527f536060600861058052610660527f7f53600060095360606101a0616104c0527f0420527f527f600a536060206101610680527f616105a0527f0320527f60527f527ff76102c0527f600b6104e0527f53605a606106a0527f610440527f0c6105c0527f60406060527f527f5360f26101c0610340527f527f6106c0527f60610500527f0d536050606105e0527f0e536061610460527f02e0527f6060616106e0527f0180527f0f536000601053610520527f610600527f6060610360527f60604052610700527f601160610480527f6101e0527f6080527f61030052610620527f610540527f7f610720527f60536060527f6053606153610380527f60616104a0527f01a052610640527f7f610740527f60606253610560527f6000606353606061020052610320527f7f606453601261610760527f0660527f61036104c0527fa0527f610580527f6065536060a0527f5360665360610780527f60608061610680527f01c0527f527f6067536103406104e06105a0527f527f526107a0527f7f606103c0527f61026106a0527f20527ff360685360606069536013606a53606107c0527f53606105c0527f6b60610500527f6106c0527fc0527f53606060616103e0527f6107e0527f0360527f6101e0527f6c61026105e0527f40526106e0527f7f53601460610520610800527f527f6d60a0527f536060606e536000610400527f606f6106610700527e527f53610820527f60610380527ff360705360610540527f7160e0527f61610260527f0261072052610840527f7e527f610620527f600060610420527ef06000600060006061610560527f03a0610860527f610740527f527e6060c0527e85610640527f5af250507f600060026102806104610880527f40527f527f610760527f556005610580527f5461022052610660527f7f6101616108a0527f03c0527e527f50600454610780527f5060026002556060610460527f6105a0526108c0527f7f610680527f6000536000606102a06107a0527f527fe0527f6001536103e0526108e0527f7f606060610240527f02606106a0527f6105c0526107c0527f7f610480527e52610900527f7f610120527f53600360035360556102c0527f60616106c0526107e0527f7f04610920527e527f046105e0527f536060606104a0527f0553600160065361610260526108610940527e527f7f6106e0527f0100527f606060075360610600527f6101406161042052610960527f7f6104610820527fc0527f02e052610700527f7f527e600853606020527f5560610980527f0953610620527f60610840527f60600a53610280527f6000610720527f600b616109a0527f04e0527f610440527f53606060610860527f61030052610640527f7f610120526109c0527f7f0c610740527f610160527f536000600d53610880527f60610500527ff3600e6109e0527f5360610460610660527f527f610760527f0f6102a0527f6108a0527f60604061610a00527f0320527f52600060605360f3610520527f6061536106610780527f806108c052610a20527f7f527f60006062616101610480527f80527f0140527f600060006102c0610340610a40527f616108e0527f07a0527f6105406106a0527f527f527f527ff560006000600060610a60527e60006104a0610900527f527f855a6107c0527ff1505060006001556106c052610a80527f7f6003610560527f546101610920527fa0527f50610360527f6107e0527f7f60610aa0527f6102e0527f026104c0527f6106e0527f610940527f610160527f545061058052610ac0527f7f6001610800527f60025560006004556001600255610960527f600461038061610ae0527f0700527f527f5450606104e052610820527f7f02616105a0527f610980527f01610b00527fc0610300527f527f600255600854610720527f50600061610840527f01805261610b20527f09a0527f7f527f60086103a061056105c0527e527f527f545060075450610740610b40527f526108606109c0527f527f7f60016004557f610320527f7f606101e0527e6002610b60527f556105e0527f6000606109e0527f6105610880527f20610760527f527f025561610b80527f03c0527f60025450606101a0527f610a00527f01546020527f506108a0527f61610ba0527f0600527f61610780527f0340527f6006546105610a20527f40527f5060026102610bc0527e5261036108c0527fe0527f7f600255600260616107a052610a40527f7f0620610be0527f527e6000527f556000527f6002606108e0527f610560527f6101610360610a60610c00527f527f527fc0527f016107c0527f556104610640527e527f60610900527f606000610c20527f6040610a80527f610220527f527f5360610580527e60016107e0527f53606060610c40527f0253610920527f610aa0527f60610660527e60610380527f610420527f035360610c60527ff36020527f61610800527f01610ac0527f610940527f6105a0527fe0527f6004610c80527f610680527f53610240527f600560205260610ae0527f6060605261610960527f610ca0527f0820527f7f610440527f6103a0527f6105c0527f6106610b00527fa0527f6040610cc0527f5360006041610980527f5360f360610840527f4253600060436061610b20527f610ce0527f0200610260527f52610460527f61066109a0527fc0527f6105e0527f7e610860610d00527f610b40527f527f6000f5606103c0527f4052606060605360006109c0527f6080610d20527f527f606153610b60527f606106e0527f60610880527f60625360610600527f61610d40527f0480526109e0527f7e60610b80527f6353610280527f606103e0527f61022061610d60527f6108a0527f0700527f527f6060610a610ba0527e527f64536000606561062052610d80527f7f536060606104a0527f665360006108c0527f610bc0527f606760610a20527f610da0527fa0610720527f527f5360846061610400527f02a052610640610be0527f527f7f610dc0527f68536108e0610a40527f527f605a606961026104c0610740527f527f40610c00610de0527f527f527f5360f4606a536050606b53610a60527f6050610900527f606c610660610e00527f527f610c20527f5360610420527f610760527f60606d536102610a80527fc061610e20527f04e0527f526109610c40527f20527f7f6060c0527f02606e536060610680527f610e40527f610261610aa0527f0780527f610c60527f60527f606f536000610940527f6070610e60527f610440527f5360610500527f55610ac052610c80527f7f607153606060616106610e80527f6107a0527fa0527f610960527f02e0527f7253600060610ca0527f73610ae052610ea0527f7f5360606060e05260746161026104610520527f6107c061098052610cc0527f610ec0527f7f527f60527f610b00527f6106c0527f80527f01005360536101015360606103610ee0527f610ce0527e527f6101026109a0527f610b20527f53606107e0527e6101035361610f00527f05406106610d00527fe0527f527f606061610480527f010453610b40527f6109610f20527fc0527f607561010561610d20527f610800527f02a0527f536053610106610320610f40527f610700610b60527f527f527f6161610d40527f09e0527f0560527f5360606101610f60527f0753610820527f606104a0527f610b80527ffd610d60527f6101085360606101610f80527f09610a00527f5360610720527f7661010a53606161056161610d80527f0ba052610fa0527f7f0840527f80527f02c0527f53610340610a20527f527f61010b6104c0610da0610fc0527f527f527f5360610bc0527f610740527f6061010c610860527f53607761010d61610fe0527f0a40610dc0527f527f53606105a0527f610be0527f6061010e53600061010f53611000527f60f36161610760610de0527f52610880527f7f610a60527f6103610c00527f60611020527f6104e0527f527f02e0527f01610e00527f10536105c0527f6000610111600060611040527e61610a610c20527f80527f08a0527ff5610e20527f610780527f6000600060611060527e60006000855af2610500527f50610c40527f506103610e40527f610aa0527f611080527f6105e0526108c0527f7f80527f60026107a0527f60036103610c60610e60527f6110a0527f527e527f5560035450610ac0527f6001600255600260036108e0527f556061056110c0527f610e80527f20610c80527f52610600527f6107c0527f7f01610ae0527f54507f6110e0527f6003546103610ea0527fa0527f506006610ca0527f610900527f545060065450611100527f610320527f7f60610b00610ec0527f527f0454506107e0527f61610cc0527f06611120527f20527f60610540527f610920527f01610ee0527f60015560006000610b20527f611140527f60006000610ce0527f6103c0527f600060006108610f00527e527f527f60f75a611160527f61610940527f064052610b4052610d00527f7f7ff2506000610f20527f546161611180527f0560527f0340527f50600254506000610820527f526109610d20527f60610f406111a0527f527f610b60527f527f7f600454506103e052610660527f7f600354507f6001606111c0527f0161610f60527f0d40527f55610580527f610b80527f6061610980527f0840526111e0527f7f6020527f0454610f80527f50606103610d60527f60527e6000610680527f55611200527f610ba0527f7f600060046104610fa0527f6109a0527e527f5561610d80527f08611220527f60527f600260606105a0527f20527f610b610fc0527fc0527f04556000600060611240527e6106a0610da0527f6109c0527f527f606000604052610fe0527f7f61088052611260527f7f6103610be0527f80527f527e60610dc0527e610420527f6105c0611000527f611280527f526109e0527f7f60f25af250606106c052610c00527f7e610de0527f600061086112a0527f611020527fa0527f6000606000527e606040527e60610a00527ff35af25060026112c0527f61610e0052611040527f7f0c20527f6103a0526105e0527f616106e06108c0526112e0527f7f527f0440527f7f6061611060527f0a610e20527f20527f60610c40527f527f611300527f600355606020527e60006000600060611080527ff55af4506001610e40527f61611320527f08e0527f54616161610c60527f0a40527f0700526110a0527f7f0600527f5060611340527f60605261610e60527f0460527f7f6103c0527f01602052610c6110c0527f8052611360527f7f60610900610a60527f527f8052610e80527f7f7f600455610720527f606110611380527fe0527e5450610620527f610ca0527f6000606040527e60610ea0527e610a80526113a0527f7f60611100527f61610920527f0480527e600060f25a6103610cc0527fe061076113c0527f610ec0527f4052611120527f7f527ff25060006080610aa0527f52610640527f6113e0527f7f610940527f60610ce0610e611140527fe0527f527fa0527f60006000600060611400527e606104a052610760610ac0527f527f7f611160527f40527f610f00527f60f3611420527f610d00527f5af25060610960527f6060610461066052611180527f7e527f527e611440527f600061610f20527f0ae0527f600060610d20527e600060610780526111a0527f611460527f7ff760c0527f610980527f6104610f40527fc0527f60a0527f5a610b00610d40611480527f6111c0527f527f527ff25060610680527e600060006000610f60527f606104616114a0527f07a0527f616111e0527f09a0527f20527e610d60527f60f4610b20527f6060526114c0527f7f610f80527f5af16080611200527f526104e0527f7f50606106a0527f0460e06114e0527f610d80527f527f6109c052610fa052611220527f7f7f610b40527f6107c0527f611500527f5450600060c0527f60035560610440610da0527f611240527f52610fc0527f7e611520527f60045560006000610500610b60527f6109e0527f6106c0527f611260527f6107611540527fe0527f61610fe0527f0dc0527f527f60006000600060f85af150606101006112611560527f80527f610b80527f527f8060a061611000527f0a00527f610de0527f527f527f611580527f6104606112a0527f527f7f610800527f6106e0527f60e061611020527f0ba0526115a0527f7f610520527f610e6112c0527e527f527f7f6000610a20527f600060006000606115c0527ff7611040527f5af4506001546112e0527f506108610bc0527f610e20527f20526115e0527f7f6002610120610700527f611060527f52611300527f7f610a40527f60016104611600527f80610540527f527f610e40527f610be0527f55600161611320527f1080527f60611620527e556060610840527fc052610100527f610a60527f7f01610e6052611340527f611640527f7f5461076110a0527f2052610c00527f7f60a0527f506000527f7f6000610560611660527f611360527f527f61086052610e806110c0527f527f7f6101610a80527f610461611680527f0c20527fa0611380527f527f40527f527f600854610740526110e0527f7f50616116a0527f0ea0527f7f60035450606113a0527f03545060006108610a610c40527fa0527f6116c0527f8052611100527f7f610120527f61616113c0527f0ec0527f0580527f6060e0526116e0527f7f01556104c0610760527f52611120527f610c606113e0527f527f7f6000610a611700527fc052610ee0527f7f6061016108a0527f60527e60c052611140611400527f527f611720527f7f600060006060205261610c80527f05a0610f00527f527f7ff85af4610a6114611740527f20527fe052611160527f7f50610780527f60606108c0527f205261014061610c611760527f610f20611440527f527fa0527f04e0611180527f527f527f7f6000527e610161611780527f0b00527f80527f61611460527f01006105c0527f610f40527f6111a0527f61076117a0527f61610cc0527f08e0527fa0527f611480527f527f600060006000526060610b206117c0527f527f606111c0527f610f60527f60e0527f206114a0527f610500610ce0527f526117e0527f7f53600060215360610900527f6111e0527f61016061076114c0527f610f8052611800527f7fc0527f61610b40527f05e0527f610d00527f527f6101611200527f6114e052611820527f7fa0527f606040527f6022610fa0527f5360f16101610920527f20527f61610b611840527f60611500527f611220527f52610d20527f7f0520527f6107e052610fc0527f7f611860527f602353606061611520527f0600527f40611240527f527f5a6024602052610940611880527f610d40527f52610b80610f611540527fe0527f527f7f61010061611260527f016118a0527fc0527f610180527f610800527f527f7f611560527f53606105610d60526110006118c0527f527f7f40611280527f527f610620610ba0527f5261611580527f0960527f7ff46118e0527f60255360506026536061014061106112a0527f20527f52610d806115a0527f52611900527f7f7f6060610820527f527f60610bc0527f60276101e052616112c0527f098061611920527f15c0527f52611040527f7f7f53600260610da0527f28610640527f610560527f611940527f610161126115e0527fe0527fa0527f610be0527f611060527f5360610840527f611960527f54602960610dc0527f611600527f6109a0611300527f527f60610120527f527f611980527f536050611080527f602a53610161611620527f0c00527f61066052611320527f6119a0527f7f61610de0527f0200527f6105610860526161611640527f10a0527f09c0527f6119c0527f7f80527f60611340527f527f60604052610c20527f7f610e611660527e527f606119e0527f606101c0526110c0527f7f2b5360611360527f80527f60610680527f61168052611a00527f7f046109e0527f60610880527f61610e20527f0c6110e052611380527f7f4052611a20527f7f6116a0527f2c536054602d53606105a0527f610220527f610140527f50602e611a40527f610a6113a0526116c0527f7f61611100527f0e40527e527f61610c60527f0180611a60527f5261066108a0527fa0527f6116e0527f7f6113c0527f53606101e05261112052611a80527f7f7f6060610e60527f80527f602f6105611700527fc061610c80526113e0527f611aa0527f7f0a20527f527f53600160611140527f3061024052611720527f6108c0610e80611ac0527f527f527f7f611400527f53606106c0527f606060a0610ca0527f611740527f61611ae0527f1160527f527f6060610a40527f527f611420527f3153610ea0527f6061016061611b00527f1760527f610161026105e0526108611180527fe0527f7e5261611440527f0cc0611b20527f527f7fa0611780527f527f527f6106610ec0527fe0610a60527f527f036111a0611b40527f527f60611460527f616117a0527f0260527f325360556033536060610ce0527f611b60527f603453610ee0527f6109005261616117c0527f1480527f11c0527f7f60a0527f611b80527f6061610a80527f0600527e603553610700527f6117e0527f60610d006114a052611ba0527f7f610f00526111e0527f7f527f6060c0610220527f527f61611800527f028061611bc0527f0920527f52616114c0527f0aa0527f7f606101c0611200527f52610f20611820611be0527f527f527f7f36610d20527f53610180526114e0527f61062052610720527f7f7f611c00527f6000611840527f60611220527f375360806161610f40527f0ac0611500527f52611c20527f7f094052610d40611860527f527f7f52606060a05360fd611240527f60a16102611c40527f6102a052611520527f7f4052611880527f610f60527f7f536060610740527f61611c60527f0ae0610d6052611260527f7f527f6115406118a0527f527f6061064061096052611c80527f7f527fa260610f80527fc0526101e0527f7f536038616118c0527f1280611560611ca0527f527f527f60e0526101a0610d80527f527f610b00527f7f60a3610f6118e0527f611cc0527fa0527f53616107611580527f60526112a0527f610980527f7f02c0527f605361611ce0527f611900527f066052610da0527f7f6061026115a0527f60610fc0527f526112c0611d00527f527f7f610b611920527f20527fa453606060a553603960a65360616115c0527f611d20527f6109a0527f02610dc052611940527f7f616112e0527f0fe0527f610780527e52611d40527f7f6060a7536115e0527f60610b4052611960527f7e6102610680527fe0527f60611d60527f611300527fa8536060611000527f61611600527f611980527f0de0527fe06101611d80527f6109c0527f610280527f6107a0610b611320527f60527f527f6119a0527f6116611da0527f20527fc0527f52611020527f610100527f610e00527f7ff360a95360aa616119611dc0527fc0527f611340527f611640527f06a0527f606109e0527e61610361611040527f611de0527f0b80526119e0527f7e527f02205261610e20611660527f611360527f527f07c0611e00527f527f7f6000f06000611a00527f600060006102a0611060527f527f6061168052611e20527f7e610a0052611380527f610ba0611a20527f527f7f60610e40527e855a6106c0611e40527f527ff150616116a0527f01e0611080527f52611a40527f61076113a0527fe052611e60527f7f7f50610320527f60006000610b616116c0527f0e6052611a60527f7fc0527f611e80527f60610a20526110a06113c0527f527f7f61012052610240527f6116e0611a8052611ea0527f7f527f7e610100616106e0527f02610800610e80527f526113e0527f7fc06110611ec0527fc0611aa0527f527f611700527f610be0527f527f527f6000610a40527f60f35a611ee0527ff45061034052611ac0527f611400527f7f60611720527e54610ea06110e0527f611f00527f527f506000600060610261611ae0527f0c00527e527e6161086114611740527f611f20527f20527f20527f0700610a60527f527f61611b00527f1100527f6000610ec0527f611f40527f6000606102611760527f605261611440527f02e052611b20527f7f610c20527f611f60527f7ff95af161036052611120527f7f50611780527f610140526161611b40527f0e611f80527fe0611460527f527f08610a80527f40527f7f600054610720526117a0527f6161611fa0527f1b60527f0c40611140527f527f7f5060611480527f01610120526054610f0052611fc0527f7f610161611b80527f17c0527f405360610220527f61610aa052611160527f61611fe0527f14a0527f7f03005261611ba0527f0860610c6117e0527f60527f527f61038061612000527f0f20527f527f7f50610261074052611bc0527f6114c0527f6111805261180052612020527f7f7f7f80527f61014153606061610ac0527f01611be0527f610c80527f610f40612040527f527f6114e052611820527f7f42536000616111a0527f0161611c00527f610880612060527f527f016052604361018053606103a052611840527f61611500527f0760611c20612080527f527f527f61610f60527f6111c0527f610ca0527f0ae0527f7f53611860527f616120a0527f0320611c40527f527f61611520527f01815360616108a0527f6102a0527f61116120c0527fe0527f61611880611c60527f527f0f80527f0240527f60610c611540527fc0526120e0527f7f61018253610b00527f6060611c80527f61016118a0527f8361078061120052612100527f7f527f536103610f611560527fa0527fc0611ca0527f527f60616108c06118c0612120527f527f527f610ce0527f61018453610340611220527f52611cc0527f7f61158052612140527f7f610b20527f606118e0527f0161610fc0527f0185536044610186611ce0527f612160527f6102c0526107a0610d61126115a0527f40611900527f527e527f527f7f536061612180527f611d00527f08e0527f5361610fe0527f6161610b40527f03e05261611920527f6121a0527f15c0527f7f611d20527f02611260527f60527f0187536060610d20527f6101616121c0527f0360527f61611940527f611d40527f1000527f6115e0527f88536000616107616121e0527f1280527fc061090052610b60527f7f611d60527f611960527f527f0189536061612200527f610d611600527f40527f6101611020527f8a5361611d80527f12a0527f606119612220527f80527f01610400527f6102e0527f61018b611620527f536045611da0527f6101612240527f610b80527f8c61096119a0527f610d61106112c0527f40527f60527f2052611d612260527fc0527f7f61611640527f026107e0527f61036119c0527f80527f80527f536053612280527f61018d611de0527f53606112e0527f6104206110611660527f60527f6119e0526122a0527f7f610ba0610d8052611e00527f7f527f527f6061018e610940527f5360fd61136122c0527e527f611680611a00527f527f611e20527f61018f6161080052611080527f7f6122e0527f0300527f536061610da0527f6101610b611a611e40527f20527fc0526116a052612300527f7f611320527f7f906103a0527f5360016101616110a052611e60527f7f096061612320527f1a40527f527f91610440526116c0527f7f53606161611340527f0dc0611e8052612340527f7f527f02a052610820611a60527f52610be0527f7f7f6110c0526116e0527f7f612360527f46611ea0527f6101925360536101611360527f611a80527f9353606161610980612380527f52610de0527f611ec0527f7f0320611700527f527f616103c06110e052611aa06123a0527f527f7f527f016161138052611ee0527f7f0c00527f610460527f9461086117206123c0527f527f40527f5360611ac0527f0161610e611f00527e527f0195536061110052616123e0527f13a0527f7f47616109a052611740527f611ae052611f20527f7f7f0196536060612400527f61610c20527f6102c0527f0197536000610e206113c0527f52611f40527f6161612420527f1b00527f611760527f1120527f7f610198616161610860527f0480527f03611f612440527f60527f6109c0527fe0611b20527f610c406113611780527fe0527f527f527f03612460527f406111611f80527f40527f52610e40527f7f53611b40527f60f3610199536101612480527f9a606117a0527e60611fa0527e611400527ff0600060006061088052611b60526124a0527f7f7e611160527f61610c6052611fc0527f7f610e6117c0527f60527f09e0527f6124c0527f60611420527e611b80527f846104a0527f611fe0527f6102e052610400527f616124e0527f1180526117e0527f7f7f5af450610360611ba0527f52612000527f7f507f6114612500527f40527f610e80527f610c80527f6000606161611800527f0a005261612020527f612520527f1bc0527f7f08a06111a0527f527f02556002611460527f6001557f606104c052612540527f612040527f7e611820611be0527f527f610ea0527f6004556004610ca0527f54612560527f6111c0527f612060527f50611480527f606104611c00527f2052611840527f7f612580527f01610a20527f60015560612080527f6108c052610ec0527f7e61030061611c206125a0527f527f03616114a0527f611860527f116120a0527fe0527f80527f52610cc0527f6125c0527f7f60006104e052611c40527f7f600060600052616120c0527f0a40610e6118806125e0527f527f6114c0527fe0527f52611200527f7f611c60527f7e60f86120e0527f5af4612600527f5060026108e0527f610ce0526118a0527f7f610440526114e0527f611c806121612620527e527f527f7f6000556000527f61611220527f0f00527f600454506118c0527f612640527f600161612120527f610a611ca0527f60527f0500611500527f527f606103a061612660527f0d00527f527f0361612140527f12406118e0527f611cc0527f527f5561610961612680527f0f20527e527f0320611520527f612160527f527f60006003556061046052611c6126a0527fe0527f611900527f610a80527f7f03611260612180527f527f54610d20527f606126c0527f20611540527f610f611d00527f40527f527f611920527f6121a0527f506061056126e0527f20527e60005560610920527f01611280527f611d20527f60045561156121c052612700527f7f60527f6002611940527f6103c0610aa0610d610f60527f40527f52611d4052612720527f7f6121e0527f7f527f60006020527f556112a06115611960527f80527f527f61612740527f610480527f03612200527f611d60527f4052610540527f61094052610f80527f612760527f7f7f6061611980527f0d60612220527f526115a052611d80527f7f7e606112c0612780527f527f610ac0527e60006000600060f560612240527f40527f6119a0527f5af1616127a0527f1da0527f50606103610f6115c0527fa0527fe0527f612260527f016112e0527f6127c0527f545061610d80526119611dc0527fc0527f7f04a061096052610a612280527fe06127e0527f527f7f6115e0527f610560527f527f7f610fc0611de0527f5261136119e05261612800527f22a0527f7e527f7f600154506060600061036052610d611600527fa052611e00612820527f527f7f7f6122c0527f5360006040611a00527f527f600153610b00611320527f612840527f52610fe0527f7f611e6122e0527f20527f606109611620527f80527f60611a20612860527f527f60025361610580527f610dc0612300527f527f04611e40527e6104611340612880527f527fc0527f527f61164052611a40527f7f6061612320527f1000527f606052616128a0527f1e60527f7e6003610b20527f5360f36004536109a0526113612340527f6052616128c0527f1a60527f7f61166052611e80527f7f7f610de0527f60056060616110206123606128e0527f527f527f0380527e526105a0527f611a80527f611ea0527f6000602053606116612900527f8052612380527f7f611380527f610b40527ff36104e0527f610e00527f611ec0612920527f527f611aa0527f6123a0527f611040527f6060610420616116a0527f09c0527f612940527f526113a0527f7f611ee0527f6123c0527f60527f2153611ac0527f6000606080612960527f527f2261610b60527f05616116c0527f106123e0527f611f00527f60527f610e612980527f20527fc061611ae0527f13c0527f527f60006000f560612400527e606103a0616129a0527f1f20527f526109e06116e0527f527f61050052611b00527f7f7e612420527f606129c0527f611080527e606113e0611f40527f527e8461610e40527f0b80527f5a611700616129e0527f2440527f527f61611b20527f0440527ff45050611f60527f6105e0527f600260612a00527e611061612460527f1400527fa0527f557f60610a61611b40527f1720611f80612a20527f527f527e527f086061612480527f0e60527f80527f54610ba0527f60a0527f61612a40527f611420527f611b611fa0527f60526124a0527f7f052052611740527f6110c052612a60527f7f7f50600160006103c0527f6106005261611f6124c0527fc0527f0e8052611b612a80527f80527f7f7f556061611440611760527f527f0a20527f61616124e0527f0bc061612aa0527f611fe0527f10e0527f527f0460611ba0527f527f025450606060005360612500612ac0527f527f0360611780527f01612000527f53611460527f60610ea0527f54611bc052612ae0527f7f61612520527f0540527f60611100527f025360612020527f506106616117a0612b00527f527f610be0527f612540527f0a406114611be0527f80527f527f20527f606120612b20527f40527f0360006060610ec052612560527f7fc05261116117c0527f20527f7f61612b40527f1c00527fa0610361612060527f0480527f612580527f6114a0527fe0527f527f612b60527f526053610c00527f60206117e052611c2052612080526125a0527f7f7f7f6105612b80527f610a6052610e611140527fe0527f7f6114c0527f60527f610640526125c0527f612ba0527f7f6120a0527f53611c40527f60611800527f6060215360606022536060602361612bc0527f6125e0527f0c20527f61116120c0527f60526114e052611c60527f7f7f536004612be0527f6161182052612600527f7f0f00527f6024536061046120e0527f610a80527fa0612c00527f527f536060611c80527f612620527f610461066052611500527f611840527f61612c20527f2100527f7f611180527f610580527e612640527f610c40610f611ca0527f2052612c40527f7f527f527fe0527f25612120527f536060c05261612660527f1860527f611520612c60527f527f7f6060610aa0611cc0527f6111a0527f52612140527f7f612680527f2653612c80527f600060275360606028610f40611880527f527f53616161611ce0527f15616126612ca0527fa0527f2160527f40527f0c60527f610680527f04c06111c0527f527f6105a052612cc0527f6118a06126c0527f527f7f61612180527f1d00527f6005602953610ac0526115612ce0527f60527f7f60610f606126e0527f527f5360610420527f6121a0527f610c616161612d00527f1d20527f18c0527f11e0527f80612700527f527f2a5360610100527f61158052612d20527f6121c0527f7f60606106a0527f2b611d4052612720527f7f536060606118e052612d40527f7f610f80527f60e0527f6121e0527f611200527f610ae0612740527f527f6161612d60527f15a0611d60527f527f05c0610ca0527f61190052612200527f7f527f61276052612d80527f7f6104e0527f2c536060602d5360610fa0611d80527f52611220527f7f616122612da0527f20612780527f527f15c0527f0660611920527f2e53606106c0527f6104405261612dc0527f611da0527f0b6127a0527e61612240527f0cc0527f527f7f53602f5360606161612de0527f15611940527fe0527f126127c0527f40527f60611dc0612260527f527f610fc0612e00527f527f30616105e0527f0120527f53616127e0527f0500527f6000611960527f60612e20527f612280527f6106611de0527f611600527f610ce0612800527f52611260527f7f612e40527fe052610b20610fe0527f6122a0527f527f7f31611980611e00612820527f527f612e60527f527f5360606032536101611620527e527f6007606122c0527f61046061126128612e80527f40527f80527f52610600611e20527f527f6119a0527f610d00527f6110006122612ea0527fe0527f612860527f527f7f33611640527f5360536034610b40611e40527f527f612ec0527f53610700616119c0612880527f612300527f527f12a0527f527f606061052052612ee0527f7f60355360611660611e60527f6128a0527f527f610140612320527f61102052612f00527f7f610d6119e0527f20527f527ff3603653616128c0527f12c0527f60611e8052612f20527f7f612340527f6060376106610b611680527f60527f20526128e0527f611a0052612f40527f7f7f536008610720526110612360527f611ea0527f40527f7f60385361290052612f60527f7f61616112e0527f0d40526116a0527f611a20527f612380527f7f0480527f61612f80527f1e612920527fc0527f60536101610540527f20527f60610b80527f6110605261612fa0527f23a0527f7f39612940527f611300611a40527f611ee0527f6116c0527f527f53612fc0527f6060603a53606106616123612960527fc0527f0d60527f40610740527f527f09612fe0527f6061611f00527f611a60527f0160527f612980527f3b61166123e0527fe0527f613000527f5361611320527f1080527f6060603c5361611f20526129a0527f7f0ba0527f60613020527f611a612400527f80527e6104a0610d80527f52611700527f61056129c0527f60613040527f527f7f6061611f40527f1340612420527f527f3d53606161611aa0527f10a061613060527f29e0527f527f0760527ff360610660527f611720611f612440527f60527f527f613080527f3e53603f612a00527f610bc0527f610da0611ac0527f611360527f527f6000616130a0527f612460527f01405261612a20527f1f80527f606110c0527f60611740527f61016130c0527f6053606101611ae0527f61248052612a40527f7f80527e6101616107611fa0526130e0527f7f8052611380527f7f610580527f53610dc061612a60527f176124a0527f6052613100527f7f527f611b00527f610b61611fc0527f10e0527fe0527f61612a80527f610680613120527f527f046124c0527fc0527f6113a0527f60f06101626117611b20611fe0612aa0613140527f527f527f527f80527f536060616124e0527f0163536000610161610d61110052613160527f7fe0612ac0527f527f07a0527f64612000527f6113611b612500527f40527fc0613180527f527f6117a0527f612ae0527f610c00527f5360606101655360006105616120206131a0527f52612520527f7f06a0527fa0612b00527f527f611b60527f611120527f6161016131c0527f6117c0527f6113e0527f61612540527f0e612b20527f612040527e527fa0527f6131e0527f6104e0527f01611b80527f61610c20527f07c0527f61612b40527f2560527f66613200527f53606117612060527fe0527f6061611140611400527f527f016761612b60527f613220527f1ba0527f612580527f536000610168610e2052612080527f7f536060616106c0613240527f612b80527f611800527f527f01696125a0527f536105c061611bc0527f0c6114613260527f20526120a0612ba0527f527f7f4052611160527f7f527f606125c0527e6107e0613280527f527f611820527f61016a612bc0527f61611be0527f6120c0527f0e40527f53606132a0527f606125e0527f61016b61611440527f612be0527f0500527f6101c0611180527f6132c0527f611840526120e0527f611c612600527e527f7f52612c00527f7f53600061610c6132e0527f60527f06e0527f61016c610e611460527f606121612620527e612c20527f527f613300527f527f536061611c20527f08611860527e527f85616111a0527f016105e061612c613320527f40527f2640527f527f6d612120527f53605a61016e53606114611c40527f8052613340527f7ff261612c60527f61188052612660527f7f0c80527f610161612140527f0e80613360527f527f6f5360506111612c80527fc0527f6105611c6052612680527f7f20610700613380527f527f610861146118612160527f612ca0527fa0527fa0527f20527f527f6101706133a0527f6126a0527f53606101e052611c80527f7f50612cc0527f610c610ea0612180526133c0527f7f526111e0527f7fa0616126c0527f18c0527f527f6161612ce0527f14c0527f6133e0527f0600527f611ca0527f61016121a0527f715360606126e0527f610172612d0052613400527f7f5360006101610840527f616118e0527f07205261120052611c6121c0526127613420527e612d20527f527f7fc0527f7f6114e0527f7f610ec0527f735360610cc0527f613440527f606101746161612d40527f1900612720527f526121e0527f7f0540611ce0527f613460527f527f536000610175610620612d60527f611500527f6112612740527f20527f52613480527f7f53612200527f60f361610ee0611961612d80527f1d00527f20527f527f61086134a0527f60612760527f527f610200610ce0527f5261222052612da0527f7f60616115206134c0527f527f0740527f0161611d20612780527f527f124052611940527f612dc0527f7f6134e0527f6102205360612240527f766102215360610f00527f6127a0527f536102225361613500527f2de0527f6161611d40527f1540527f0560527f61612260527f1960527f610861613520527f27c0527f612e00527f80610d00611260527f527f527f60610640611d60527f52613540527f7f6161612280527f02612e20527f6127e0527f2361076161156052611980527f613560527f7f0f20527f60527f536001610224612e40527f611d805261612800527f22a052613580527f7f7f5360611280527f77610225536060610d20612e60527f526119a0527f7f616135a0527f1580612820527f527f61026122c0527f61611da0527f08a0612e80527f527f266135c0527f53610f40527f600061022753612840527f6112a0527f606119c06122e0612ea06135e0527f527f527f527ff3616106611dc0527f60526115a0527f612860527f610780527f613600527f7f05612ec0527f805260610d4052612300527f7f616105a0610f6119e052611d613620527f612880527fe052612ee0527f7f7f60527f536112c0527f60026115c052612320613640527f527f7f6108c0527f61056128612f00527fa0527fa15360286105a253611e0052613660527f7f60611a00527f536105a353612340527f612f20527f6060616128c0527f0561613680527f0d60526161126115e0527fe0527f0f80611e20527f52612f40527f7f7f6107a06136a0527f6123606128e0527f527f611a20527f527fa4610680527f536108e0612f60527f6136c0527f527f60006105a55360611e4052612900527f7f61612380527f1600527f6161056136e0527f612f80527f611300611a40527f527fa6536002610fa052612920527f7f61610d613700527f8052616123612fa0527fa0527f1e60527f7f05a75360296105a853611620527f613720527f60612940527f611a6052612fc0527f7f6107c0527f60616123c0527f61132052613740527f611e80527f7f610900527f61296052612fe0527f7f05a95360610fc0527f6106613760527fa0527e61611a6123e0527f80527f1640527f6161613000527f61612980527f1e613780527fa0527f0da0527f05aa5360606105611340527fab5361240052613020527f7f606137a0527e6105ac6129a0527f5360f5611aa0527f61611ec0527f05ad616116605261306137c0527f40527f7f610fe0527f612420527f6129c0527f07610920527fe0527f5360610d6137e0527f611360613060527f527f61611ee0527f1ac0527fc0527f606129e0527f612440613800527f527f6105ae536061613080527f1680527e616106c0527f05af53611000527f61613820527f1f00612a00527f527f606061616130a0527f2460527f05611ae0527fb0536000613840527f611380527f6105b1616116a0612a20527f526130c0527f7f0940527f61611f20613860527f612480527f527f0de0527f5360606108611b00527e52616130e0527f2a40527f613880527f7f6105b2611020527f5360006113a06124a0527f5261611f40527f16613100526138a0527f7fc0527f7f612a60527f6105b35360606105611b20527fb46106e0527f5361246138c0527fc0613120527f527f600061610e0052612a80527f611f60527f7f610960527f056138e0527f61106116e052613140527f7f406113c0611b6124e0527f4052612aa0527f7f52613900527f7f527fb553608461611f80613160527f527f05b6610820527f53605a6105b753613920527f606125612ac0527e527ff46105b86117613180527e52611b60527f7f53606161613940527f1fa0527f0e20526113e052612ae0527f7f7f50616131a0527f2520527f611060613960527f527f6105b953610980527f60610700611b8052611f612b00526131c0527f7fc0613980527f527f7f52611720612540527f527f6050610720536061610840611400527f61316139a0527fe0527f52612b20527f7f61072153616110611fe0527f612560527f80611ba0526139c0527f7f527f613200527f0e40527f6117612b40527f40527f60056107225360ba61076139e0527f6109a0527f612580613220527f527f612000527f23611420612b60527f527f61613a00527f1bc0527f536053610724536061613240527f6107611760527f6125a0527f2561613a20527f10a0612b80527f52612020527f7f53600561613260527f610e60527f07611be0613a40527f527f610860527f616125c052612ba0527f7f1440527f26613280527f5360bb61613a60527f07612040527f611780527f2753606109c0527f606107612bc0527f616132a052613a80527f7f6125e0527f1c00527f6110c0527f285360006107612060527f295360616114613aa0527f616132c0527f2be0527f60527f0e6117612600527fa0527f80527ff36107611c613ac0527f20527f2a53606132e0527e610761612c00527f2080527f2b6061088052606126613ae0527f20527e616110e0527f08613300527fa06109e0616117c052612c20527f7f1461613b00527f1c40527f806120a0527f527f612640613320527f527f527f5360606108a15361613b20527f0ea0612c40527f527f60006108a25360f56108a3613340527f53606161616120613b40527f612660527fc0527f1c60527f612c60527f17e0527f1100527f613360527f6114613b60527fa0527f606108a45360006108a55360612680527f610a612c80527e6120e06133613b80527f80527f527f527f6061611c80527f610ec052611800527f7f08a6536000612661613ba0527f2ca0526133a0527f7fa0527f6108a76114c0527f612100527f611120527f5360613bc0527f6061611ca0527f086133c0527fa8612cc0527f5360006126c0527f6108a95361613be0527f1820527f60606108612120527f6133e0527faa5360006161612ce0527f0a610e613c00527fe06114e0526126e0527f611cc0527f7f527f613400527f20527f611140527f08613c20527fab61612d00527f2140527f53611840527f608461612700613420527f527f08ac613c40527f53605a6108ad5360611ce052612d20527f7ff46108ae53606115612161344052613c60527f7f60527e527f5061612720527f08af53605061611860612d40527f527f0f0061613c80527f11613460527f60527f52611d00527f7f6108612180527f612740527fb0610a40613ca0527f612d60527f52613480527f6053610a60536061611520527f610a61611880527f613cc0527f536008611d2061276052616134a0527f2d80527f7f6121a0527f527f610a6253613ce0527f60b1610a63611180527f5360610f20526134c0527f7f60610a612da0527f6461613d00527f2780527f53611540616121c0527f18a0611d40527f6134e0527f527f527f6000613d20527f610a65612dc0527f5360f3610a666127a0527f53610a67600060613500527ef0613d40527f616121e0527f11a0527f6000612de0527f60611d60527e606118c05261276135613d60527f20527fc0527f7e60611560527f610f40526000610f61612e00527f2200527f60613d80527f536060613540527f610f6153600061616127e0527f1d80527f0f625360856161613da0527f612e20527f18e052613560527f7f6111c0527f612220527f0f63611580527f61613dc0527f2800527f53605a610f64612e40613580527f527f5360f1611da0527f610f6553613de0527f6050610f665360612240527f6119612820526135a0527f7e52612e60527f7f50613e00527f610f6753610f68600061116115a052611dc0527f7fe0526135c0527f60f36161613e20527f226128612e80527f40527f60527f12005360006112016000611920526135e052613e40527f7f7f6000f56000600060006000612ea0527f611de0612860527f527f60612280613e60527f52613600527f7e855af2506115c05260506115e0536115612ec0527fe1600061613e80527f194052606128613620527f80527ff36119605361616122a0527f1e0052601961613ea0527f1e612ee0527f2053606161613640527f1e21536060611e226128a0527f536000613ec0527f611e23536060611e246122612f00527f613660527fc0527f536000611e255360613ee0527ff0611e265360606128c0527f611e27536000611e28613680527f612f20527f53613f00527f6060611e2953606122e0527e611e2a536060611e2b536128e0526136a0527f7f613f20527f6000611e612f40527f2c536060611e2d536000611e2e53606061612300527f61613f40527f36c0527f1e2f5360006161290052612f60527f7f1e30536085611e3153605a61613f60527f1e3253606136e0527ff2611e33536050611e346123205260612f80527f536129613f80527f20527f612340536060613700527f61234153605061234253606161234353601e613fa0527f6123612fa0527f44536035612361613720527f2940527f455360536123465360613fc0527f6161234753601e6123485360612fc0527f3661613740527f234953606061234a613fe0527f53612960527f600061234b5360f361234c5360006123612f613760527fe0527f614000527f4d60006000f56000600060006000845a6129805260f46129a053605061613780614020527f527f29a153613000526060613020536050613021536061613022536029613023614040527f53606137a0527fa26130245360536130255360616130265360296130275360a3614060527f613028536060616137c0527f302953600061302a5360f361302b5361302c6000614080527f6000f06000600060006000846137e052605a6138005360f461380153605061386140a05260026140c05360536140c15360606140c25360506140c35360616140c45360386140c55360036140c65360536140c75360616140c85360386140c95360046140ca5360606140cb5360006140cc5360f36140cd5360006140ce60006000f560006000600060006000855af15050","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000001":"0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000002":"0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000004":"0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000006":"0x000000000000000000000000000000000000000000000000000000000000000c"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f8":{"code":"0x6003545060026002556000545060035450600054506000600455600354507f60025450600954506009545060065450600060015560085450600160005560076000527f5450606060005360006001536060600253600060035360fd60045360056000f36020526000604060006000f560006000600060006000855af150507f60015450600060005560015450600154506060600053600260015360606002536000527f60006003536055600453606060055360006006536060600753600060085360fd6020526060604053600960415360536042536060604353600a6044536060604553600060465360f36047536000604860006000f560006000600060006000855af2505060006000f3","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001":"0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000003":"0x0000000000000000000000000000000000000000000000000000000000000009"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000f9":{"code":"0x60006000556002600455600060006000600060fa5af45060016003557f60026001556060600053600060015360606002536000600353606060045360006000527f60055360606006536000600753606060085360006009536060600a5360f7600b6020527f53605a600c5360f1600d536050600e536060600f5360006010536060601153606040526000606053606060615360126062536053606353606060645360f360655360606066536013606753605360685360606069536014606a536060606b536000606c5360f3606d53606e60006000f060006000600060006000855af250506000600060006000600060f25af25060006000556004545060006001556001600455600160045560016001556000600355600154506000600060006000600060f15af2506000600060006000600060fa5af25060006000fd","storage":{"0x0000000000000000000000000000000000000000000000000000000000000000":"0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000001":"0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000002":"0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000005":"0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000006":"0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007":"0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009":"0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000b":"0x0000000000000000000000000000000000000000000000000000000000000004"},"balance":"0x0","nonce":"0x0"},"0x00000000000000000000000000000000000000fa":{"code":"0x600454506000545060016001557f60026003557f6000600060006000600060f45af25060006000600060006000606000527ff45af150600360005260546020536050602153606060225360006023536054606020527f2453605060255360606026536001602753605460285360506029536060602a536040527f6000602b536060602c536002602d536055602e536060602f536000603053606060605260606080536031608153605360825360606083536000608453606060855360326086536053608753606060885360f36089536060608a536033608b536053608c536060608d536034608e536060608f53600060905360f3609153609260006000f060006000600060006000855af15050600454506002600455600260045560006000fd","storage":{"0x0000000000000000000000000000000000000000000000000000000000000003":"0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000005":"0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000006":"0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000007":"0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000008":"0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000a":"0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000b":"0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000c":"0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000d":"0x0000000000000000000000000000000000000000000000000000000000000001"},"balance":"0x0","nonce":"0x0"},"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b":{"code":"0x","storage":{},"balance":"0xffffffff","nonce":"0x0"}},"transaction":{"gasPrice":"0x1","nonce":"0x0","to":"0x00000000000000000000000000000000000000f1","data":["0x3a5b355b564f179348262cdb949ded1f07c6a31a6e71c45293e6a084ceeb8d3c0e3045c9db96ffa17ede484c27ac3bbd4cf9261f69f966"],"gasLimit":["0x7a1200"],"value":["0xef3f54"],"secretKey":"0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8"},"out":"0x","post":{"Berlin":[{"hash":"0000000000000000000000000000000000000000000000000000000000000000","logs":"0000000000000000000000000000000000000000000000000000000000000000","indexes":{"data":0,"gas":0,"value":0}}]}}}

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://mainnet.infura.io/remix

While trying out the example in the README inside the docker image provided, I am receiving the following error:

# python3 utilities/opviewer.py --hash 0x9dbf0326a03a2a3719c27be4fa69aacc9857fd231a8d9dcaede4bb083def75ec -g /evm --no-docker

Traceback (most recent call last):
  File "utilities/opviewer.py", line 13, in <module>
    opviewer.main()
  File "/usr/lib/python3.6/site-packages/evmlab/tools/opviewer.py", line 1061, in main
    trace.reproduce(tx=args.hash, vm=vm)
  File "/usr/lib/python3.6/site-packages/evmlab/tools/opviewer.py", line 832, in reproduce
    artefacts, vm_args = reproduce.reproduceTx(tx, vm, self.api)
  File "/usr/lib/python3.6/site-packages/evmlab/reproduce.py", line 122, in reproduceTx
    tx = api.getTransaction(txhash)
  File "/usr/lib/python3.6/site-packages/evmlab/multiapi.py", line 77, in getTransaction
    obj = self.web3.eth.getTransaction(h)
  File "/usr/lib/python3.6/site-packages/web3/eth.py", line 196, in getTransaction
    [transaction_hash],
  File "/usr/lib/python3.6/site-packages/web3/manager.py", line 109, in request_blocking
    response = self._make_request(method, params)
  File "/usr/lib/python3.6/site-packages/web3/manager.py", line 92, in _make_request
    return request_func(method, params)
  File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__
  File "/usr/lib/python3.6/site-packages/web3/middleware/formatting.py", line 50, in apply_formatters
    response = make_request(method, params)
  File "/usr/lib/python3.6/site-packages/web3/middleware/gas_price_strategy.py", line 18, in middleware
    return make_request(method, params)
  File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__
  File "/usr/lib/python3.6/site-packages/web3/middleware/formatting.py", line 48, in apply_formatters
    response = make_request(method, formatted_params)
  File "/usr/lib/python3.6/site-packages/web3/middleware/attrdict.py", line 18, in middleware
    response = make_request(method, params)
  File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__
  File "/usr/lib/python3.6/site-packages/web3/middleware/formatting.py", line 50, in apply_formatters
    response = make_request(method, params)
  File "/usr/lib/python3.6/site-packages/web3/middleware/normalize_errors.py", line 9, in middleware
    result = make_request(method, params)
  File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__
  File "/usr/lib/python3.6/site-packages/web3/middleware/formatting.py", line 50, in apply_formatters
    response = make_request(method, params)
  File "cytoolz/functoolz.pyx", line 232, in cytoolz.functoolz.curry.__call__
  File "/usr/lib/python3.6/site-packages/web3/middleware/formatting.py", line 48, in apply_formatters
    response = make_request(method, formatted_params)
  File "/usr/lib/python3.6/site-packages/web3/middleware/exception_retry_request.py", line 80, in middleware
    return make_request(method, params)
  File "/usr/lib/python3.6/site-packages/web3/providers/rpc.py", line 68, in make_request
    **self.get_request_kwargs()
  File "/usr/lib/python3.6/site-packages/web3/utils/request.py", line 27, in make_post_request
    response.raise_for_status()
  File "/usr/lib/python3.6/site-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: https://mainnet.infura.io/remix

Improve testing-speed (for fast clients)

Example when executing with three clients, where one takes 100ms, one 200ms, and one takes 500ms.
The slowest determines the speed, which become 2 per second, but executed in two threads, so 4 per second:

INFO [01-23|09:00:32.640] Executing                                tests=62 time=16.000s test/s=3.9 "avg steps"=4.8 global=52060
INFO [01-23|09:00:32.641] Stats geth-0                             execSpeed=100.5ms longest=108.367159ms
INFO [01-23|09:00:32.641] Stats geth-1                             execSpeed=196.8ms longest=206.793057ms
INFO [01-23|09:00:32.641] Stats geth-2                             execSpeed=483.2ms longest=507.97227ms

An alternative way to operate would be to, instead of waiting for all n clients to
finish, wait only for 2 clients (or 3). Whenever the slowest is ready, it will execute
again, but the faster clients might execute a couple of tests in the meantime.

Right now, the test execution of client X is sent to a particular output stream

 client 0 -> outputstreams[0]
 client 1 -> outputstreams[1]
 client 2 -> outputstreams[2]

Therefore, once all clients are finished, we can compare all output streams. We don't
actually do that, becase the outputstreams are are dualWriters, a special type which
not only writes to an underlying writer (a file), but also into a hasher. So what we do is
compare the hashes. In nearly all cases, the hashes match.

If they do not match, we look at the actual output which was flushed to disk, and expect
to find a consensus flaw.

This procedure would need to change.

  • Each execution of a test should produce a hash, and the actual output discarded.
  • Thereby, a client which is finished with test M can continue N, O.. and
    we can retain the results until we no longer need it.
  • When we finally compare the hashes, and discover a mismatch, we need to
    pause the progression, and re-run the failing test, this time on all clients,
    and with full output-comparison enabled.

EVMOne minor incompatibility

root@a72fba356d78:/# /evmone --trace /fuzztmp/00161676-mixed-1.json.min 
Note: Google Test filter = -stCreateTest.CreateOOGafterMaxCodesize:stQuadraticComplexityTest.Call50000_sha256:stTimeConsuming.static_Call50000_sha256:stTimeConsuming.CALLBlake2f_MaxRounds:VMTests/vmPerformance.*:
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from /fuzztmp
[ RUN      ] /fuzztmp.00161676-mixed-1.json
unknown file: Failure
C++ exception with description "unexpected code with EOF prefix at 0x00000000000000000000000000000000000000f4" thrown in the test body.

[  FAILED  ] /fuzztmp.00161676-mixed-1.json (0 ms)
[----------] 1 test from /fuzztmp (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] /fuzztmp.00161676-mixed-1.json

testcase

{
  "00161676-mixed-1": {
    "env": {
      "currentCoinbase": "b94f5374fce5edbc8e2a8697c15331677e6ebf0b",
      "currentDifficulty": "0x200000",
      "currentRandom": "0x0000000000000000000000000000000000000000000000000000000000020000",
      "currentGasLimit": "0x26e1f476fe1e22",
      "currentNumber": "0x1",
      "currentTimestamp": "0x3e8",
      "previousHash": "0x044852b2a670ade5407e78fb2863c51de9fcb96542a07186fe3aeda6bb8a116d",
      "currentBaseFee": "0x10"
    },
    "pre": {
      "0x00000000000000000000000000000000000000f4": {
        "code": "0xef00",
        "storage": {},
        "balance": "0x0",
        "nonce": "0x0"
      }
    },
    "transaction": {
      "gasPrice": "0x10",
      "nonce": "0x0",
      "to": "0x00000000000000000000000000000000000000f1",
      "data": [
        "0x38"
      ],
      "gasLimit": [
        "0x0"
      ],
      "value": [
        "0x"
      ],
      "sender": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
      "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8"
    },
    "out": "0x",
    "post": {
      "Cancun": [
        {
          "hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "logs": "0x0000000000000000000000000000000000000000000000000000000000000000",
          "indexes": {
            "data": 0,
            "gas": 0,
            "value": 0
          }
        }
      ]
    }
  }
}

Geth accepts the state, and spits out a stateroot.

 /gethvm --json --noreturndata --nomemory statetest /fuzztmp/00161676-mixed-1.json.min
{"stateRoot": "0x53f6733a696cb3bbf77b635d96ace97f25ffee2d08d3e3d4ae1e566bfc060d6f"}
[
  {
    "name": "00161676-mixed-1",
    "pass": false,
    "stateRoot": "0x53f6733a696cb3bbf77b635d96ace97f25ffee2d08d3e3d4ae1e566bfc060d6f",
    "fork": "Cancun",
    "error": "unexpected error: intrinsic gas too low: have 0, want 21016"
  }
]

Question: tracing

Tracing appears to be a highly useful but delicate area of the client ecosystem, would it be possible to add some tracing to the fuzzer?

Improve tracediff

The tracediff only flags (in red) some things (gas, opcode etc), but not stuff buried more deeply, for example the stack.
tracediff

Needs a licence file

There needs to be some sort of a license file and copyright. Since you credit it as "based on EVMlab, which was written in Python" that makes me think it may need to be GPL v3 if it qualifies as a derivative work, or not.

Reth incompatibility

Reth has started using hexstrings for refund

revm err: json: cannot unmarshal string into Go struct field StructLog.refund of type uint64, line
	{"pc":15116,"op":97,"gas":"0x8f","gasCost":"0x8f","stack":["0xd2ea85a5aca10e903871bbaee8d0b01fbd9d25d081071745c45abe812642e38"],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"PUSH2"}

tracediff nethermind error

Test: https://gist.github.com/MariusVanDerWijden/f5fc11a972da46d4142b3a30bc36787a

~/goevmlab/cmd/tracediff/tracediff geth4 neth4                                                                                                                
panic: interface conversion: interface {} is string, not float64

goroutine 1 [running]:
github.com/holiman/goevmlab/traces.convertToStructLog(0xc0004547b0, 0x7e, 0x80, 0x664de0)
        /root/goevmlab/traces/reader.go:134 +0x87f
github.com/holiman/goevmlab/traces.readJsonLines(0x6fd080, 0xc000454240, 0xc2e02, 0x0, 0x6fd100)
        /root/goevmlab/traces/reader.go:307 +0x1dd
github.com/holiman/goevmlab/traces.ReadFile(0x7fffa9c3278b, 0x5, 0xc00011b710, 0x0, 0x0)
        /root/goevmlab/traces/reader.go:352 +0x18f
main.main()
        /root/goevmlab/cmd/tracediff/main.go:69 +0x2b0

Reth minor incompat

stderr out from a random test executed with docker run -a stderr -v /home/martin/workspace/fuzztmp:/fuzztmp --entrypoint /revme holiman/omnifuzzlocal statetest --json /fuzztmp/00000001-mixed-1.json:

{"pc":15112,"op":80,"gas":"0x97","gasCost":"0x0","stack":["0x0"],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"POP"}
{"pc":15113,"op":96,"gas":"0x95","gasCost":"0x95","stack":[],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"PUSH1"}
{"pc":15115,"op":81,"gas":"0x92","gasCost":"0x0","stack":["0x0"],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"MLOAD"}
{"pc":15116,"op":97,"gas":"0x8f","gasCost":"0x8f","stack":["0xd2ea85a5aca10e903871bbaee8d0b01fbd9d25d081071745c45abe812642e38"],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"PUSH2"}
{"pc":15119,"op":85,"gas":"0x8c","gasCost":"0x0","stack":["0xd2ea85a5aca10e903871bbaee8d0b01fbd9d25d081071745c45abe812642e38","0xb20"],"depth":1,"returnData":"0x","refund":"0x0","memSize":"128","opName":"SSTORE","error":"OutOfGas"}
{"stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000","output":"0x","gasUsed":"0x0","pass":false}
{"stateRoot":"0x53d9b277d29556c64dfd1ffb6d7b3e66a7cc0d12830b968a5ec4b74f4902455b","logsRoot":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","output":"0x","gasUsed":8000000,"pass":false,"errorMsg":"logs root mismatch: expected 0x0000000000000000000000000000000000000000000000000000000000000000, got 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","evmResult":"Ok","postLogsHash":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347","fork":"CANCUN","test":"00000001-mixed-1","d":0,"g":0,"v":0}
Error: Statetest(TestError { name: "00000001-mixed-1", kind: LogsRootMismatch { got: 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347, expected: 0x0000000000000000000000000000000000000000000000000000000000000000 } })

At the end, the Error... breaks the jsonl format

cc @rakita

Add `reth` to fuzzers

Would be nice to add reth.

  1. We need to be able to execute reth (or a reth-based binary) with a statetest as input.
  2. During execution, it needs to spit out jsonl per-opcode traces.

Is https://github.com/bluealloy/revm the thing to use?

cc @rakita @gakonst

Also, I need some build instructions.

The first step, after building it, would be to generate the outputs, based on the reference tests: https://github.com/holiman/goevmlab/tree/master/evms/testdata . That is, doing this, but for reth; https://github.com/holiman/goevmlab/blob/master/evms/testdata/run.sh .

Once we have the outputs, it's pretty easy to see if any particular tweaking in a reth-specific shim is needed.

Racy use of rand sources

See crash: https://gist.github.com/namiloh/edb596b92c3c433978f102c16c110ad1

https://github.com/golang/go/blob/master/src/math/rand/rand.go

// Random numbers are generated by a [Source], usually wrapped in a [Rand].
// Both types should be used by a single goroutine at a time: sharing among
// multiple goroutines requires some kind of synchronization.

The NewFieldElement() method uses a shared source

cc @MariusVanDerWijden might be relevant for other sources, like your fuzzers and the geth ones

Odd besu error

When running besu via goevmlab, there's something quirky about the options. Here I print the stderr output, and also print out the full command:

./sstoresloadfuzz -geth ~/go/src/github.com/ethereum/go-ethereum/build/bin/evm --besu ~/besu/ethereum/evmtool/build/install/evmtool/bin/evm --outdir /tmp --parallel 2
Generator started 
numThreads: 2
Fuzzing started 
CMD:
/home/martin/besu/ethereum/evmtool/build/install/evmtool/bin/evm --nomemory  --Xberlin-enabled=true --json state-test /tmp/00000000-storagefuzz-0.json
data: Unmatched argument at index 1: ' --Xberlin-enabled=true'
data: Usage:
data: 
data: evm [OPTIONS] [COMMAND]
data: 
data: Description:
data: 
data: This command evaluates EVM transactions.
data: 
data: Options:
data:       --code=<code>          Byte stream of code to be executed.
data:       --gas=<int>            Amount of gas for this invocation.
data:       --price=<int>          Price of gas (in GWei) for this invocation
data:       --sender=<address>     Calling address for this invocation.
data:       --receiver=<address>   Receiving address for this invocation.
data:       --input=<code>         The CALLDATA for this invocation
data:       --value=<int>          The amount of ether attached to this invocation
data:       --json                 Trace each opcode as a json object.
data:       --nomemory             Disable showing the full memory output for each op.
data:       --genesis, --prestate=<genesisFile>
data:                              The genesis file containing account data for this
data:                                invocation.
data:       --chain=<network>      Name of a well known network that will be used for
data:                                this invocation.
data:       --repeat=<repeat>      Number of times to repeat for benchmarking.
data:   -h, --help                 Show this help message and exit.
data:   -V, --version              Print version information and exit.
data:       --revert-reason-enabled[=<Boolean>]
data:                              Should revert reasons be persisted. (default: true)
data:       --key-value-storage=<keyValueStorageName>
data:                              Identity for the key-value storage to be used
data:                                (default: 'memory' alternate: 'rocksdb')
data:       --data-path=<PATH>     If using RocksDB storage, the path to Besu data
data:                                directory (default: /home/martin/build/data)
data:       --block-number=<blockParameter>
data:                              Block number to evaluate against (default:
data:                                'PENDING', or 'EARLIEST', 'LATEST', or a number)
data: Commands:
data:   state-test  Execute an Ethereum State Test.
data: 
data: Hyperledger Besu is licensed under the Apache License 2.0

However, if I take the exact command, /home/martin/besu/ethereum/evmtool/build/install/evmtool/bin/evm --nomemory --Xberlin-enabled=true --json state-test , and run it, then everything works.

I suspect the difference is that since evm is a shell-script, there's something that becomes differently interpreted when executing within my regular shell, as opposed to the golang exec.Command.

cc @MariusVanDerWijden

@shemnon , is there something special in how --Xberlin-enabled is interpreted ?

Update docs re building

My current build script

#!/bin/bash

function build_geth () {
 echo "Building geth"
 rm ./evm
 (cd go-ethereum && go build ./cmd/evm)
 ln -s ./go-ethereum/evm ./evm
 echo "Done"
 ls -la ./evm
}

function build_erigon () {
 echo "Building erigon"
 rm ./eri_vm
 (cd erigon && make evm)
 ln -s ./erigon/build/bin/evm ./eri_vm
 echo "Done"
 ls -la ./eri_vm
}

function build_fuzzer () {
 echo "Building fuzzer"
 rm ./fuzzer
 (cd goevmlab && go build ./cmd/generic-fuzzer/)
 ln -s ./goevmlab/generic-fuzzer ./fuzzer
 echo "Done"
 ls -la ./fuzzer
}

function build_nethermind () {

  rm ./nethtest

  ( cd nethermind/src/Nethermind/Nethermind.Test.Runner && dotnet publish --self-contained -r linux-x64 -c Release )
   ln -s ./nethermind/src/Nethermind/artifacts/bin/Nethermind.Test.Runner/release_linux-x64/nethtest ./nethtest
}

function build_nimbus () {
  echo "Building Nimbus evmstate"
  rm ./evmstate
  (cd ./nimbus && make -j4 update && make -j4 evmstate )
  ln -s ./nimbus/tools/evmstate/evmstate ./evmstate
}

function build_besu () {
  echo "Building besu-vm"
  rm ./besu-vm
  (cd besu && ./gradlew --parallel ethereum:evmtool:installDist)
  ln -s ./besu/ethereum/evmtool/build/install/evmtool/bin/evm besu-vm
}

function build_evmone () {
  echo "Building evmone"
  (cd evmone && cmake -S . -B build -DEVMONE_TESTING=ON -DEVMONE_PRECOMPILES_SILKPRE=1 && \
    cmake --build build --parallel )
}

build_fuzzer

build_geth
build_erigon
build_nethermind
build_nimbus

build_besu
build_evmone

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.