From 6681f8f4c2976da39835d7071ad3b86c7e87e302 Mon Sep 17 00:00:00 2001 From: AL Date: Fri, 5 Jul 2024 11:26:17 +0100 Subject: [PATCH 1/2] doc: internal audit of fix after C4A --- audits/README.md | 4 +++- audits/internal13/README.md | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 audits/internal13/README.md diff --git a/audits/README.md b/audits/README.md index 64d4995..24c513b 100644 --- a/audits/README.md +++ b/audits/README.md @@ -25,7 +25,9 @@ An internal audit with a focus on `OptimismMesseger and WormholeMessenger` is lo An internal audit with a focus on `Guard for Community Multisig (CM) (modular version)` is located in this folder: [internal audit 10](https://github.com/valory-xyz/autonolas-governance/blob/main/audits/internal10). -An internal audit with a focus on `VoteWeighting` is located in this folder: [internal audit 10](https://github.com/valory-xyz/autonolas-governance/blob/main/audits/internal12). +An internal audit with a focus on `VoteWeighting` is located in this folder: [internal audit 12](https://github.com/valory-xyz/autonolas-governance/blob/main/audits/internal12). + +An internal audit with a focus on `VoteWeighting` (after C4A external audit) is located in this folder: [internal audit 13](https://github.com/valory-xyz/autonolas-governance/blob/main/audits/internal13). ### External audit Following the initial contracts [audit report](https://github.com/valory-xyz/autonolas-governance/blob/main/audits/Valory%20Review%20Final.pdf), diff --git a/audits/internal13/README.md b/audits/internal13/README.md new file mode 100644 index 0000000..3080bb9 --- /dev/null +++ b/audits/internal13/README.md @@ -0,0 +1,44 @@ +# autonolas-governance-audit +The review has been performed based on the contract code in the following repository:
+`https://github.com/valory-xyz/autonolas-governance`
+commit: `59aa1c8732397c826bb67fc567b81b8d0cd82b00` or `tag: v1.2.2-pre-internal-audi`
+ +Update: 05-07-2024
+ +## Objectives +The audit focused on fixing VoteWeighting after C4A external audit.
+ +### Coverage +Hardhat coverage has been performed before the audit and can be found here: +```sh +--------------------------------------|----------|----------|----------|----------|----------------| +File | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines | +--------------------------------------|----------|----------|----------|----------|----------------| + VoteWeighting.sol | 100 | 98.94 | 100 | 99.56 | 484 | + + int128 userSlope = IVEOLAS(ve).getLastUserPoint(msg.sender).slope; + if (userSlope < 0) { + revert NegativeSlope(msg.sender, userSlope); + } +The fact that this case is not covered is not a problem, since it is very difficult to create such conditions in a real test. +``` +#### Checking the corrections made after C4A +64. Less active nominees can be left without rewards after an year of inactivity #64 +https://github.com/code-423n4/2024-05-olas-findings/issues/64
+[x] fixed + +36. pointsSum.slope Not Updated After Nominee Removal and Votes Revocation #36 +https://github.com/code-423n4/2024-05-olas-findings/issues/36
+[x] fixed + +16. Incorrect Handling of Last Nominee Removal in removeNominee Function #16 +https://github.com/code-423n4/2024-05-olas-findings/issues/16
+[x] fixed + +#### Low issue +QA Report #109 +https://github.com/code-423n4/2024-05-olas-findings/issues/109 +``` +Lack of event emission for important state changes in revokeRemovedNomineeVotingPower() +``` + From e94635bf05ab770b6757f79ac2caa883708ddabb Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 5 Jul 2024 20:34:18 +0100 Subject: [PATCH 2/2] refactor: addressing internal audit --- abis/0.8.25/VoteWeighting.json | 41 ++++++++++++++++++++++++++++++++-- audits/internal13/README.md | 1 + contracts/VoteWeighting.sol | 8 +++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/abis/0.8.25/VoteWeighting.json b/abis/0.8.25/VoteWeighting.json index 597e5ef..b6b055a 100644 --- a/abis/0.8.25/VoteWeighting.json +++ b/abis/0.8.25/VoteWeighting.json @@ -411,11 +411,48 @@ "internalType": "uint256", "name": "weight", "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "powerUsed", + "type": "uint256" } ], "name": "VoteForNominee", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "nominee", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "powerUsed", + "type": "uint256" + } + ], + "name": "VotingPowerRevoked", + "type": "event" + }, { "inputs": [], "name": "MAX_EVM_CHAIN_ID", @@ -1301,8 +1338,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561000f575f80fd5b5060405161303c38038061303c83398101604081905261002e9161017d565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b031916331790556001600160a01b03811660805262093a8061008181426101aa565b61008b91906101c9565b600e55506040805180820182525f8082526020808301828152600280546001808201835582865295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9183029182015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf90920191909155845180860190955282855290840182815260038054948501815590925292517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b929093029182019290925590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101556101f2565b5f6020828403121561018d575f80fd5b81516001600160a01b03811681146101a3575f80fd5b9392505050565b5f826101c457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101ec57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051612e246102185f395f818161035201528181611b210152611c1e0152612e245ff3fe608060405234801561000f575f80fd5b50600436106102e3575f3560e01c806388911e3211610187578063c54dd0d4116100dd578063e4a28a5211610093578063f4359ce51161006e578063f4359ce514610715578063f4da12ba1461071f578063f9572f7c14610727575f80fd5b8063e4a28a52146106ce578063ec73d906146106d7578063f0cd64af146106f6575f80fd5b8063d4b9d748116100c3578063d4b9d74814610671578063dc87f53614610684578063e09d894d146106ae575f80fd5b8063c54dd0d41461064b578063c88d47f01461065e575f80fd5b8063a51248031161013d578063beaf44e811610118578063beaf44e814610628578063c191ec481461063b578063c2c4c5c114610643575f80fd5b8063a5124803146105ee578063a6f9dae1146105f6578063b174b41c14610609575f80fd5b80638e28764b1161016d5780638e28764b1461058f5780639d175053146105c0578063a18f99ff146105e6575f80fd5b806388911e321461055d5780638da5cb5b14610570575f80fd5b8063456f09971161023c57806360d2d13d116101f25780637a75b27e116101cd5780637a75b27e146105005780637ee8bfe91461052057806385556a9514610533575f80fd5b806360d2d13d146104c55780636a95800f146104da5780636b39ac1a146104ed575f80fd5b80634cc32052116102225780634cc32052146104545780634f6ffd0714610467578063609c6b8714610471575f80fd5b8063456f099714610438578063482649971461044b575f80fd5b806327ebf5311161029c5780633b766b3d116102775780633b766b3d146103e7578063415970361461040f5780634479b5cf14610425575f80fd5b806327ebf531146103ac5780632a53b2af146103cc578063309ef15d146103df575f80fd5b80631b98dd90116102cc5780631b98dd901461032e5780631f8507161461034d57806326abaf2414610399575f80fd5b80630c423201146102e75780631765ab7f14610319575b5f80fd5b6103066102f53660046127d8565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b61032c6103273660046127ef565b61073a565b005b61030661033c3660046127d8565b600b6020525f908152604090205481565b6103747f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610310565b61032c6103a736600461291a565b610837565b6103bf6103ba3660046127d8565b6108fd565b604051610310919061299c565b61032c6103da3660046129db565b6109e5565b610306603581565b6103fa6103f53660046127d8565b610ac4565b60408051928352602083019190915201610310565b600e545f908152600c6020526040902054610306565b6103066104333660046127ef565b610af0565b6103066104463660046127ef565b610b72565b610306600e5481565b61032c6104623660046127ef565b610be3565b610306620d2f0081565b6104aa61047f3660046129f4565b600660209081525f928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610310565b6104cd610db3565b6040516103109190612a1c565b6103bf6104e83660046127d8565b610e22565b61032c6104fb3660046129f4565b610ed8565b61051361050e366004612a72565b611026565b6040516103109190612b4f565b6103fa61052e366004612b92565b611270565b6103066105413660046129f4565b600860209081525f928352604080842090915290825290205481565b61030661056b3660046127ef565b6112ed565b5f546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6103fa61059d3660046127ef565b600960209081525f92835260408084209091529082529020805460019091015482565b6103fa6105ce3660046127d8565b600c6020525f90815260409020805460019091015482565b61030661135e565b6104cd611374565b61032c6106043660046129db565b6113d9565b6103066106173660046127d8565b60056020525f908152604090205481565b61032c6106363660046127ef565b611503565b610306611567565b61032c611578565b61032c6106593660046127ef565b6115bc565b6103fa61066c366004612b92565b6119f1565b6103fa61067f3660046127d8565b611a0a565b6103066106923660046127ef565b600a60209081525f928352604080842090915290825290205481565b6001546103749073ffffffffffffffffffffffffffffffffffffffff1681565b61030661271081565b6103066106e53660046129db565b60076020525f908152604090205481565b6103066107043660046127d8565b60046020525f908152604090205481565b61030662093a8081565b610306611a19565b61032c610735366004612b92565b611a45565b81610771576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806024610787600267ffffffffffffffff612c15565b6107919190612c3b565b67ffffffffffffffff1610610815578060246107b6600267ffffffffffffffff612c15565b6107c09190612c3b565b6107d59067ffffffffffffffff166001612c63565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b6040805180820190915282815260208101829052610832816121a5565b505050565b8151835114158061084a57508051835114155b1561088e57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f5b83518110156108f7576108ef8482815181106108ae576108ae612c76565b60200260200101518483815181106108c8576108c8612c76565b60200260200101518484815181106108e2576108e2612c76565b6020026020010151611a45565b600101610890565b50505050565b604080518082019091525f80825260208201526002545f9061092190600190612ca3565b9050825f0361095c576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109a0576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600283815481106109b3576109b3612c76565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a56575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610ad3575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610b169184910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260098352818120600b8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610b989184910161299c565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600490925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610c0d919061299c565b60405160208183030381529060405280519060200120905060055f8281526020019081526020015f20545f03610c79576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b335f90815260066020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610cee576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610d565780515f838152600a6020908152604080832081860151845290915281208054909190610d27908490612ca3565b909155505080516040808301515f908152600d6020529081208054909190610d50908490612ca3565b90915550505b335f9081526007602090815260409091205490820151610d769082612ca3565b335f908152600760209081526040808320939093556006815282822095825294909452832083815560018101849055600201929092555050505050565b60606003805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610dd6565b50505050905090565b604080518082019091525f80825260208201526003545f90610e4690600190612ca3565b9050825f03610e81576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ec5576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600383815481106109b3576109b3612c76565b73ffffffffffffffffffffffffffffffffffffffff8216610f25576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610f5e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f73600267ffffffffffffffff612c15565b610f7d9190612c3b565b67ffffffffffffffff16811115610ff357806024610fa4600267ffffffffffffffff612c15565b610fae9190612c3b565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161080c565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff8316815260208101829052610832816121a5565b60608251845114158061103b57508151845114155b1561107f57835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b835167ffffffffffffffff8111156110995761109961280f565b6040519080825280602002602001820160405280156110c2578160200160208202803683370190505b5090505f5b8451811015611268575f60405180604001604052808784815181106110ee576110ee612c76565b6020026020010151815260200186848151811061110d5761110d612c76565b602002602001015181525090505f8160405160200161112c919061299c565b60405160208183030381529060405280519060200120905060045f8281526020019081526020015f20545f036111cd5786838151811061116e5761116e612c76565b602002602001015186848151811061118857611188612c76565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b620d2f0060085f8786815181106111e6576111e6612c76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546112419190612c63565b84848151811061125357611253612c76565b602090810291909101015250506001016110c7565b509392505050565b5f805f61127d8686612425565b905061128761260b565b50611293868686612703565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b604080518082018252838152602080820184905291515f9283916113139184910161299c565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600590925290205495945050505050565b6002545f9061136f90600190612ca3565b905090565b60606002805480602002602001604051908101604052809291908181526020015f9082821015610e19578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610dd6565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461144a575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b73ffffffffffffffffffffffffffffffffffffffff8116611497576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f61150e8383612425565b90505f61151961260b565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b6003545f9061136f90600190612ca3565b5f61158161260b565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461162d575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161080c565b5f60405180604001604052808481526020018381525090505f81604051602001611657919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935290822054909250908190036116e1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f6116ec8686612425565b90505f6116f761260b565b90505f62093a80806117098142612c63565b6117139190612cb6565b61171d9190612cc9565b5f8681526009602090815260408083208484528252808320839055888352600b90915281208290559091506117528484612ca3565b5f838152600c60209081526040808320849055600e869055600380548b855260058452828520819055600180820183559185528c5160029182027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101919091558d8501517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101558b85526004909352908320929092558054929350916117fb9190612ca3565b8154811061180b5761180b612c76565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919950611841918a910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291208790556002805491925089918890811061189e5761189e612c76565b905f5260205f2090600202015f820151815f01556020820151816001015590505060028054806118d0576118d0612ce0565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff1680156119a9576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b158015611992575f80fd5b505af11580156119a4573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f806119fe858585612703565b90969095509350505050565b60038181548110610ad3575f80fd5b6024611a2e600267ffffffffffffffff612c15565b611a389190612c3b565b67ffffffffffffffff1681565b5f604051806040016040528085815260200184815250604051602001611a6b919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600590935291205490915015611af1576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611b7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b9f9190612d35565b6020015190505f81600f0b1215611bee576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b602482015260440161080c565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611c78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c9c9190612dd7565b90505f62093a8080611cae8142612c63565b611cb89190612cb6565b611cc29190612cc9565b9050818110611d0d576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161080c565b612710851115611d54576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161080c565b335f908152600860209081526040808320878452909152812054611d7c90620d2f0090612c63565b905042811115611dc7576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161080c565b335f908152600660209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611e2b57838260400151611e1c9190612ca3565b8251611e289190612cc9565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611e589190612cc9565b611e629190612cb6565b8152602081018b905260400187905290505f611e7e8688612ca3565b8251611e8a9190612cc9565b335f90815260076020908152604090912054868201519185015192935091611eb29083612c63565b611ebc9190612ca3565b335f9081526007602052604090208190559050612710811115611f16576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161080c565b611f3482611f248f8f612425565b611f2e9190612c63565b856127b9565b5f8b81526009602090815260408083208b8452909152902055611f5982611f2461260b565b5f888152600c60205260409081902091909155850151871015611ffa5782515f8b81526009602090815260408083208b8452909152902060010154611fa891611fa191612c63565b86516127b9565b5f8b81526009602090815260408083208b845282528083206001908101949094558651600c90925290912090910154611fe491611fa191612c63565b5f888152600c6020526040902060010155612054565b82515f8b81526009602090815260408083208b845290915281206001018054909190612027908490612c63565b909155505082515f888152600c60205260408120600101805490919061204e908490612c63565b90915550505b42856040015111156120bc5784515f8b8152600a60209081526040808320818a015184529091528120805490919061208d908490612ca3565b909155505084516040808701515f908152600d60205290812080549091906120b6908490612ca3565b90915550505b82515f8b8152600a60209081526040808320818801518452909152812080549091906120e9908490612c63565b909155505082516040808501515f908152600d6020529081208054909190612112908490612c63565b9091555050335f8181526006602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600882528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b5f816040516020016121b7919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120549091501561224357815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f818152600560205260409020541561229857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b600280545f838152600460209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061231c8142612c63565b6123269190612cb6565b6123309190612cc9565b5f848152600b6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff1680156123de576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b1580156123c7575f80fd5b505af11580156123d9573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b604080518082018252838152602080820184905291515f92839161244b9184910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260059093529120549091501580156124a857505f81815260046020526040902054155b156124e9576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f818152600b6020908152604080832054600983528184208185528352818420825180840190935280548352600101549282019290925290915b60358110156125ff574283116125ff5761254062093a8084612c63565b92505f62093a8083602001516125569190612cc9565b905080835f015111156125ad5780835f018181516125749190612ca3565b9052505f858152600a6020908152604080832087845282529091205490840180518291906125a3908390612ca3565b9052506125b79050565b5f80845260208401525b5f85815260096020908152604080832087845282529091208451815590840151600190910155428411156125f6575f858152600b602052604090208490555b50600101612523565b50519695505050505050565b600e545f818152600c602090815260408083208151808301909252805482526001015491810191909152909190825b60358110156126fb574283116126fb5761265762093a8084612c63565b92505f62093a80836020015161266d9190612cc9565b905080835f015111156126bc5780835f0181815161268b9190612ca3565b9052505f848152600d602090815260409091205490840180518291906126b2908390612ca3565b9052506126c69050565b5f80845260208401525b5f848152600c602090815260409091208451815590840151600190910155428411156126f257600e8490555b5060010161263a565b505192915050565b5f808062093a806127148186612cb6565b61271e9190612cc9565b5f818152600c6020908152604080832054815180830183528b81528084018b90529151909650939450926127549184910161299c565b6040516020818303038152906040528051906020012090505f8411156127ae575f818152600960209081526040808320868452909152902054846127a082670de0b6b3a7640000612cc9565b6127aa9190612cb6565b9550505b505050935093915050565b5f8183116127c7575f6127d1565b6127d18284612ca3565b9392505050565b5f602082840312156127e8575f80fd5b5035919050565b5f8060408385031215612800575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128835761288361280f565b604052919050565b5f67ffffffffffffffff8211156128a4576128a461280f565b5060051b60200190565b5f82601f8301126128bd575f80fd5b813560206128d26128cd8361288b565b61283c565b8083825260208201915060208460051b8701019350868411156128f3575f80fd5b602086015b8481101561290f57803583529183019183016128f8565b509695505050505050565b5f805f6060848603121561292c575f80fd5b833567ffffffffffffffff80821115612943575f80fd5b61294f878388016128ae565b94506020860135915080821115612964575f80fd5b612970878388016128ae565b93506040860135915080821115612985575f80fd5b50612992868287016128ae565b9150509250925092565b815181526020808301519082015260408101610b6c565b803573ffffffffffffffffffffffffffffffffffffffff811681146129d6575f80fd5b919050565b5f602082840312156129eb575f80fd5b6127d1826129b3565b5f8060408385031215612a05575f80fd5b612a0e836129b3565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015612a6557612a5584835180518252602090810151910152565b9284019290850190600101612a38565b5091979650505050505050565b5f805f60608486031215612a84575f80fd5b833567ffffffffffffffff80821115612a9b575f80fd5b612aa7878388016128ae565b9450602091508186013581811115612abd575f80fd5b612ac9888289016128ae565b945050604086013581811115612add575f80fd5b86019050601f81018713612aef575f80fd5b8035612afd6128cd8261288b565b81815260059190911b82018301908381019089831115612b1b575f80fd5b928401925b82841015612b4057612b31846129b3565b82529284019290840190612b20565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612b8657835183529284019291840191600101612b6a565b50909695505050505050565b5f805f60608486031215612ba4575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612c2f57612c2f612bbb565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612c5c57612c5c612be8565b5092915050565b80820180821115610b6c57610b6c612be8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610b6c57610b6c612be8565b5f82612cc457612cc4612bbb565b500490565b8082028115828204841417610b6c57610b6c612be8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b81146129d6575f80fd5b805167ffffffffffffffff811681146129d6575f80fd5b5f60a08284031215612d45575f80fd5b60405160a0810181811067ffffffffffffffff82111715612d6857612d6861280f565b604052612d7483612d0d565b8152612d8260208401612d0d565b6020820152612d9360408401612d1e565b6040820152612da460608401612d1e565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612dcb575f80fd5b60808201529392505050565b5f60208284031215612de7575f80fd5b505191905056fea26469706673582212209a4d758d92b0c3dc78b8f6d0c1230aab53b26b352f6655717866934d93151a1c64736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e3575f3560e01c806388911e3211610187578063c54dd0d4116100dd578063e4a28a5211610093578063f4359ce51161006e578063f4359ce514610715578063f4da12ba1461071f578063f9572f7c14610727575f80fd5b8063e4a28a52146106ce578063ec73d906146106d7578063f0cd64af146106f6575f80fd5b8063d4b9d748116100c3578063d4b9d74814610671578063dc87f53614610684578063e09d894d146106ae575f80fd5b8063c54dd0d41461064b578063c88d47f01461065e575f80fd5b8063a51248031161013d578063beaf44e811610118578063beaf44e814610628578063c191ec481461063b578063c2c4c5c114610643575f80fd5b8063a5124803146105ee578063a6f9dae1146105f6578063b174b41c14610609575f80fd5b80638e28764b1161016d5780638e28764b1461058f5780639d175053146105c0578063a18f99ff146105e6575f80fd5b806388911e321461055d5780638da5cb5b14610570575f80fd5b8063456f09971161023c57806360d2d13d116101f25780637a75b27e116101cd5780637a75b27e146105005780637ee8bfe91461052057806385556a9514610533575f80fd5b806360d2d13d146104c55780636a95800f146104da5780636b39ac1a146104ed575f80fd5b80634cc32052116102225780634cc32052146104545780634f6ffd0714610467578063609c6b8714610471575f80fd5b8063456f099714610438578063482649971461044b575f80fd5b806327ebf5311161029c5780633b766b3d116102775780633b766b3d146103e7578063415970361461040f5780634479b5cf14610425575f80fd5b806327ebf531146103ac5780632a53b2af146103cc578063309ef15d146103df575f80fd5b80631b98dd90116102cc5780631b98dd901461032e5780631f8507161461034d57806326abaf2414610399575f80fd5b80630c423201146102e75780631765ab7f14610319575b5f80fd5b6103066102f53660046127d8565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b61032c6103273660046127ef565b61073a565b005b61030661033c3660046127d8565b600b6020525f908152604090205481565b6103747f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610310565b61032c6103a736600461291a565b610837565b6103bf6103ba3660046127d8565b6108fd565b604051610310919061299c565b61032c6103da3660046129db565b6109e5565b610306603581565b6103fa6103f53660046127d8565b610ac4565b60408051928352602083019190915201610310565b600e545f908152600c6020526040902054610306565b6103066104333660046127ef565b610af0565b6103066104463660046127ef565b610b72565b610306600e5481565b61032c6104623660046127ef565b610be3565b610306620d2f0081565b6104aa61047f3660046129f4565b600660209081525f928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610310565b6104cd610db3565b6040516103109190612a1c565b6103bf6104e83660046127d8565b610e22565b61032c6104fb3660046129f4565b610ed8565b61051361050e366004612a72565b611026565b6040516103109190612b4f565b6103fa61052e366004612b92565b611270565b6103066105413660046129f4565b600860209081525f928352604080842090915290825290205481565b61030661056b3660046127ef565b6112ed565b5f546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6103fa61059d3660046127ef565b600960209081525f92835260408084209091529082529020805460019091015482565b6103fa6105ce3660046127d8565b600c6020525f90815260409020805460019091015482565b61030661135e565b6104cd611374565b61032c6106043660046129db565b6113d9565b6103066106173660046127d8565b60056020525f908152604090205481565b61032c6106363660046127ef565b611503565b610306611567565b61032c611578565b61032c6106593660046127ef565b6115bc565b6103fa61066c366004612b92565b6119f1565b6103fa61067f3660046127d8565b611a0a565b6103066106923660046127ef565b600a60209081525f928352604080842090915290825290205481565b6001546103749073ffffffffffffffffffffffffffffffffffffffff1681565b61030661271081565b6103066106e53660046129db565b60076020525f908152604090205481565b6103066107043660046127d8565b60046020525f908152604090205481565b61030662093a8081565b610306611a19565b61032c610735366004612b92565b611a45565b81610771576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806024610787600267ffffffffffffffff612c15565b6107919190612c3b565b67ffffffffffffffff1610610815578060246107b6600267ffffffffffffffff612c15565b6107c09190612c3b565b6107d59067ffffffffffffffff166001612c63565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b6040805180820190915282815260208101829052610832816121a5565b505050565b8151835114158061084a57508051835114155b1561088e57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f5b83518110156108f7576108ef8482815181106108ae576108ae612c76565b60200260200101518483815181106108c8576108c8612c76565b60200260200101518484815181106108e2576108e2612c76565b6020026020010151611a45565b600101610890565b50505050565b604080518082019091525f80825260208201526002545f9061092190600190612ca3565b9050825f0361095c576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109a0576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600283815481106109b3576109b3612c76565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a56575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610ad3575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610b169184910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260098352818120600b8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610b989184910161299c565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600490925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610c0d919061299c565b60405160208183030381529060405280519060200120905060055f8281526020019081526020015f20545f03610c79576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b335f90815260066020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610cee576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4281604001511115610d565780515f838152600a6020908152604080832081860151845290915281208054909190610d27908490612ca3565b909155505080516040808301515f908152600d6020529081208054909190610d50908490612ca3565b90915550505b335f9081526007602090815260409091205490820151610d769082612ca3565b335f908152600760209081526040808320939093556006815282822095825294909452832083815560018101849055600201929092555050505050565b60606003805480602002602001604051908101604052809291908181526020015f905b82821015610e19578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610dd6565b50505050905090565b604080518082019091525f80825260208201526003545f90610e4690600190612ca3565b9050825f03610e81576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610ec5576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600383815481106109b3576109b3612c76565b73ffffffffffffffffffffffffffffffffffffffff8216610f25576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610f5e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024610f73600267ffffffffffffffff612c15565b610f7d9190612c3b565b67ffffffffffffffff16811115610ff357806024610fa4600267ffffffffffffffff612c15565b610fae9190612c3b565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161080c565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff8316815260208101829052610832816121a5565b60608251845114158061103b57508151845114155b1561107f57835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b835167ffffffffffffffff8111156110995761109961280f565b6040519080825280602002602001820160405280156110c2578160200160208202803683370190505b5090505f5b8451811015611268575f60405180604001604052808784815181106110ee576110ee612c76565b6020026020010151815260200186848151811061110d5761110d612c76565b602002602001015181525090505f8160405160200161112c919061299c565b60405160208183030381529060405280519060200120905060045f8281526020019081526020015f20545f036111cd5786838151811061116e5761116e612c76565b602002602001015186848151811061118857611188612c76565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b620d2f0060085f8786815181106111e6576111e6612c76565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f20546112419190612c63565b84848151811061125357611253612c76565b602090810291909101015250506001016110c7565b509392505050565b5f805f61127d8686612425565b905061128761260b565b50611293868686612703565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b604080518082018252838152602080820184905291515f9283916113139184910161299c565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600590925290205495945050505050565b6002545f9061136f90600190612ca3565b905090565b60606002805480602002602001604051908101604052809291908181526020015f9082821015610e19578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610dd6565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461144a575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b73ffffffffffffffffffffffffffffffffffffffff8116611497576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f61150e8383612425565b90505f61151961260b565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b6003545f9061136f90600190612ca3565b5f61158161260b565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461162d575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161080c565b5f60405180604001604052808481526020018381525090505f81604051602001611657919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935290822054909250908190036116e1576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f6116ec8686612425565b90505f6116f761260b565b90505f62093a80806117098142612c63565b6117139190612cb6565b61171d9190612cc9565b5f8681526009602090815260408083208484528252808320839055888352600b90915281208290559091506117528484612ca3565b5f838152600c60209081526040808320849055600e869055600380548b855260058452828520819055600180820183559185528c5160029182027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101919091558d8501517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101558b85526004909352908320929092558054929350916117fb9190612ca3565b8154811061180b5761180b612c76565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919950611841918a910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935291208790556002805491925089918890811061189e5761189e612c76565b905f5260205f2090600202015f820151815f01556020820151816001015590505060028054806118d0576118d0612ce0565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff1680156119a9576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b158015611992575f80fd5b505af11580156119a4573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f806119fe858585612703565b90969095509350505050565b60038181548110610ad3575f80fd5b6024611a2e600267ffffffffffffffff612c15565b611a389190612c3b565b67ffffffffffffffff1681565b5f604051806040016040528085815260200184815250604051602001611a6b919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600590935291205490915015611af1576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611b7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b9f9190612d35565b6020015190505f81600f0b1215611bee576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b602482015260440161080c565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611c78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c9c9190612dd7565b90505f62093a8080611cae8142612c63565b611cb89190612cb6565b611cc29190612cc9565b9050818110611d0d576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161080c565b612710851115611d54576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161080c565b335f908152600860209081526040808320878452909152812054611d7c90620d2f0090612c63565b905042811115611dc7576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161080c565b335f908152600660209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611e2b57838260400151611e1c9190612ca3565b8251611e289190612cc9565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611e589190612cc9565b611e629190612cb6565b8152602081018b905260400187905290505f611e7e8688612ca3565b8251611e8a9190612cc9565b335f90815260076020908152604090912054868201519185015192935091611eb29083612c63565b611ebc9190612ca3565b335f9081526007602052604090208190559050612710811115611f16576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161080c565b611f3482611f248f8f612425565b611f2e9190612c63565b856127b9565b5f8b81526009602090815260408083208b8452909152902055611f5982611f2461260b565b5f888152600c60205260409081902091909155850151871015611ffa5782515f8b81526009602090815260408083208b8452909152902060010154611fa891611fa191612c63565b86516127b9565b5f8b81526009602090815260408083208b845282528083206001908101949094558651600c90925290912090910154611fe491611fa191612c63565b5f888152600c6020526040902060010155612054565b82515f8b81526009602090815260408083208b845290915281206001018054909190612027908490612c63565b909155505082515f888152600c60205260408120600101805490919061204e908490612c63565b90915550505b42856040015111156120bc5784515f8b8152600a60209081526040808320818a015184529091528120805490919061208d908490612ca3565b909155505084516040808701515f908152600d60205290812080549091906120b6908490612ca3565b90915550505b82515f8b8152600a60209081526040808320818801518452909152812080549091906120e9908490612c63565b909155505082516040808501515f908152600d6020529081208054909190612112908490612c63565b9091555050335f8181526006602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600882528083208e845282529182902042905581518f81529081018e90528f92917f4e44aa6a7d9639e4546a021e5baf51f7aae3bcd1f96e0f5f26880d6834b737ee910160405180910390a350505050505050505050505050565b5f816040516020016121b7919061299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120549091501561224357815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f818152600560205260409020541561229857815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b600280545f838152600460209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061231c8142612c63565b6123269190612cb6565b6123309190612cc9565b5f848152600b6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff1680156123de576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b1580156123c7575f80fd5b505af11580156123d9573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b604080518082018252838152602080820184905291515f92839161244b9184910161299c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260059093529120549091501580156124a857505f81815260046020526040902054155b156124e9576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f818152600b6020908152604080832054600983528184208185528352818420825180840190935280548352600101549282019290925290915b60358110156125ff574283116125ff5761254062093a8084612c63565b92505f62093a8083602001516125569190612cc9565b905080835f015111156125ad5780835f018181516125749190612ca3565b9052505f858152600a6020908152604080832087845282529091205490840180518291906125a3908390612ca3565b9052506125b79050565b5f80845260208401525b5f85815260096020908152604080832087845282529091208451815590840151600190910155428411156125f6575f858152600b602052604090208490555b50600101612523565b50519695505050505050565b600e545f818152600c602090815260408083208151808301909252805482526001015491810191909152909190825b60358110156126fb574283116126fb5761265762093a8084612c63565b92505f62093a80836020015161266d9190612cc9565b905080835f015111156126bc5780835f0181815161268b9190612ca3565b9052505f848152600d602090815260409091205490840180518291906126b2908390612ca3565b9052506126c69050565b5f80845260208401525b5f848152600c602090815260409091208451815590840151600190910155428411156126f257600e8490555b5060010161263a565b505192915050565b5f808062093a806127148186612cb6565b61271e9190612cc9565b5f818152600c6020908152604080832054815180830183528b81528084018b90529151909650939450926127549184910161299c565b6040516020818303038152906040528051906020012090505f8411156127ae575f818152600960209081526040808320868452909152902054846127a082670de0b6b3a7640000612cc9565b6127aa9190612cb6565b9550505b505050935093915050565b5f8183116127c7575f6127d1565b6127d18284612ca3565b9392505050565b5f602082840312156127e8575f80fd5b5035919050565b5f8060408385031215612800575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128835761288361280f565b604052919050565b5f67ffffffffffffffff8211156128a4576128a461280f565b5060051b60200190565b5f82601f8301126128bd575f80fd5b813560206128d26128cd8361288b565b61283c565b8083825260208201915060208460051b8701019350868411156128f3575f80fd5b602086015b8481101561290f57803583529183019183016128f8565b509695505050505050565b5f805f6060848603121561292c575f80fd5b833567ffffffffffffffff80821115612943575f80fd5b61294f878388016128ae565b94506020860135915080821115612964575f80fd5b612970878388016128ae565b93506040860135915080821115612985575f80fd5b50612992868287016128ae565b9150509250925092565b815181526020808301519082015260408101610b6c565b803573ffffffffffffffffffffffffffffffffffffffff811681146129d6575f80fd5b919050565b5f602082840312156129eb575f80fd5b6127d1826129b3565b5f8060408385031215612a05575f80fd5b612a0e836129b3565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015612a6557612a5584835180518252602090810151910152565b9284019290850190600101612a38565b5091979650505050505050565b5f805f60608486031215612a84575f80fd5b833567ffffffffffffffff80821115612a9b575f80fd5b612aa7878388016128ae565b9450602091508186013581811115612abd575f80fd5b612ac9888289016128ae565b945050604086013581811115612add575f80fd5b86019050601f81018713612aef575f80fd5b8035612afd6128cd8261288b565b81815260059190911b82018301908381019089831115612b1b575f80fd5b928401925b82841015612b4057612b31846129b3565b82529284019290840190612b20565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612b8657835183529284019291840191600101612b6a565b50909695505050505050565b5f805f60608486031215612ba4575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612c2f57612c2f612bbb565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612c5c57612c5c612be8565b5092915050565b80820180821115610b6c57610b6c612be8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610b6c57610b6c612be8565b5f82612cc457612cc4612bbb565b500490565b8082028115828204841417610b6c57610b6c612be8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b81146129d6575f80fd5b805167ffffffffffffffff811681146129d6575f80fd5b5f60a08284031215612d45575f80fd5b60405160a0810181811067ffffffffffffffff82111715612d6857612d6861280f565b604052612d7483612d0d565b8152612d8260208401612d0d565b6020820152612d9360408401612d1e565b6040820152612da460608401612d1e565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612dcb575f80fd5b60808201529392505050565b5f60208284031215612de7575f80fd5b505191905056fea26469706673582212209a4d758d92b0c3dc78b8f6d0c1230aab53b26b352f6655717866934d93151a1c64736f6c63430008190033", + "bytecode": "0x60a060405234801561000f575f80fd5b5060405161312e38038061312e83398101604081905261002e9161017d565b6001600160a01b0381166100555760405163d92e233d60e01b815260040160405180910390fd5b5f80546001600160a01b031916331790556001600160a01b03811660805262093a8061008181426101aa565b61008b91906101c9565b600e55506040805180820182525f8082526020808301828152600280546001808201835582865295517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9183029182015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf90920191909155845180860190955282855290840182815260038054948501815590925292517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b929093029182019290925590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101556101f2565b5f6020828403121561018d575f80fd5b81516001600160a01b03811681146101a3575f80fd5b9392505050565b5f826101c457634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176101ec57634e487b7160e01b5f52601160045260245ffd5b92915050565b608051612f166102185f395f818161035201528181611c0b0152611d080152612f165ff3fe608060405234801561000f575f80fd5b50600436106102e3575f3560e01c806388911e3211610187578063c54dd0d4116100dd578063e4a28a5211610093578063f4359ce51161006e578063f4359ce514610715578063f4da12ba1461071f578063f9572f7c14610727575f80fd5b8063e4a28a52146106ce578063ec73d906146106d7578063f0cd64af146106f6575f80fd5b8063d4b9d748116100c3578063d4b9d74814610671578063dc87f53614610684578063e09d894d146106ae575f80fd5b8063c54dd0d41461064b578063c88d47f01461065e575f80fd5b8063a51248031161013d578063beaf44e811610118578063beaf44e814610628578063c191ec481461063b578063c2c4c5c114610643575f80fd5b8063a5124803146105ee578063a6f9dae1146105f6578063b174b41c14610609575f80fd5b80638e28764b1161016d5780638e28764b1461058f5780639d175053146105c0578063a18f99ff146105e6575f80fd5b806388911e321461055d5780638da5cb5b14610570575f80fd5b8063456f09971161023c57806360d2d13d116101f25780637a75b27e116101cd5780637a75b27e146105005780637ee8bfe91461052057806385556a9514610533575f80fd5b806360d2d13d146104c55780636a95800f146104da5780636b39ac1a146104ed575f80fd5b80634cc32052116102225780634cc32052146104545780634f6ffd0714610467578063609c6b8714610471575f80fd5b8063456f099714610438578063482649971461044b575f80fd5b806327ebf5311161029c5780633b766b3d116102775780633b766b3d146103e7578063415970361461040f5780634479b5cf14610425575f80fd5b806327ebf531146103ac5780632a53b2af146103cc578063309ef15d146103df575f80fd5b80631b98dd90116102cc5780631b98dd901461032e5780631f8507161461034d57806326abaf2414610399575f80fd5b80630c423201146102e75780631765ab7f14610319575b5f80fd5b6103066102f53660046128ca565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b61032c6103273660046128e1565b61073a565b005b61030661033c3660046128ca565b600b6020525f908152604090205481565b6103747f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610310565b61032c6103a7366004612a0c565b610837565b6103bf6103ba3660046128ca565b6108fd565b6040516103109190612a8e565b61032c6103da366004612acd565b6109e5565b61030660fa81565b6103fa6103f53660046128ca565b610ac4565b60408051928352602083019190915201610310565b600e545f908152600c6020526040902054610306565b6103066104333660046128e1565b610af0565b6103066104463660046128e1565b610b72565b610306600e5481565b61032c6104623660046128e1565b610be3565b610306620d2f0081565b6104aa61047f366004612ae6565b600660209081525f928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610310565b6104cd610e90565b6040516103109190612b0e565b6103bf6104e83660046128ca565b610eff565b61032c6104fb366004612ae6565b610fb5565b61051361050e366004612b64565b611103565b6040516103109190612c41565b6103fa61052e366004612c84565b61134d565b610306610541366004612ae6565b600860209081525f928352604080842090915290825290205481565b61030661056b3660046128e1565b6113ca565b5f546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6103fa61059d3660046128e1565b600960209081525f92835260408084209091529082529020805460019091015482565b6103fa6105ce3660046128ca565b600c6020525f90815260409020805460019091015482565b61030661143b565b6104cd611451565b61032c610604366004612acd565b6114b6565b6103066106173660046128ca565b60056020525f908152604090205481565b61032c6106363660046128e1565b6115e0565b610306611644565b61032c611655565b61032c6106593660046128e1565b611699565b6103fa61066c366004612c84565b611adb565b6103fa61067f3660046128ca565b611af4565b6103066106923660046128e1565b600a60209081525f928352604080842090915290825290205481565b6001546103749073ffffffffffffffffffffffffffffffffffffffff1681565b61030661271081565b6103066106e5366004612acd565b60076020525f908152604090205481565b6103066107043660046128ca565b60046020525f908152604090205481565b61030662093a8081565b610306611b03565b61032c610735366004612c84565b611b2f565b81610771576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806024610787600267ffffffffffffffff612d07565b6107919190612d2d565b67ffffffffffffffff1610610815578060246107b6600267ffffffffffffffff612d07565b6107c09190612d2d565b6107d59067ffffffffffffffff166001612d55565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b604080518082019091528281526020810182905261083281612297565b505050565b8151835114158061084a57508051835114155b1561088e57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f5b83518110156108f7576108ef8482815181106108ae576108ae612d68565b60200260200101518483815181106108c8576108c8612d68565b60200260200101518484815181106108e2576108e2612d68565b6020026020010151611b2f565b600101610890565b50505050565b604080518082019091525f80825260208201526002545f9061092190600190612d95565b9050825f0361095c576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109a0576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600283815481106109b3576109b3612d68565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a56575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610ad3575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610b1691849101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260098352818120600b8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610b9891849101612a8e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600490925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610c0d9190612a8e565b60405160208183030381529060405280519060200120905060055f8281526020019081526020015f20545f03610c79576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b335f90815260066020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610cee576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62093a8080610cfe8142612d55565b610d089190612da8565b610d129190612dbb565b90508082604001511115610d90575f8381526009602090815260408083208484529091529020600101548251610d489190612517565b5f8481526009602090815260408083208584528252808320600190810194909455600c909152902001548251610d7e9190612517565b5f828152600c60205260409020600101555b4282604001511115610df85781515f848152600a6020908152604080832081870151845290915281208054909190610dc9908490612d95565b909155505081516040808401515f908152600d6020529081208054909190610df2908490612d95565b90915550505b335f9081526007602090815260409091205490830151610e189082612d95565b335f818152600760209081526040808320859055600682528083208984528252808320838155600181018490556002019290925581518a815290810184905292935089927fdd51e30c8eb611cdb0d3c03313d68eb1a94bff48fb7d3a612348ed5f72b5f175910160405180910390a350505050505050565b60606003805480602002602001604051908101604052809291908181526020015f905b82821015610ef6578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610eb3565b50505050905090565b604080518082019091525f80825260208201526003545f90610f2390600190612d95565b9050825f03610f5e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610fa2576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600383815481106109b3576109b3612d68565b73ffffffffffffffffffffffffffffffffffffffff8216611002576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f0361103b576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024611050600267ffffffffffffffff612d07565b61105a9190612d2d565b67ffffffffffffffff168111156110d057806024611081600267ffffffffffffffff612d07565b61108b9190612d2d565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161080c565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261083281612297565b60608251845114158061111857508151845114155b1561115c57835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b835167ffffffffffffffff81111561117657611176612901565b60405190808252806020026020018201604052801561119f578160200160208202803683370190505b5090505f5b8451811015611345575f60405180604001604052808784815181106111cb576111cb612d68565b602002602001015181526020018684815181106111ea576111ea612d68565b602002602001015181525090505f816040516020016112099190612a8e565b60405160208183030381529060405280519060200120905060045f8281526020019081526020015f20545f036112aa5786838151811061124b5761124b612d68565b602002602001015186848151811061126557611265612d68565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b620d2f0060085f8786815181106112c3576112c3612d68565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461131e9190612d55565b84848151811061133057611330612d68565b602090810291909101015250506001016111a4565b509392505050565b5f805f61135a8686612536565b905061136461271c565b50611370868686612814565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b604080518082018252838152602080820184905291515f9283916113f091849101612a8e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600590925290205495945050505050565b6002545f9061144c90600190612d95565b905090565b60606002805480602002602001604051908101604052809291908181526020015f9082821015610ef6578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610eb3565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611527575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b73ffffffffffffffffffffffffffffffffffffffff8116611574576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f6115eb8383612536565b90505f6115f661271c565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b6003545f9061144c90600190612d95565b5f61165e61271c565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461170a575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161080c565b5f60405180604001604052808481526020018381525090505f816040516020016117349190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935290822054909250908190036117be576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f6117c98686612536565b90505f6117d461271c565b90505f62093a80806117e68142612d55565b6117f09190612da8565b6117fa9190612dbb565b5f8681526009602090815260408083208484528252808320839055888352600b909152812082905590915061182f8484612d95565b5f838152600c60209081526040808320849055600e869055600380548b855260058452828520819055600180820183559185528c5160029182027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101919091558d8501517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101558b85526004909352908320839055905492935090916118d89190612d95565b905060018111156119a957600281815481106118f6576118f6612d68565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919a5061192c918b9101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120889055600280549192508a918990811061198957611989612d68565b5f9182526020918290208351600290920201908155910151600190910155505b60028054806119ba576119ba612dd2565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff168015611a93576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b158015611a7c575f80fd5b505af1158015611a8e573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f80611ae8858585612814565b90969095509350505050565b60038181548110610ad3575f80fd5b6024611b18600267ffffffffffffffff612d07565b611b229190612d2d565b67ffffffffffffffff1681565b5f604051806040016040528085815260200184815250604051602001611b559190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600590935291205490915015611bdb576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c899190612e27565b6020015190505f81600f0b1215611cd8576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b602482015260440161080c565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d869190612ec9565b90505f62093a8080611d988142612d55565b611da29190612da8565b611dac9190612dbb565b9050818110611df7576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161080c565b612710851115611e3e576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161080c565b335f908152600860209081526040808320878452909152812054611e6690620d2f0090612d55565b905042811115611eb1576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161080c565b335f908152600660209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611f1557838260400151611f069190612d95565b8251611f129190612dbb565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611f429190612dbb565b611f4c9190612da8565b8152602081018b905260400187905290505f611f688688612d95565b8251611f749190612dbb565b335f90815260076020908152604090912054868201519185015192935091611f9c9083612d55565b611fa69190612d95565b335f9081526007602052604090208190559050612710811115612000576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161080c565b61201e8261200e8f8f612536565b6120189190612d55565b85612517565b5f8b81526009602090815260408083208b84529091529020556120438261200e61271c565b5f888152600c602052604090819020919091558501518710156120e45782515f8b81526009602090815260408083208b84529091529020600101546120929161208b91612d55565b8651612517565b5f8b81526009602090815260408083208b845282528083206001908101949094558651600c909252909120909101546120ce9161208b91612d55565b5f888152600c602052604090206001015561213e565b82515f8b81526009602090815260408083208b845290915281206001018054909190612111908490612d55565b909155505082515f888152600c602052604081206001018054909190612138908490612d55565b90915550505b42856040015111156121a65784515f8b8152600a60209081526040808320818a0151845290915281208054909190612177908490612d95565b909155505084516040808701515f908152600d60205290812080549091906121a0908490612d95565b90915550505b82515f8b8152600a60209081526040808320818801518452909152812080549091906121d3908490612d55565b909155505082516040808501515f908152600d60205290812080549091906121fc908490612d55565b9091555050335f8181526006602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600882528083208e845282529182902042905581518f81529081018e90529081018390528e91907f02dd4023faa881388c9531361f57d7cbb10d03f5b3f810ea0458960ac8ebdb029060600160405180910390a350505050505050505050505050565b5f816040516020016122a99190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120549091501561233557815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f818152600560205260409020541561238a57815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b600280545f838152600460209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061240e8142612d55565b6124189190612da8565b6124229190612dbb565b5f848152600b6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff1680156124d0576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b1580156124b9575f80fd5b505af11580156124cb573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b5f818311612525575f61252f565b61252f8284612d95565b9392505050565b604080518082018252838152602080820184905291515f92839161255c91849101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260059093529120549091501580156125b957505f81815260046020526040902054155b156125fa576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f818152600b6020908152604080832054600983528184208185528352818420825180840190935280548352600101549282019290925290915b60fa811015612710574283116127105761265162093a8084612d55565b92505f62093a8083602001516126679190612dbb565b905080835f015111156126be5780835f018181516126859190612d95565b9052505f858152600a6020908152604080832087845282529091205490840180518291906126b4908390612d95565b9052506126c89050565b5f80845260208401525b5f8581526009602090815260408083208784528252909120845181559084015160019091015542841115612707575f858152600b602052604090208490555b50600101612634565b50519695505050505050565b600e545f818152600c602090815260408083208151808301909252805482526001015491810191909152909190825b60fa81101561280c5742831161280c5761276862093a8084612d55565b92505f62093a80836020015161277e9190612dbb565b905080835f015111156127cd5780835f0181815161279c9190612d95565b9052505f848152600d602090815260409091205490840180518291906127c3908390612d95565b9052506127d79050565b5f80845260208401525b5f848152600c6020908152604090912084518155908401516001909101554284111561280357600e8490555b5060010161274b565b505192915050565b5f808062093a806128258186612da8565b61282f9190612dbb565b5f818152600c6020908152604080832054815180830183528b81528084018b905291519096509394509261286591849101612a8e565b6040516020818303038152906040528051906020012090505f8411156128bf575f818152600960209081526040808320868452909152902054846128b182670de0b6b3a7640000612dbb565b6128bb9190612da8565b9550505b505050935093915050565b5f602082840312156128da575f80fd5b5035919050565b5f80604083850312156128f2575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561297557612975612901565b604052919050565b5f67ffffffffffffffff82111561299657612996612901565b5060051b60200190565b5f82601f8301126129af575f80fd5b813560206129c46129bf8361297d565b61292e565b8083825260208201915060208460051b8701019350868411156129e5575f80fd5b602086015b84811015612a0157803583529183019183016129ea565b509695505050505050565b5f805f60608486031215612a1e575f80fd5b833567ffffffffffffffff80821115612a35575f80fd5b612a41878388016129a0565b94506020860135915080821115612a56575f80fd5b612a62878388016129a0565b93506040860135915080821115612a77575f80fd5b50612a84868287016129a0565b9150509250925092565b815181526020808301519082015260408101610b6c565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ac8575f80fd5b919050565b5f60208284031215612add575f80fd5b61252f82612aa5565b5f8060408385031215612af7575f80fd5b612b0083612aa5565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015612b5757612b4784835180518252602090810151910152565b9284019290850190600101612b2a565b5091979650505050505050565b5f805f60608486031215612b76575f80fd5b833567ffffffffffffffff80821115612b8d575f80fd5b612b99878388016129a0565b9450602091508186013581811115612baf575f80fd5b612bbb888289016129a0565b945050604086013581811115612bcf575f80fd5b86019050601f81018713612be1575f80fd5b8035612bef6129bf8261297d565b81815260059190911b82018301908381019089831115612c0d575f80fd5b928401925b82841015612c3257612c2384612aa5565b82529284019290840190612c12565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612c7857835183529284019291840191600101612c5c565b50909695505050505050565b5f805f60608486031215612c96575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612d2157612d21612cad565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612d4e57612d4e612cda565b5092915050565b80820180821115610b6c57610b6c612cda565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610b6c57610b6c612cda565b5f82612db657612db6612cad565b500490565b8082028115828204841417610b6c57610b6c612cda565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b8114612ac8575f80fd5b805167ffffffffffffffff81168114612ac8575f80fd5b5f60a08284031215612e37575f80fd5b60405160a0810181811067ffffffffffffffff82111715612e5a57612e5a612901565b604052612e6683612dff565b8152612e7460208401612dff565b6020820152612e8560408401612e10565b6040820152612e9660608401612e10565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ebd575f80fd5b60808201529392505050565b5f60208284031215612ed9575f80fd5b505191905056fea2646970667358221220da1761c94a5bb9c57528066ac964d40190c8d3051b3cab6035f221b20312658464736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b50600436106102e3575f3560e01c806388911e3211610187578063c54dd0d4116100dd578063e4a28a5211610093578063f4359ce51161006e578063f4359ce514610715578063f4da12ba1461071f578063f9572f7c14610727575f80fd5b8063e4a28a52146106ce578063ec73d906146106d7578063f0cd64af146106f6575f80fd5b8063d4b9d748116100c3578063d4b9d74814610671578063dc87f53614610684578063e09d894d146106ae575f80fd5b8063c54dd0d41461064b578063c88d47f01461065e575f80fd5b8063a51248031161013d578063beaf44e811610118578063beaf44e814610628578063c191ec481461063b578063c2c4c5c114610643575f80fd5b8063a5124803146105ee578063a6f9dae1146105f6578063b174b41c14610609575f80fd5b80638e28764b1161016d5780638e28764b1461058f5780639d175053146105c0578063a18f99ff146105e6575f80fd5b806388911e321461055d5780638da5cb5b14610570575f80fd5b8063456f09971161023c57806360d2d13d116101f25780637a75b27e116101cd5780637a75b27e146105005780637ee8bfe91461052057806385556a9514610533575f80fd5b806360d2d13d146104c55780636a95800f146104da5780636b39ac1a146104ed575f80fd5b80634cc32052116102225780634cc32052146104545780634f6ffd0714610467578063609c6b8714610471575f80fd5b8063456f099714610438578063482649971461044b575f80fd5b806327ebf5311161029c5780633b766b3d116102775780633b766b3d146103e7578063415970361461040f5780634479b5cf14610425575f80fd5b806327ebf531146103ac5780632a53b2af146103cc578063309ef15d146103df575f80fd5b80631b98dd90116102cc5780631b98dd901461032e5780631f8507161461034d57806326abaf2414610399575f80fd5b80630c423201146102e75780631765ab7f14610319575b5f80fd5b6103066102f53660046128ca565b600d6020525f908152604090205481565b6040519081526020015b60405180910390f35b61032c6103273660046128e1565b61073a565b005b61030661033c3660046128ca565b600b6020525f908152604090205481565b6103747f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610310565b61032c6103a7366004612a0c565b610837565b6103bf6103ba3660046128ca565b6108fd565b6040516103109190612a8e565b61032c6103da366004612acd565b6109e5565b61030660fa81565b6103fa6103f53660046128ca565b610ac4565b60408051928352602083019190915201610310565b600e545f908152600c6020526040902054610306565b6103066104333660046128e1565b610af0565b6103066104463660046128e1565b610b72565b610306600e5481565b61032c6104623660046128e1565b610be3565b610306620d2f0081565b6104aa61047f366004612ae6565b600660209081525f928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610310565b6104cd610e90565b6040516103109190612b0e565b6103bf6104e83660046128ca565b610eff565b61032c6104fb366004612ae6565b610fb5565b61051361050e366004612b64565b611103565b6040516103109190612c41565b6103fa61052e366004612c84565b61134d565b610306610541366004612ae6565b600860209081525f928352604080842090915290825290205481565b61030661056b3660046128e1565b6113ca565b5f546103749073ffffffffffffffffffffffffffffffffffffffff1681565b6103fa61059d3660046128e1565b600960209081525f92835260408084209091529082529020805460019091015482565b6103fa6105ce3660046128ca565b600c6020525f90815260409020805460019091015482565b61030661143b565b6104cd611451565b61032c610604366004612acd565b6114b6565b6103066106173660046128ca565b60056020525f908152604090205481565b61032c6106363660046128e1565b6115e0565b610306611644565b61032c611655565b61032c6106593660046128e1565b611699565b6103fa61066c366004612c84565b611adb565b6103fa61067f3660046128ca565b611af4565b6103066106923660046128e1565b600a60209081525f928352604080842090915290825290205481565b6001546103749073ffffffffffffffffffffffffffffffffffffffff1681565b61030661271081565b6103066106e5366004612acd565b60076020525f908152604090205481565b6103066107043660046128ca565b60046020525f908152604090205481565b61030662093a8081565b610306611b03565b61032c610735366004612c84565b611b2f565b81610771576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806024610787600267ffffffffffffffff612d07565b6107919190612d2d565b67ffffffffffffffff1610610815578060246107b6600267ffffffffffffffff612d07565b6107c09190612d2d565b6107d59067ffffffffffffffff166001612d55565b6040517fc076384b000000000000000000000000000000000000000000000000000000008152600481019290925260248201526044015b60405180910390fd5b604080518082019091528281526020810182905261083281612297565b505050565b8151835114158061084a57508051835114155b1561088e57825181516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f5b83518110156108f7576108ef8482815181106108ae576108ae612d68565b60200260200101518483815181106108c8576108c8612d68565b60200260200101518484815181106108e2576108e2612d68565b6020026020010151611b2f565b600101610890565b50505050565b604080518082019091525f80825260208201526002545f9061092190600190612d95565b9050825f0361095c576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156109a0576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600283815481106109b3576109b3612d68565b905f5260205f2090600202016040518060400160405290815f8201548152602001600182015481525050915050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a56575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe4915bbde794cce5e56670cce1c0048ef68276040acd048bdb7157ded9232b48905f90a250565b60028181548110610ad3575f80fd5b5f9182526020909120600290910201805460019091015490915082565b604080518082018252838152602080820184905291515f928391610b1691849101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f90815260098352818120600b8452828220548252909252902054925050505b92915050565b604080518082018252838152602080820184905291515f928391610b9891849101612a8e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600490925290205495945050505050565b5f60405180604001604052808481526020018381525090505f81604051602001610c0d9190612a8e565b60405160208183030381529060405280519060200120905060055f8281526020019081526020015f20545f03610c79576040517fa43ec26f000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b335f90815260066020908152604080832084845282528083208151606081018352815481526001820154938101849052600290910154918101919091529103610cee576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f62093a8080610cfe8142612d55565b610d089190612da8565b610d129190612dbb565b90508082604001511115610d90575f8381526009602090815260408083208484529091529020600101548251610d489190612517565b5f8481526009602090815260408083208584528252808320600190810194909455600c909152902001548251610d7e9190612517565b5f828152600c60205260409020600101555b4282604001511115610df85781515f848152600a6020908152604080832081870151845290915281208054909190610dc9908490612d95565b909155505081516040808401515f908152600d6020529081208054909190610df2908490612d95565b90915550505b335f9081526007602090815260409091205490830151610e189082612d95565b335f818152600760209081526040808320859055600682528083208984528252808320838155600181018490556002019290925581518a815290810184905292935089927fdd51e30c8eb611cdb0d3c03313d68eb1a94bff48fb7d3a612348ed5f72b5f175910160405180910390a350505050505050565b60606003805480602002602001604051908101604052809291908181526020015f905b82821015610ef6578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610eb3565b50505050905090565b604080518082019091525f80825260208201526003545f90610f2390600190612d95565b9050825f03610f5e576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80831115610fa2576040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481018490526024810182905260440161080c565b600383815481106109b3576109b3612d68565b73ffffffffffffffffffffffffffffffffffffffff8216611002576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f0361103b576040517f7c946ed700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6024611050600267ffffffffffffffff612d07565b61105a9190612d2d565b67ffffffffffffffff168111156110d057806024611081600267ffffffffffffffff612d07565b61108b9190612d2d565b6040517f7ae59685000000000000000000000000000000000000000000000000000000008152600481019290925267ffffffffffffffff16602482015260440161080c565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff831681526020810182905261083281612297565b60608251845114158061111857508151845114155b1561115c57835183516040517f8151c1100000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b835167ffffffffffffffff81111561117657611176612901565b60405190808252806020026020018201604052801561119f578160200160208202803683370190505b5090505f5b8451811015611345575f60405180604001604052808784815181106111cb576111cb612d68565b602002602001015181526020018684815181106111ea576111ea612d68565b602002602001015181525090505f816040516020016112099190612a8e565b60405160208183030381529060405280519060200120905060045f8281526020019081526020015f20545f036112aa5786838151811061124b5761124b612d68565b602002602001015186848151811061126557611265612d68565b60200260200101516040517f31b05a8000000000000000000000000000000000000000000000000000000000815260040161080c929190918252602082015260400190565b620d2f0060085f8786815181106112c3576112c3612d68565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461131e9190612d55565b84848151811061133057611330612d68565b602090810291909101015250506001016111a4565b509392505050565b5f805f61135a8686612536565b905061136461271c565b50611370868686612814565b6040805188815260208101859052908101829052606081018390529194509250869033907fd5c6370d65eabf98bee6ac71ce6270200ecc37dc6ba99a7856f1232081b312b39060800160405180910390a350935093915050565b604080518082018252838152602080820184905291515f9283916113f091849101612a8e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291815281516020928301205f908152600590925290205495945050505050565b6002545f9061144c90600190612d95565b905090565b60606002805480602002602001604051908101604052809291908181526020015f9082821015610ef6578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610eb3565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611527575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161080c565b73ffffffffffffffffffffffffffffffffffffffff8116611574576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b5f6115eb8383612536565b90505f6115f661271c565b6040805185815260208101859052908101829052909150849033907f383652a8d239c1168f936d2835a90aa915d1d6bf7af7d5144638be714a3193b39060600160405180910390a350505050565b6003545f9061144c90600190612d95565b5f61165e61271c565b60405181815290915033907f39cf56b90e9d763f0c102996f87d848a60d5b19bd9d53e36505c49b64aa89c729060200160405180910390a250565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461170a575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015233602482015260440161080c565b5f60405180604001604052808481526020018381525090505f816040516020016117349190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600490935290822054909250908190036117be576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f6117c98686612536565b90505f6117d461271c565b90505f62093a80806117e68142612d55565b6117f09190612da8565b6117fa9190612dbb565b5f8681526009602090815260408083208484528252808320839055888352600b909152812082905590915061182f8484612d95565b5f838152600c60209081526040808320849055600e869055600380548b855260058452828520819055600180820183559185528c5160029182027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101919091558d8501517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909101558b85526004909352908320839055905492935090916118d89190612d95565b905060018111156119a957600281815481106118f6576118f6612d68565b5f9182526020808320604080518082018252600290940290910180548452600101548383015251919a5061192c918b9101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120889055600280549192508a918990811061198957611989612d68565b5f9182526020918290208351600290920201908155910151600190910155505b60028054806119ba576119ba612dd2565b5f8281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020181815560019081019190915591555473ffffffffffffffffffffffffffffffffffffffff168015611a93576040517f63c4d28e0000000000000000000000000000000000000000000000000000000081526004810189905273ffffffffffffffffffffffffffffffffffffffff8216906363c4d28e906024015f604051808303815f87803b158015611a7c575f80fd5b505af1158015611a8e573d5f803e3d5ffd5b505050505b604080518b8152602081018590528c917f30b83ce9dbee69f017e7059540e314cdce9e25b2288840cfe65ca96c2d7bab06910160405180910390a25050505050505050505050565b5f80611ae8858585612814565b90969095509350505050565b60038181548110610ad3575f80fd5b6024611b18600267ffffffffffffffff612d07565b611b229190612d2d565b67ffffffffffffffff1681565b5f604051806040016040528085815260200184815250604051602001611b559190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f818152600590935291205490915015611bdb576040517ffcd19b5d000000000000000000000000000000000000000000000000000000008152600481018590526024810184905260440161080c565b6040517fc4698ee50000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063c4698ee59060240160a060405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c899190612e27565b6020015190505f81600f0b1215611cd8576040517fdd1de43a000000000000000000000000000000000000000000000000000000008152336004820152600f82900b602482015260440161080c565b6040517f4deafcae0000000000000000000000000000000000000000000000000000000081523360048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690634deafcae90602401602060405180830381865afa158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d869190612ec9565b90505f62093a8080611d988142612d55565b611da29190612da8565b611dac9190612dbb565b9050818110611df7576040517fd78507e1000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044810182905260640161080c565b612710851115611e3e576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101869052612710602482015260440161080c565b335f908152600860209081526040808320878452909152812054611e6690620d2f0090612d55565b905042811115611eb1576040517f176017650000000000000000000000000000000000000000000000000000000081523360048201524260248201526044810182905260640161080c565b335f908152600660209081526040808320888452825280832081516060810183528154815260018201549381019390935260020154908201819052909190841015611f1557838260400151611f069190612d95565b8251611f129190612dbb565b90505b5f60405180606001604052806127108b8a6fffffffffffffffffffffffffffffffff16611f429190612dbb565b611f4c9190612da8565b8152602081018b905260400187905290505f611f688688612d95565b8251611f749190612dbb565b335f90815260076020908152604090912054868201519185015192935091611f9c9083612d55565b611fa69190612d95565b335f9081526007602052604090208190559050612710811115612000576040517f7ae5968500000000000000000000000000000000000000000000000000000000815260048101829052612710602482015260440161080c565b61201e8261200e8f8f612536565b6120189190612d55565b85612517565b5f8b81526009602090815260408083208b84529091529020556120438261200e61271c565b5f888152600c602052604090819020919091558501518710156120e45782515f8b81526009602090815260408083208b84529091529020600101546120929161208b91612d55565b8651612517565b5f8b81526009602090815260408083208b845282528083206001908101949094558651600c909252909120909101546120ce9161208b91612d55565b5f888152600c602052604090206001015561213e565b82515f8b81526009602090815260408083208b845290915281206001018054909190612111908490612d55565b909155505082515f888152600c602052604081206001018054909190612138908490612d55565b90915550505b42856040015111156121a65784515f8b8152600a60209081526040808320818a0151845290915281208054909190612177908490612d95565b909155505084516040808701515f908152600d60205290812080549091906121a0908490612d95565b90915550505b82515f8b8152600a60209081526040808320818801518452909152812080549091906121d3908490612d55565b909155505082516040808501515f908152600d60205290812080549091906121fc908490612d55565b9091555050335f8181526006602090815260408083208e845282528083208751815582880151600182015581880151600290910155838352600882528083208e845282529182902042905581518f81529081018e90529081018390528e91907f02dd4023faa881388c9531361f57d7cbb10d03f5b3f810ea0458960ac8ebdb029060600160405180910390a350505050505050505050505050565b5f816040516020016122a99190612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260049093529120549091501561233557815160208301516040517f5855e2480000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b5f818152600560205260409020541561238a57815160208301516040517ffcd19b5d0000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161080c565b600280545f838152600460209081526040822083905560018301845583825285517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948402948501558501517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf909301929092559062093a808061240e8142612d55565b6124189190612da8565b6124229190612dbb565b5f848152600b6020526040902081905560015490915073ffffffffffffffffffffffffffffffffffffffff1680156124d0576040517fa5edd4fc0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff82169063a5edd4fc906024015f604051808303815f87803b1580156124b9575f80fd5b505af11580156124cb573d5f803e3d5ffd5b505050505b8451602080870151604080519182529181018690527fe990f780082e9ce1c98e6c3b814d9885dd1772962a49213d96b58a946819a565910160405180910390a25050505050565b5f818311612525575f61252f565b61252f8284612d95565b9392505050565b604080518082018252838152602080820184905291515f92839161255c91849101612a8e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f81815260059093529120549091501580156125b957505f81815260046020526040902054155b156125fa576040517f31b05a80000000000000000000000000000000000000000000000000000000008152600481018690526024810185905260440161080c565b5f818152600b6020908152604080832054600983528184208185528352818420825180840190935280548352600101549282019290925290915b60fa811015612710574283116127105761265162093a8084612d55565b92505f62093a8083602001516126679190612dbb565b905080835f015111156126be5780835f018181516126859190612d95565b9052505f858152600a6020908152604080832087845282529091205490840180518291906126b4908390612d95565b9052506126c89050565b5f80845260208401525b5f8581526009602090815260408083208784528252909120845181559084015160019091015542841115612707575f858152600b602052604090208490555b50600101612634565b50519695505050505050565b600e545f818152600c602090815260408083208151808301909252805482526001015491810191909152909190825b60fa81101561280c5742831161280c5761276862093a8084612d55565b92505f62093a80836020015161277e9190612dbb565b905080835f015111156127cd5780835f0181815161279c9190612d95565b9052505f848152600d602090815260409091205490840180518291906127c3908390612d95565b9052506127d79050565b5f80845260208401525b5f848152600c6020908152604090912084518155908401516001909101554284111561280357600e8490555b5060010161274b565b505192915050565b5f808062093a806128258186612da8565b61282f9190612dbb565b5f818152600c6020908152604080832054815180830183528b81528084018b905291519096509394509261286591849101612a8e565b6040516020818303038152906040528051906020012090505f8411156128bf575f818152600960209081526040808320868452909152902054846128b182670de0b6b3a7640000612dbb565b6128bb9190612da8565b9550505b505050935093915050565b5f602082840312156128da575f80fd5b5035919050565b5f80604083850312156128f2575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561297557612975612901565b604052919050565b5f67ffffffffffffffff82111561299657612996612901565b5060051b60200190565b5f82601f8301126129af575f80fd5b813560206129c46129bf8361297d565b61292e565b8083825260208201915060208460051b8701019350868411156129e5575f80fd5b602086015b84811015612a0157803583529183019183016129ea565b509695505050505050565b5f805f60608486031215612a1e575f80fd5b833567ffffffffffffffff80821115612a35575f80fd5b612a41878388016129a0565b94506020860135915080821115612a56575f80fd5b612a62878388016129a0565b93506040860135915080821115612a77575f80fd5b50612a84868287016129a0565b9150509250925092565b815181526020808301519082015260408101610b6c565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ac8575f80fd5b919050565b5f60208284031215612add575f80fd5b61252f82612aa5565b5f8060408385031215612af7575f80fd5b612b0083612aa5565b946020939093013593505050565b602080825282518282018190525f919060409081850190868401855b82811015612b5757612b4784835180518252602090810151910152565b9284019290850190600101612b2a565b5091979650505050505050565b5f805f60608486031215612b76575f80fd5b833567ffffffffffffffff80821115612b8d575f80fd5b612b99878388016129a0565b9450602091508186013581811115612baf575f80fd5b612bbb888289016129a0565b945050604086013581811115612bcf575f80fd5b86019050601f81018713612be1575f80fd5b8035612bef6129bf8261297d565b81815260059190911b82018301908381019089831115612c0d575f80fd5b928401925b82841015612c3257612c2384612aa5565b82529284019290840190612c12565b80955050505050509250925092565b602080825282518282018190525f9190848201906040850190845b81811015612c7857835183529284019291840191600101612c5c565b50909695505050505050565b5f805f60608486031215612c96575f80fd5b505081359360208301359350604090920135919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f67ffffffffffffffff80841680612d2157612d21612cad565b92169190910492915050565b67ffffffffffffffff828116828216039080821115612d4e57612d4e612cda565b5092915050565b80820180821115610b6c57610b6c612cda565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610b6c57610b6c612cda565b5f82612db657612db6612cad565b500490565b8082028115828204841417610b6c57610b6c612cda565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b8051600f81900b8114612ac8575f80fd5b805167ffffffffffffffff81168114612ac8575f80fd5b5f60a08284031215612e37575f80fd5b60405160a0810181811067ffffffffffffffff82111715612e5a57612e5a612901565b604052612e6683612dff565b8152612e7460208401612dff565b6020820152612e8560408401612e10565b6040820152612e9660608401612e10565b606082015260808301516fffffffffffffffffffffffffffffffff81168114612ebd575f80fd5b60808201529392505050565b5f60208284031215612ed9575f80fd5b505191905056fea2646970667358221220da1761c94a5bb9c57528066ac964d40190c8d3051b3cab6035f221b20312658464736f6c63430008190033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/audits/internal13/README.md b/audits/internal13/README.md index 3080bb9..629bdfe 100644 --- a/audits/internal13/README.md +++ b/audits/internal13/README.md @@ -41,4 +41,5 @@ https://github.com/code-423n4/2024-05-olas-findings/issues/109 ``` Lack of event emission for important state changes in revokeRemovedNomineeVotingPower() ``` +[x] fixed diff --git a/contracts/VoteWeighting.sol b/contracts/VoteWeighting.sol index 2c36a75..053389b 100644 --- a/contracts/VoteWeighting.sol +++ b/contracts/VoteWeighting.sol @@ -137,9 +137,11 @@ contract VoteWeighting { uint256 nomineeWeight, uint256 totalSum); event NomineeRelativeWeightWrite(address indexed sender, bytes32 indexed nomineeAccount, uint256 chainId, uint256 nomineeWeight, uint256 totalSum, uint256 relativeWeight); - event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight); + event VoteForNominee(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 weight, + uint256 powerUsed); event AddNominee(bytes32 indexed account, uint256 chainId, uint256 id); event RemoveNominee(bytes32 indexed account, uint256 chainId, uint256 newSum); + event VotingPowerRevoked(address indexed user, bytes32 indexed nominee, uint256 chainId, uint256 powerUsed); // 7 * 86400 seconds - all future times are rounded by week uint256 public constant WEEK = 604_800; @@ -552,7 +554,7 @@ contract VoteWeighting { // Record last action time lastUserVote[msg.sender][nomineeHash] = block.timestamp; - emit VoteForNominee(msg.sender, account, chainId, weight); + emit VoteForNominee(msg.sender, account, chainId, weight, powerUsed); } /// @dev Allocates voting power for changing pool weights in a batch set. @@ -677,6 +679,8 @@ contract VoteWeighting { powerUsed = powerUsed - oldSlope.power; voteUserPower[msg.sender] = powerUsed; delete voteUserSlopes[msg.sender][nomineeHash]; + + emit VotingPowerRevoked(msg.sender, account, chainId, powerUsed); } /// @dev Get current nominee weight.