diff --git a/README.md b/README.md index e7a3141..e4f6d67 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ │ │ └── ERC20.sol │ └── utils │ ├── MerkleProofLib.sol +│ ├── Multicall.sol │ ├── ReentrancyGuard.sol │ └── SafeTransferLib.sol ├── p2pix.sol diff --git a/artifacts/contracts/Reputation.sol/Reputation.dbg.json b/artifacts/contracts/Reputation.sol/Reputation.dbg.json index c23cd42..245da94 100644 --- a/artifacts/contracts/Reputation.sol/Reputation.dbg.json +++ b/artifacts/contracts/Reputation.sol/Reputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../build-info/906fc0dd8b27e18481e135d1f328d0ae.json" } diff --git a/artifacts/contracts/Reputation.sol/Reputation.json b/artifacts/contracts/Reputation.sol/Reputation.json index 1060142..c56dcd7 100644 --- a/artifacts/contracts/Reputation.sol/Reputation.json +++ b/artifacts/contracts/Reputation.sol/Reputation.json @@ -8,25 +8,6 @@ "stateMutability": "nonpayable", "type": "constructor" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnerUpdated", - "type": "event" - }, { "inputs": [ { @@ -71,36 +52,10 @@ ], "stateMutability": "view", "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" } ], - "bytecode": "0x6080806040523461004f57600080546001600160a01b031916339081178255907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a361043e90816100558239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826313af4035146102f6575081631a861d26146102ba5781634d2b1791146100ec575080638da5cb5b1461009c5763a4b345571461005c57600080fd5b3461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051643a352944008152f35b5080fd5b503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8383346100985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009857823591620f4240838102908104840361028e578380029380850481149015171561028e57643a3529440093840180941161028e5760b58471010000000000000000000000000000000000811015610277575b8069010000000000000000006201000092101561026b575b6501000000000081101561025e575b6301000000811015610251575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146102255703900483018093116101f9576020838351908152f35b806011857f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b6024846012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b916101a3565b60201c9160101b91610196565b851c9160201b91610187565b5068b500000000000000009050608085901c61016f565b6024826011877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051620f42408152f35b8491346104045760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104045780359173ffffffffffffffffffffffffffffffffffffffff9182841680940361040057845492831633036103a55750507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b9060206064927f08c379a0000000000000000000000000000000000000000000000000000000008352820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b8480fd5b8280fdfea2646970667358221220ebc26f1432d13f128c50ef3a8297ef65a17fc376c17056b77b447e21b462442464736f6c63430008130033", - "deployedBytecode": "0x608060408181526004918236101561001657600080fd5b600092833560e01c91826313af4035146102f6575081631a861d26146102ba5781634d2b1791146100ec575080638da5cb5b1461009c5763a4b345571461005c57600080fd5b3461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051643a352944008152f35b5080fd5b503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8383346100985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009857823591620f4240838102908104840361028e578380029380850481149015171561028e57643a3529440093840180941161028e5760b58471010000000000000000000000000000000000811015610277575b8069010000000000000000006201000092101561026b575b6501000000000081101561025e575b6301000000811015610251575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146102255703900483018093116101f9576020838351908152f35b806011857f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b6024846012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b916101a3565b60201c9160101b91610196565b851c9160201b91610187565b5068b500000000000000009050608085901c61016f565b6024826011877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051620f42408152f35b8491346104045760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104045780359173ffffffffffffffffffffffffffffffffffffffff9182841680940361040057845492831633036103a55750507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b9060206064927f08c379a0000000000000000000000000000000000000000000000000000000008352820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b8480fd5b8280fdfea2646970667358221220ebc26f1432d13f128c50ef3a8297ef65a17fc376c17056b77b447e21b462442464736f6c63430008130033", + "bytecode": "0x60808060405234610016576102c9908161001c8239f35b600080fdfe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033", + "deployedBytecode": "0x6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json index ca3d07f..b512f4d 100644 --- a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json +++ b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/b608b6eb28957aeb71328924500ce935.json" } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.json index ce19504..cc22bdc 100644 --- a/artifacts/contracts/lib/auth/Owned.sol/Owned.json +++ b/artifacts/contracts/lib/auth/Owned.sol/Owned.json @@ -3,6 +3,11 @@ "contractName": "Owned", "sourceName": "contracts/lib/auth/Owned.sol", "abi": [ + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + }, { "anonymous": false, "inputs": [ diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index c23cd42..9a2b475 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../build-info/b608b6eb28957aeb71328924500ce935.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index ea542a9..4c03cde 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -134,6 +134,11 @@ "name": "TxAlreadyUsed", "type": "error" }, + { + "inputs": [], + "name": "Unauthorized", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -1069,8 +1074,8 @@ "type": "receive" } ], - "bytecode": "0x608060405262002a8a803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516126279081620004638239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a1620003af565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b156200037b57565b60405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606490fd5b90600090620003c960018060a01b03835416331462000373565b82519182156200045557815183036200044857602092919284818080970195019360051b0101925b83810362000400575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003f1565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e57611594565b611522565b611477565b61145e565b6113bc565b610f2d565b610ef9565b610ebf565b610e69565b610e29565b610811565b610e0b565b610ded565b610db9565b610d20565b610cb9565b610ca0565b610c4f565b610c17565b610b06565b610ae3565b610aa3565b610a1c565b6109b5565b61098b565b6108f4565b610762565b610532565b61047f565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b73ffffffffffffffffffffffffffffffffffffffff6103d1816000541633146116ad565b8151828401939060051b830181013d1515855b811561044b575b50505060405192818401908285525180915260408401949160005b828110610435577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610406565b90838260018298969499979951600c1b550190838210156104735791509593959492946103e4565b509593959492946103eb565b346102425760206003193601126102425760043561049c816102f5565b7fffffffffffffffffffffffff000000000000000000000000000000000000000060009182549073ffffffffffffffffffffffffffffffffffffffff906104e682841633146116ad565b1691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a06003193601126102425760043561054f816102f5565b6024356bffffffffffffffffffffffff8116908181036102425760443590610576826102f5565b61057e610516565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610738576105c66105c28363cbc9d1c4600c526000526020600c205490565b1590565b61070e576b3fffffffffffffffffffffff6105f783839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061060f8584611754565b116106e457826106cf976106899661065b89610680967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61064f611761565b806106d4575b50611754565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b3090339061179c565b61069260018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6106de9033611e9d565b38610655565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610852575050505090565b835185529381019392810192600101610844565b9061087990604083526040830190610832565b81810360209283015282518082529082019282019160009190825b8281106108a357505050505090565b909192939485516004808210156108c857508152820194820193929190600101610894565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610932826102dd565b916109406040519384610276565b80835260248484019160051b8301019136831161024257602401905b82821061097c5761096c846124ab565b9061080d60405192839283610866565b8135815290840190840161095c565b346102425760206003193601126102425760206004356109aa816102f5565b60405190600c1b8152f35b34610242576020600319360112610242577f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85116020600435610a0f73ffffffffffffffffffffffffffffffffffffffff6000541633146116ad565b80600355604051908152a1005b3461024257600080600319360112610aa057610a5073ffffffffffffffffffffffffffffffffffffffff82541633146116ad565b478180808084335af115610a93576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610ad9600435610ac5816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b23816102f5565b602435801515908181036102425733600c1b610b5584829060205263739094b1600c52600c1c6000526034600c205490565b918215610bed57610ba4927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c476004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c6f816102f5565b60243590611e9d565b600319604091011261024257600435610c90816102f5565b90602435610c9d816102f5565b90565b34610242576020610ad9610cb336610c78565b906123f3565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d3d816102f5565b60243590610d4a826102f5565b60443590610d57826102f5565b67ffffffffffffffff9160a43583811161024257610d79903690600401610cef565b9060c4359485116102425761080d95610d99610da9963690600401610cef565b95909460843592606435926118ad565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c47602435610e4b816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e7736610c78565b6000903d15610ea2575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e81565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610ef3610019913690600401610cef565b90611cab565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f57611761565b610f6b816000526005602052604060002090565b906003820180549283156113825784810190815443116113595760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110556020820192826110498786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461133157885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa1561132c576110ae6110a98a51600c1b90565b541590565b6113055750859493611242937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461114061110c958d61112561110c600861122b9b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111376002870197885490611c11565b98555560019055565b6112056006600783019261116b61110c855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112d957845461119561118d33600c1b6000526006602052604060002090565b918254611754565b90556111d16111c16111bb865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111dc8d8254611754565b90555b01946111ff865473ffffffffffffffffffffffffffffffffffffffff1690565b85611c1e565b815480611251575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261124e60018055565b80f35b61127261110c835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112c657506112bd92916112ae6112a26112b5935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611c1e565b5460011c90565b903390611c1e565b3880808061120d565b9150506112d4913390611c1e565b6112bd565b6112e48c8654611754565b6112fe61118d33600c1b6000526006602052604060002090565b90556111df565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611c05565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610c9d928181520190610832565b346102425760406003193601126102425760043567ffffffffffffffff8111610242576113ed903690600401610313565b602435906113fa826102f5565b60009181519161140983612448565b935b838110611420576040518061080d87826113ab565b8061144d8473ffffffffffffffffffffffffffffffffffffffff61144660019587612497565b51166123bc565b6114578288612497565b520161140b565b34610242576020610c4761147136610c78565b906123bc565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114a9903690600401610313565b9060243590811161024257366023820112156102425780600401356114cd816102dd565b916114db6040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b82821061150b576100198587611eec565b83809161151784610525565b8152019101906114fa565b34610242576020600319360112610242577fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f6020600435611562816102f5565b73ffffffffffffffffffffffffffffffffffffffff611586816000541633146116ad565b8160025560405191168152a1005b34610242576060600319360112610242576004356115b1816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e9161160a6115fc611696933690600401610cef565b90611605611761565b611cab565b600161161685336123f3565b15151461169f575b61165a33600c1b85836b3fffffffffffffffffffffff61165483859060205263739094b1600c52600c1c6000526034600c205490565b16612380565b611665813386611c1e565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116a8846117f5565b61161e565b156116b457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161174f57565b611712565b9190820180921161174f57565b600260015414611772576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d156001600051141716156117e7576000606052604052565b637939f4246000526004601cfd5b33600c1b61181982829060205263739094b1600c52600c1c6000526034600c205490565b908115610bed57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118629316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b906118c698979695949392916118c1611761565b611917565b9060018055565b90670de0b6b3a76400009182810292818404149015171561174f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461174f5760010190565b949673ffffffffffffffffffffffffffffffffffffffff929861193c91959495611cab565b169261194b6105c285836123f3565b611bdb5761195984826123bc565b90828210611bb157600c1b946004966119728854611741565b98886119888b6000526005602052604060002090565b0154431115611b88579087611a498b96959493611a2c6119e96119cd8c6119b160035443611754565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119f16102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611abb575092611ab09592611aab611ab6999693610c9d9b99963391611aa58a6374dfee70600c52600c1c60005260206000205490565b91612279565b612011565b546118ea565b600455565b805190925068056bc75e2d63100000109050611ae7575092611ab69592610c9d979592611ab095612011565b90919250611b1c611b17611b0833600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b612307565b611b278251916118cd565b10908115611b73575b50611b4a5792611ab09287611ab69693610c9d9896612011565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611b30565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161174f57565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c5a57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611ca65760051b0190565b611c67565b9060009182905b828210611ccf575010611cc25750565b63dfb035c990526004601cfd5b90611cef611cde828585611c96565b356000526005602052604060002090565b90611cf982611fa7565b8154611d1f61110c600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d4d85849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d6c87548095611754565b116106e457600195611d9f6006948b93611e2c979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611dc46111bb600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611ddb6112ae826000526006602052604060002090565b68056bc75e2d631000008111611e825750611e03611e11916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e6d848888611c96565b60405190358152921691602090a20190611cb2565b90611e97906000526006602052604060002090565b55611e11565b338103611ede576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b90600090611f1273ffffffffffffffffffffffffffffffffffffffff83541633146116ad565b8251918215611f9a5781518303611f8d57602092919284818080970195019360051b0101925b838103611f46575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611f38565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611fe7576003015415611fbd57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122557f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65949261223b73ffffffffffffffffffffffffffffffffffffffff9598612274948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120fb6120b760a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61223660c08a0196612168612124895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121d061218c60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121f46101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612380565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff82939416926122cb575b5050036122a157565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122fc5792906122d5565b509150503880612298565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561237257565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123ae5760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d156123ca575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d15612401575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612452826102dd565b61245f6040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061248d82946102dd565b0190602036910137565b8051821015611ca65760209160051b010190565b908151156125de57600080928051906124c382612448565b926124cd83612448565b955b8381106124de57505050509190565b806124ff6124ee60019386612497565b516000526005602052604060002090565b5461252f5761250e8185612497565b516125198288612497565b5282612525828a612497565b5201925b926124cf565b600361253e6124ee8387612497565b01546125745761254e8185612497565b516125598288612497565b5261256d612567828a612497565b60039052565b0192612529565b60046125836124ee8387612497565b01544311156125b5576125968185612497565b516125a18288612497565b5261256d6125af828a612497565b60029052565b6125bf8185612497565b516125ca8288612497565b5261256d6125d8828a612497565b60019052565b90506125e861241f565b90610c9d61241f56fea26469706673582212206ea195dd81afc0218be546387a10d6df5dc2cc428d5f2e970c86b7514266fd4964736f6c63430008130033", - "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e57611594565b611522565b611477565b61145e565b6113bc565b610f2d565b610ef9565b610ebf565b610e69565b610e29565b610811565b610e0b565b610ded565b610db9565b610d20565b610cb9565b610ca0565b610c4f565b610c17565b610b06565b610ae3565b610aa3565b610a1c565b6109b5565b61098b565b6108f4565b610762565b610532565b61047f565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b73ffffffffffffffffffffffffffffffffffffffff6103d1816000541633146116ad565b8151828401939060051b830181013d1515855b811561044b575b50505060405192818401908285525180915260408401949160005b828110610435577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610406565b90838260018298969499979951600c1b550190838210156104735791509593959492946103e4565b509593959492946103eb565b346102425760206003193601126102425760043561049c816102f5565b7fffffffffffffffffffffffff000000000000000000000000000000000000000060009182549073ffffffffffffffffffffffffffffffffffffffff906104e682841633146116ad565b1691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a06003193601126102425760043561054f816102f5565b6024356bffffffffffffffffffffffff8116908181036102425760443590610576826102f5565b61057e610516565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610738576105c66105c28363cbc9d1c4600c526000526020600c205490565b1590565b61070e576b3fffffffffffffffffffffff6105f783839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061060f8584611754565b116106e457826106cf976106899661065b89610680967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61064f611761565b806106d4575b50611754565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b3090339061179c565b61069260018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6106de9033611e9d565b38610655565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610852575050505090565b835185529381019392810192600101610844565b9061087990604083526040830190610832565b81810360209283015282518082529082019282019160009190825b8281106108a357505050505090565b909192939485516004808210156108c857508152820194820193929190600101610894565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610932826102dd565b916109406040519384610276565b80835260248484019160051b8301019136831161024257602401905b82821061097c5761096c846124ab565b9061080d60405192839283610866565b8135815290840190840161095c565b346102425760206003193601126102425760206004356109aa816102f5565b60405190600c1b8152f35b34610242576020600319360112610242577f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85116020600435610a0f73ffffffffffffffffffffffffffffffffffffffff6000541633146116ad565b80600355604051908152a1005b3461024257600080600319360112610aa057610a5073ffffffffffffffffffffffffffffffffffffffff82541633146116ad565b478180808084335af115610a93576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610ad9600435610ac5816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b23816102f5565b602435801515908181036102425733600c1b610b5584829060205263739094b1600c52600c1c6000526034600c205490565b918215610bed57610ba4927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c476004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c6f816102f5565b60243590611e9d565b600319604091011261024257600435610c90816102f5565b90602435610c9d816102f5565b90565b34610242576020610ad9610cb336610c78565b906123f3565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d3d816102f5565b60243590610d4a826102f5565b60443590610d57826102f5565b67ffffffffffffffff9160a43583811161024257610d79903690600401610cef565b9060c4359485116102425761080d95610d99610da9963690600401610cef565b95909460843592606435926118ad565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c47602435610e4b816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e7736610c78565b6000903d15610ea2575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e81565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610ef3610019913690600401610cef565b90611cab565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f57611761565b610f6b816000526005602052604060002090565b906003820180549283156113825784810190815443116113595760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110556020820192826110498786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461133157885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa1561132c576110ae6110a98a51600c1b90565b541590565b6113055750859493611242937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461114061110c958d61112561110c600861122b9b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111376002870197885490611c11565b98555560019055565b6112056006600783019261116b61110c855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112d957845461119561118d33600c1b6000526006602052604060002090565b918254611754565b90556111d16111c16111bb865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111dc8d8254611754565b90555b01946111ff865473ffffffffffffffffffffffffffffffffffffffff1690565b85611c1e565b815480611251575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261124e60018055565b80f35b61127261110c835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112c657506112bd92916112ae6112a26112b5935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611c1e565b5460011c90565b903390611c1e565b3880808061120d565b9150506112d4913390611c1e565b6112bd565b6112e48c8654611754565b6112fe61118d33600c1b6000526006602052604060002090565b90556111df565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611c05565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610c9d928181520190610832565b346102425760406003193601126102425760043567ffffffffffffffff8111610242576113ed903690600401610313565b602435906113fa826102f5565b60009181519161140983612448565b935b838110611420576040518061080d87826113ab565b8061144d8473ffffffffffffffffffffffffffffffffffffffff61144660019587612497565b51166123bc565b6114578288612497565b520161140b565b34610242576020610c4761147136610c78565b906123bc565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114a9903690600401610313565b9060243590811161024257366023820112156102425780600401356114cd816102dd565b916114db6040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b82821061150b576100198587611eec565b83809161151784610525565b8152019101906114fa565b34610242576020600319360112610242577fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f6020600435611562816102f5565b73ffffffffffffffffffffffffffffffffffffffff611586816000541633146116ad565b8160025560405191168152a1005b34610242576060600319360112610242576004356115b1816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e9161160a6115fc611696933690600401610cef565b90611605611761565b611cab565b600161161685336123f3565b15151461169f575b61165a33600c1b85836b3fffffffffffffffffffffff61165483859060205263739094b1600c52600c1c6000526034600c205490565b16612380565b611665813386611c1e565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116a8846117f5565b61161e565b156116b457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161174f57565b611712565b9190820180921161174f57565b600260015414611772576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d156001600051141716156117e7576000606052604052565b637939f4246000526004601cfd5b33600c1b61181982829060205263739094b1600c52600c1c6000526034600c205490565b908115610bed57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118629316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b906118c698979695949392916118c1611761565b611917565b9060018055565b90670de0b6b3a76400009182810292818404149015171561174f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461174f5760010190565b949673ffffffffffffffffffffffffffffffffffffffff929861193c91959495611cab565b169261194b6105c285836123f3565b611bdb5761195984826123bc565b90828210611bb157600c1b946004966119728854611741565b98886119888b6000526005602052604060002090565b0154431115611b88579087611a498b96959493611a2c6119e96119cd8c6119b160035443611754565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119f16102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611abb575092611ab09592611aab611ab6999693610c9d9b99963391611aa58a6374dfee70600c52600c1c60005260206000205490565b91612279565b612011565b546118ea565b600455565b805190925068056bc75e2d63100000109050611ae7575092611ab69592610c9d979592611ab095612011565b90919250611b1c611b17611b0833600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b612307565b611b278251916118cd565b10908115611b73575b50611b4a5792611ab09287611ab69693610c9d9896612011565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611b30565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161174f57565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c5a57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611ca65760051b0190565b611c67565b9060009182905b828210611ccf575010611cc25750565b63dfb035c990526004601cfd5b90611cef611cde828585611c96565b356000526005602052604060002090565b90611cf982611fa7565b8154611d1f61110c600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d4d85849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d6c87548095611754565b116106e457600195611d9f6006948b93611e2c979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611dc46111bb600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611ddb6112ae826000526006602052604060002090565b68056bc75e2d631000008111611e825750611e03611e11916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e6d848888611c96565b60405190358152921691602090a20190611cb2565b90611e97906000526006602052604060002090565b55611e11565b338103611ede576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b90600090611f1273ffffffffffffffffffffffffffffffffffffffff83541633146116ad565b8251918215611f9a5781518303611f8d57602092919284818080970195019360051b0101925b838103611f46575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611f38565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611fe7576003015415611fbd57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122557f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65949261223b73ffffffffffffffffffffffffffffffffffffffff9598612274948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120fb6120b760a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61223660c08a0196612168612124895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121d061218c60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121f46101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612380565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff82939416926122cb575b5050036122a157565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122fc5792906122d5565b509150503880612298565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561237257565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123ae5760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d156123ca575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d15612401575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612452826102dd565b61245f6040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061248d82946102dd565b0190602036910137565b8051821015611ca65760209160051b010190565b908151156125de57600080928051906124c382612448565b926124cd83612448565b955b8381106124de57505050509190565b806124ff6124ee60019386612497565b516000526005602052604060002090565b5461252f5761250e8185612497565b516125198288612497565b5282612525828a612497565b5201925b926124cf565b600361253e6124ee8387612497565b01546125745761254e8185612497565b516125598288612497565b5261256d612567828a612497565b60039052565b0192612529565b60046125836124ee8387612497565b01544311156125b5576125968185612497565b516125a18288612497565b5261256d6125af828a612497565b60029052565b6125bf8185612497565b516125ca8288612497565b5261256d6125d8828a612497565b60019052565b90506125e861241f565b90610c9d61241f56fea26469706673582212206ea195dd81afc0218be546387a10d6df5dc2cc428d5f2e970c86b7514266fd4964736f6c63430008130033", + "bytecode": "0x608060405262002a0f803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516125d99081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033", + "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/Reputation.sol b/contracts/Reputation.sol index 6c02658..ebf4096 100644 --- a/contracts/Reputation.sol +++ b/contracts/Reputation.sol @@ -2,9 +2,8 @@ pragma solidity 0.8.19; import { IReputation } from "./lib/interfaces/IReputation.sol"; -import { Owned } from "./lib/auth/Owned.sol"; -contract Reputation is IReputation, Owned(msg.sender) { +contract Reputation is IReputation { /// @dev Asymptote numerator constant value for the `limiter` fx. uint256 public constant maxLimit = 1e6; /// @dev Denominator's constant operand for the `limiter` fx. diff --git a/contracts/lib/auth/Owned.sol b/contracts/lib/auth/Owned.sol index 5217f90..ce8a84a 100644 --- a/contracts/lib/auth/Owned.sol +++ b/contracts/lib/auth/Owned.sol @@ -4,6 +4,8 @@ pragma solidity >=0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { + error Unauthorized(); + /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ @@ -20,7 +22,7 @@ abstract contract Owned { address public owner; modifier onlyOwner() virtual { - require(msg.sender == owner, "UNAUTHORIZED"); + if (msg.sender != owner) revert Unauthorized(); _; } diff --git a/hardhat.config.ts b/hardhat.config.ts index fc3ce49..0af5df4 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -74,17 +74,6 @@ const config: HardhatUserConfig = { goerli: process.env.ETHERSCAN_API_KEY || "", polygonMumbai: process.env.POLYGONSCAN_API_KEY || "", }, - // customChains: [ - // { - // // network: {INSERT_NAME}, - // // chainId: {INSERT_ID}, - // // urls: { - // // apiURL: - // // "{INSERT_URL}", - // // browserURL: "{INSERT_URL}", - // // }, - // }, - // ], }, gasReporter: { enabled: !!( diff --git a/src/types/Reputation.ts b/src/types/Reputation.ts index 5127e00..f9c1033 100644 --- a/src/types/Reputation.ts +++ b/src/types/Reputation.ts @@ -7,17 +7,11 @@ import type { BigNumberish, BytesLike, CallOverrides, - ContractTransaction, - Overrides, PopulatedTransaction, Signer, utils, } from "ethers"; -import type { - FunctionFragment, - Result, - EventFragment, -} from "@ethersproject/abi"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; import type { Listener, Provider } from "@ethersproject/providers"; import type { TypedEventFilter, @@ -32,17 +26,10 @@ export interface ReputationInterface extends utils.Interface { "limiter(uint256)": FunctionFragment; "magicValue()": FunctionFragment; "maxLimit()": FunctionFragment; - "owner()": FunctionFragment; - "setOwner(address)": FunctionFragment; }; getFunction( - nameOrSignatureOrTopic: - | "limiter" - | "magicValue" - | "maxLimit" - | "owner" - | "setOwner" + nameOrSignatureOrTopic: "limiter" | "magicValue" | "maxLimit" ): FunctionFragment; encodeFunctionData( @@ -54,36 +41,14 @@ export interface ReputationInterface extends utils.Interface { values?: undefined ): string; encodeFunctionData(functionFragment: "maxLimit", values?: undefined): string; - encodeFunctionData(functionFragment: "owner", values?: undefined): string; - encodeFunctionData( - functionFragment: "setOwner", - values: [PromiseOrValue] - ): string; decodeFunctionResult(functionFragment: "limiter", data: BytesLike): Result; decodeFunctionResult(functionFragment: "magicValue", data: BytesLike): Result; decodeFunctionResult(functionFragment: "maxLimit", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "setOwner", data: BytesLike): Result; - events: { - "OwnerUpdated(address,address)": EventFragment; - }; - - getEvent(nameOrSignatureOrTopic: "OwnerUpdated"): EventFragment; + events: {}; } -export interface OwnerUpdatedEventObject { - user: string; - newOwner: string; -} -export type OwnerUpdatedEvent = TypedEvent< - [string, string], - OwnerUpdatedEventObject ->; - -export type OwnerUpdatedEventFilter = TypedEventFilter; - export interface Reputation extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; @@ -119,13 +84,6 @@ export interface Reputation extends BaseContract { magicValue(overrides?: CallOverrides): Promise<[BigNumber]>; maxLimit(overrides?: CallOverrides): Promise<[BigNumber]>; - - owner(overrides?: CallOverrides): Promise<[string]>; - - setOwner( - newOwner: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): Promise; }; limiter( @@ -137,13 +95,6 @@ export interface Reputation extends BaseContract { maxLimit(overrides?: CallOverrides): Promise; - owner(overrides?: CallOverrides): Promise; - - setOwner( - newOwner: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): Promise; - callStatic: { limiter( _userCredit: PromiseOrValue, @@ -153,25 +104,9 @@ export interface Reputation extends BaseContract { magicValue(overrides?: CallOverrides): Promise; maxLimit(overrides?: CallOverrides): Promise; - - owner(overrides?: CallOverrides): Promise; - - setOwner( - newOwner: PromiseOrValue, - overrides?: CallOverrides - ): Promise; }; - filters: { - "OwnerUpdated(address,address)"( - user?: PromiseOrValue | null, - newOwner?: PromiseOrValue | null - ): OwnerUpdatedEventFilter; - OwnerUpdated( - user?: PromiseOrValue | null, - newOwner?: PromiseOrValue | null - ): OwnerUpdatedEventFilter; - }; + filters: {}; estimateGas: { limiter( @@ -182,13 +117,6 @@ export interface Reputation extends BaseContract { magicValue(overrides?: CallOverrides): Promise; maxLimit(overrides?: CallOverrides): Promise; - - owner(overrides?: CallOverrides): Promise; - - setOwner( - newOwner: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): Promise; }; populateTransaction: { @@ -200,12 +128,5 @@ export interface Reputation extends BaseContract { magicValue(overrides?: CallOverrides): Promise; maxLimit(overrides?: CallOverrides): Promise; - - owner(overrides?: CallOverrides): Promise; - - setOwner( - newOwner: PromiseOrValue, - overrides?: Overrides & { from?: PromiseOrValue } - ): Promise; }; } diff --git a/src/types/factories/Reputation__factory.ts b/src/types/factories/Reputation__factory.ts index fb47f0e..1903d03 100644 --- a/src/types/factories/Reputation__factory.ts +++ b/src/types/factories/Reputation__factory.ts @@ -12,25 +12,6 @@ const _abi = [ stateMutability: "nonpayable", type: "constructor", }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "user", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "OwnerUpdated", - type: "event", - }, { inputs: [ { @@ -76,36 +57,10 @@ const _abi = [ stateMutability: "view", type: "function", }, - { - inputs: [], - name: "owner", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "setOwner", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, ]; const _bytecode = - "0x6080806040523461004f57600080546001600160a01b031916339081178255907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a361043e90816100558239f35b600080fdfe608060408181526004918236101561001657600080fd5b600092833560e01c91826313af4035146102f6575081631a861d26146102ba5781634d2b1791146100ec575080638da5cb5b1461009c5763a4b345571461005c57600080fd5b3461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051643a352944008152f35b5080fd5b503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b8383346100985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261009857823591620f4240838102908104840361028e578380029380850481149015171561028e57643a3529440093840180941161028e5760b58471010000000000000000000000000000000000811015610277575b8069010000000000000000006201000092101561026b575b6501000000000081101561025e575b6301000000811015610251575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146102255703900483018093116101f9576020838351908152f35b806011857f4e487b71000000000000000000000000000000000000000000000000000000006024945252fd5b6024846012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b916101a3565b60201c9160101b91610196565b851c9160201b91610187565b5068b500000000000000009050608085901c61016f565b6024826011877f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461009857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100985760209051620f42408152f35b8491346104045760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126104045780359173ffffffffffffffffffffffffffffffffffffffff9182841680940361040057845492831633036103a55750507fffffffffffffffffffffffff00000000000000000000000000000000000000001681178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b9060206064927f08c379a0000000000000000000000000000000000000000000000000000000008352820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b8480fd5b8280fdfea2646970667358221220ebc26f1432d13f128c50ef3a8297ef65a17fc376c17056b77b447e21b462442464736f6c63430008130033"; + "0x60808060405234610016576102c9908161001c8239f35b600080fdfe6080806040526004908136101561001557600080fd5b600091823560e01c9182631a861d2614610254575081634d2b179114610085575063a4b345571461004557600080fd5b3461008257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610082576020604051643a352944008152f35b80fd5b82346100825760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261008257813591620f42408381029081048403610228578380029380850481149015171561022857643a352944009384018094116102285760b58471010000000000000000000000000000000000811015610211575b80690100000000000000000062010000921015610204575b650100000000008110156101f7575b63010000008110156101ea575b010260121c9360019480820401851c80820401851c80820401851c80820401851c80820401851c80820401851c80820401851c8080920410908181146101be57039004830180931161019257602083604051908152f35b9060116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b6024856012867f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60101c9160081b9161013b565b60201c9160101b9161012e565b60401c9160201b9161011f565b5068b500000000000000009050608085901c610107565b6024836011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b83903461028f57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261028f5780620f424060209252f35b5080fdfea26469706673582212201f57ae0c5884bdde41f85c3510ca33502ea7408e92d2669d2cb4da374119f5e064736f6c63430008130033"; type ReputationConstructorParams = | [signer?: Signer] diff --git a/src/types/factories/lib/auth/Owned__factory.ts b/src/types/factories/lib/auth/Owned__factory.ts index 8b260c7..7e0d7ab 100644 --- a/src/types/factories/lib/auth/Owned__factory.ts +++ b/src/types/factories/lib/auth/Owned__factory.ts @@ -7,6 +7,11 @@ import type { Provider } from "@ethersproject/providers"; import type { Owned, OwnedInterface } from "../../../lib/auth/Owned"; const _abi = [ + { + inputs: [], + name: "Unauthorized", + type: "error", + }, { anonymous: false, inputs: [ diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index 638bc5c..0ca0e4a 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -145,6 +145,11 @@ const _abi = [ name: "TxAlreadyUsed", type: "error", }, + { + inputs: [], + name: "Unauthorized", + type: "error", + }, { anonymous: false, inputs: [ @@ -1082,7 +1087,7 @@ const _abi = [ ]; const _bytecode = - "0x608060405262002a8a803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516126279081620004638239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a1620003af565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b156200037b57565b60405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606490fd5b90600090620003c960018060a01b03835416331462000373565b82519182156200045557815183036200044857602092919284818080970195019360051b0101925b83810362000400575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003f1565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e57611594565b611522565b611477565b61145e565b6113bc565b610f2d565b610ef9565b610ebf565b610e69565b610e29565b610811565b610e0b565b610ded565b610db9565b610d20565b610cb9565b610ca0565b610c4f565b610c17565b610b06565b610ae3565b610aa3565b610a1c565b6109b5565b61098b565b6108f4565b610762565b610532565b61047f565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b73ffffffffffffffffffffffffffffffffffffffff6103d1816000541633146116ad565b8151828401939060051b830181013d1515855b811561044b575b50505060405192818401908285525180915260408401949160005b828110610435577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610406565b90838260018298969499979951600c1b550190838210156104735791509593959492946103e4565b509593959492946103eb565b346102425760206003193601126102425760043561049c816102f5565b7fffffffffffffffffffffffff000000000000000000000000000000000000000060009182549073ffffffffffffffffffffffffffffffffffffffff906104e682841633146116ad565b1691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a06003193601126102425760043561054f816102f5565b6024356bffffffffffffffffffffffff8116908181036102425760443590610576826102f5565b61057e610516565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610738576105c66105c28363cbc9d1c4600c526000526020600c205490565b1590565b61070e576b3fffffffffffffffffffffff6105f783839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061060f8584611754565b116106e457826106cf976106899661065b89610680967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61064f611761565b806106d4575b50611754565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b3090339061179c565b61069260018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6106de9033611e9d565b38610655565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610852575050505090565b835185529381019392810192600101610844565b9061087990604083526040830190610832565b81810360209283015282518082529082019282019160009190825b8281106108a357505050505090565b909192939485516004808210156108c857508152820194820193929190600101610894565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610932826102dd565b916109406040519384610276565b80835260248484019160051b8301019136831161024257602401905b82821061097c5761096c846124ab565b9061080d60405192839283610866565b8135815290840190840161095c565b346102425760206003193601126102425760206004356109aa816102f5565b60405190600c1b8152f35b34610242576020600319360112610242577f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85116020600435610a0f73ffffffffffffffffffffffffffffffffffffffff6000541633146116ad565b80600355604051908152a1005b3461024257600080600319360112610aa057610a5073ffffffffffffffffffffffffffffffffffffffff82541633146116ad565b478180808084335af115610a93576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610ad9600435610ac5816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b23816102f5565b602435801515908181036102425733600c1b610b5584829060205263739094b1600c52600c1c6000526034600c205490565b918215610bed57610ba4927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c476004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c6f816102f5565b60243590611e9d565b600319604091011261024257600435610c90816102f5565b90602435610c9d816102f5565b90565b34610242576020610ad9610cb336610c78565b906123f3565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d3d816102f5565b60243590610d4a826102f5565b60443590610d57826102f5565b67ffffffffffffffff9160a43583811161024257610d79903690600401610cef565b9060c4359485116102425761080d95610d99610da9963690600401610cef565b95909460843592606435926118ad565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c47602435610e4b816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e7736610c78565b6000903d15610ea2575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e81565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610ef3610019913690600401610cef565b90611cab565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f57611761565b610f6b816000526005602052604060002090565b906003820180549283156113825784810190815443116113595760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110067fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110556020820192826110498786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461133157885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa1561132c576110ae6110a98a51600c1b90565b541590565b6113055750859493611242937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461114061110c958d61112561110c600861122b9b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111376002870197885490611c11565b98555560019055565b6112056006600783019261116b61110c855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112d957845461119561118d33600c1b6000526006602052604060002090565b918254611754565b90556111d16111c16111bb865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111dc8d8254611754565b90555b01946111ff865473ffffffffffffffffffffffffffffffffffffffff1690565b85611c1e565b815480611251575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261124e60018055565b80f35b61127261110c835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112c657506112bd92916112ae6112a26112b5935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611c1e565b5460011c90565b903390611c1e565b3880808061120d565b9150506112d4913390611c1e565b6112bd565b6112e48c8654611754565b6112fe61118d33600c1b6000526006602052604060002090565b90556111df565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611c05565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610c9d928181520190610832565b346102425760406003193601126102425760043567ffffffffffffffff8111610242576113ed903690600401610313565b602435906113fa826102f5565b60009181519161140983612448565b935b838110611420576040518061080d87826113ab565b8061144d8473ffffffffffffffffffffffffffffffffffffffff61144660019587612497565b51166123bc565b6114578288612497565b520161140b565b34610242576020610c4761147136610c78565b906123bc565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114a9903690600401610313565b9060243590811161024257366023820112156102425780600401356114cd816102dd565b916114db6040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b82821061150b576100198587611eec565b83809161151784610525565b8152019101906114fa565b34610242576020600319360112610242577fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f6020600435611562816102f5565b73ffffffffffffffffffffffffffffffffffffffff611586816000541633146116ad565b8160025560405191168152a1005b34610242576060600319360112610242576004356115b1816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e9161160a6115fc611696933690600401610cef565b90611605611761565b611cab565b600161161685336123f3565b15151461169f575b61165a33600c1b85836b3fffffffffffffffffffffff61165483859060205263739094b1600c52600c1c6000526034600c205490565b16612380565b611665813386611c1e565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116a8846117f5565b61161e565b156116b457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161174f57565b611712565b9190820180921161174f57565b600260015414611772576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d156001600051141716156117e7576000606052604052565b637939f4246000526004601cfd5b33600c1b61181982829060205263739094b1600c52600c1c6000526034600c205490565b908115610bed57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118629316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b906118c698979695949392916118c1611761565b611917565b9060018055565b90670de0b6b3a76400009182810292818404149015171561174f57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461174f5760010190565b949673ffffffffffffffffffffffffffffffffffffffff929861193c91959495611cab565b169261194b6105c285836123f3565b611bdb5761195984826123bc565b90828210611bb157600c1b946004966119728854611741565b98886119888b6000526005602052604060002090565b0154431115611b88579087611a498b96959493611a2c6119e96119cd8c6119b160035443611754565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119f16102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611abb575092611ab09592611aab611ab6999693610c9d9b99963391611aa58a6374dfee70600c52600c1c60005260206000205490565b91612279565b612011565b546118ea565b600455565b805190925068056bc75e2d63100000109050611ae7575092611ab69592610c9d979592611ab095612011565b90919250611b1c611b17611b0833600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b612307565b611b278251916118cd565b10908115611b73575b50611b4a5792611ab09287611ab69693610c9d9896612011565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611b30565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161174f57565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c5a57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611ca65760051b0190565b611c67565b9060009182905b828210611ccf575010611cc25750565b63dfb035c990526004601cfd5b90611cef611cde828585611c96565b356000526005602052604060002090565b90611cf982611fa7565b8154611d1f61110c600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d4d85849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d6c87548095611754565b116106e457600195611d9f6006948b93611e2c979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611dc46111bb600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611ddb6112ae826000526006602052604060002090565b68056bc75e2d631000008111611e825750611e03611e11916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e6d848888611c96565b60405190358152921691602090a20190611cb2565b90611e97906000526006602052604060002090565b55611e11565b338103611ede576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b90600090611f1273ffffffffffffffffffffffffffffffffffffffff83541633146116ad565b8251918215611f9a5781518303611f8d57602092919284818080970195019360051b0101925b838103611f46575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611f38565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611fe7576003015415611fbd57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122557f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65949261223b73ffffffffffffffffffffffffffffffffffffffff9598612274948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120fb6120b760a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61223660c08a0196612168612124895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121d061218c60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121f46101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612380565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff82939416926122cb575b5050036122a157565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122fc5792906122d5565b509150503880612298565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561237257565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123ae5760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d156123ca575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d15612401575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612452826102dd565b61245f6040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061248d82946102dd565b0190602036910137565b8051821015611ca65760209160051b010190565b908151156125de57600080928051906124c382612448565b926124cd83612448565b955b8381106124de57505050509190565b806124ff6124ee60019386612497565b516000526005602052604060002090565b5461252f5761250e8185612497565b516125198288612497565b5282612525828a612497565b5201925b926124cf565b600361253e6124ee8387612497565b01546125745761254e8185612497565b516125598288612497565b5261256d612567828a612497565b60039052565b0192612529565b60046125836124ee8387612497565b01544311156125b5576125968185612497565b516125a18288612497565b5261256d6125af828a612497565b60029052565b6125bf8185612497565b516125ca8288612497565b5261256d6125d8828a612497565b60019052565b90506125e861241f565b90610c9d61241f56fea26469706673582212206ea195dd81afc0218be546387a10d6df5dc2cc428d5f2e970c86b7514266fd4964736f6c63430008130033"; + "0x608060405262002a0f803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516125d99081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index 6395b18..c242324 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -179,7 +179,7 @@ describe("P2PIX", () => { await expect( p2pix.connect(acc01).withdrawBalance(), - ).to.be.revertedWith(P2PixErrors.UNAUTHORIZED); + ).to.be.revertedWithCustomError(p2pix, P2PixErrors.Unauthorized); }); it("should allow owner to change reputation instance", async () => { const tx = await p2pix.setReputation(acc03.address); @@ -193,8 +193,9 @@ describe("P2PIX", () => { .to.emit(p2pix, "ReputationUpdated") .withArgs(acc03.address); expect(newRep).to.eq(acc03.address); - await expect(fail).to.be.revertedWith( - P2PixErrors.UNAUTHORIZED, + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.Unauthorized, ); }); it("should allow owner to change defaultLockBlocks ", async () => { @@ -211,8 +212,9 @@ describe("P2PIX", () => { .to.emit(p2pix, "LockBlocksUpdated") .withArgs(magicVal); expect(newVal).to.eq(magicVal); - await expect(fail).to.be.revertedWith( - P2PixErrors.UNAUTHORIZED, + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.Unauthorized, ); }); it("should allow owner to add valid Bacen signers", async () => { @@ -236,8 +238,9 @@ describe("P2PIX", () => { await expect(tx) .to.emit(p2pix, "ValidSignersUpdated") .withArgs([bob, alice]); - await expect(fail).to.be.revertedWith( - P2PixErrors.UNAUTHORIZED, + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.Unauthorized, ); }); it("should allow owner to adjust tokenSettings", async () => { @@ -274,11 +277,13 @@ describe("P2PIX", () => { .withArgs(owner.address, true); expect(newTokenState1).to.eq(false); expect(newTokenState2).to.eq(true); - await expect(fail).to.be.revertedWith( - P2PixErrors.UNAUTHORIZED, + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.Unauthorized, ); - await expect(fail).to.be.revertedWith( - P2PixErrors.UNAUTHORIZED, + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.Unauthorized, ); await expect(fail2).to.be.revertedWithCustomError( p2pix, @@ -293,7 +298,6 @@ describe("P2PIX", () => { multicall, P2PixErrors.CallFailed, ) - .withArgs(P2PixErrors.UNAUTHORIZED); }); }); describe("Deposit", async () => { diff --git a/test/utils/errors.ts b/test/utils/errors.ts index 310e7b9..52fee58 100644 --- a/test/utils/errors.ts +++ b/test/utils/errors.ts @@ -7,7 +7,7 @@ export enum P2PixErrors { AlreadyReleased = "AlreadyReleased", TxAlreadyUsed = "TxAlreadyUsed", InvalidSigner = "InvalidSigner", - UNAUTHORIZED = "UNAUTHORIZED", + Unauthorized = "Unauthorized", TokenDenied = "TokenDenied", NoTokens = "NoTokens", LengthMismatch = "LengthMismatch",