@ensuro/core 2.6.2 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/contracts/PolicyPool.sol/PolicyPool.json +2 -2
- package/build/contracts/mocks/PolicyHolderMock.sol/PolicyHolderMock.json +102 -11
- package/contracts/PolicyPool.sol +26 -26
- package/contracts/mocks/PolicyHolderMock.sol +78 -24
- package/js/constants.js +8 -2
- package/js/deploy.js +24 -26
- package/js/enums.js +26 -8
- package/js/test-utils.js +78 -7
- package/js/utils.js +19 -2
- package/package.json +1 -1
|
@@ -1409,8 +1409,8 @@
|
|
|
1409
1409
|
"type": "function"
|
|
1410
1410
|
}
|
|
1411
1411
|
],
|
|
1412
|
-
"bytecode": "0x60e0604052306080523480156200001557600080fd5b5060405162005cb638038062005cb683398101604081905262000038916200020b565b6001600160a01b038216620000a65760405162461bcd60e51b815260206004820152602960248201527f506f6c696379506f6f6c3a206163636573732063616e6e6f74206265207a65726044820152686f206164647265737360b81b60648201526084015b60405180910390fd5b6001600160a01b038116620001125760405162461bcd60e51b815260206004820152602b60248201527f506f6c696379506f6f6c3a2063757272656e63792063616e6e6f74206265207a60448201526a65726f206164647265737360a81b60648201526084016200009d565b6200011c62000134565b6001600160a01b0391821660a0521660c0526200024a565b600054610100900460ff16156200019e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200009d565b60005460ff90811614620001f0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200020857600080fd5b50565b600080604083850312156200021f57600080fd5b82516200022c81620001f2565b60208401519092506200023f81620001f2565b809150509250929050565b60805160a05160c05161598d620003296000396000818161076401528181610e7b01528181610eef01528181610f5001528181611a6901528181611b1401528181611bbd01528181611bfc01528181611d2d015261349c01526000818161060901528181610d3d015281816111e0015281816112e001528181611406015281816114d5015281816115a401528181611e600152818161247d01528181612b0b01528181612d5e0152818161331401526133a8015260008181610c4001528181610c800152818161104001528181611080015261110f015261598d6000f3fe6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614c58565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614cc5565b3480156102b957600080fd5b506102cd6102c8366004614dba565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614e32565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614e4b565b610af0565b34801561033357600080fd5b506102cd610342366004614e77565b610c05565b34801561035357600080fd5b5061036960008051602061593883398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614eb8565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614f09565b3480156103ca57600080fd5b506102cd6103d9366004614eb8565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614e77565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614e4b565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614f1c565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004614f6c565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd610516366004614fae565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614e32565b611731565b34801561056657600080fd5b506103696105753660046150ce565b611791565b34801561058657600080fd5b506102cd610595366004615157565b611dc3565b3480156105a657600080fd5b506102cd6105b5366004614fae565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614eb8565b612464565b3480156105e657600080fd5b506103696105f5366004614eb8565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614e32565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615174565b612ad0565b34801561068757600080fd5b50610276610696366004614e32565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db3660046151a1565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615225565b612c72565b34801561072157600080fd5b506102cd610730366004615253565b612c7d565b34801561074157600080fd5b506102a0610750366004614e32565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a33660046152bf565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614eb8565b612d45565b3480156107d457600080fd5b506103696107e3366004614e4b565b612deb565b3480156107f457600080fd5b506103696000805160206158f183398151915281565b34801561081657600080fd5b506102cd6108253660046152ed565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb80546108659061531c565b80601f01602080910402602001604051908101604052809291908181526020018280546108919061531c565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b815260040161098190615350565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906153e9565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614ed5565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615435565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615435565b610fc79190615464565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615435565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906153e9565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206158d183398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906154c5565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614ed5565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614ed5565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615585565b80611578575060038460038111156114c3576114c3614ed5565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615938833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615585565b806116475750600284600381111561159257611592614ed5565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615585565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614ed5565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff169088906155a2565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614ed5565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906155c8565b905060016118e9826138f5565b60038111156118fa576118fa614ed5565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166155e5565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a906004016156b0565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906155c8565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906155c8565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906155c8565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906155c8565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac91906156b0565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a084016156bf565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836156da565b60006001613a35565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614ed5565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906155c8565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614ed5565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615585565b80612149575060038360038111156120d2576120d2614ed5565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615585565b806121da5750600283600381111561216357612163614ed5565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615585565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614ed5565b0217905550600383600381111561226d5761226d614ed5565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906155c8565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906155c8565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8460016040516124569291906155a2565b60405180910390a250505050565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614ed5565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614ed5565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615435565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614ed5565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615435565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614ed5565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615435565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906155c8565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906155c8565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff16906000906155a2565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846156da565b826000613a35565b6000805160206159388339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6156f7565b90506101c002016101a0016020810190612bd791906156bf565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6156f7565b90506101c00201803603810190611e3e91906156da565b80612c5b8161570d565b915050612ba2565b606060fc80546108659061531c565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b815260040161098190615350565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615726565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614ed5565b1480612e3357506002816003811115612e3157612e31614ed5565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615435565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846156da565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615755565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615755565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615755565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615755565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b8152600401610981906157a0565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b8152600401610981906157a0565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906155c8565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906155c8565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615435565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206158d183398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614ed5565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614ed5565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614ed5565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b60008160405160200161399691906156b0565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906157e5565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614ed5565b1480613b4657506002816003811115613b4457613b44614ed5565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906155c8565b9050613c7b816138f5565b92506001836003811115613c9157613c91614ed5565b1480613cae57506002836003811115613cac57613cac614ed5565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615837565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a906004016156b0565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061485e565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906157e5565b606061013080546108659061531c565b6060600061405183614905565b600101905060008167ffffffffffffffff81111561407157614071614cd8565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615755565b60fb6141da83826154c5565b5060fc610c0082826154c5565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615755565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206158d183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149dd565b6000825111806142d95750805b15610c0057610ac38383614a1d565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a429092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615585565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615864565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615897565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906157e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b6001600160a01b03811663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606481018590526084016020604051808303816000875af19250505080156147ab575060408051601f3d908101601f191682019092526147a891810190615897565b60015b6147ee573d8080156147d9576040519150601f19603f3d011682016040523d82523d6000602084013e6147de565b606091505b5080516000036146735750505050565b6001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152602760248201527f496e76616c69642072657475726e2076616c75652066726f6d20506f6c696379604482015266102437b63232b960c91b6064820152608401610981565b600061486982611731565b90506001600160a01b0381163b61487e575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af19250505080156148fd575060408051601f3d908101601f191682019092526148fa91810190615897565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106149445772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614970576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061498e57662386f26fc10000830492506010015b6305f5e10083106149a6576305f5e100830492506008015b61271083106149ba57612710830492506004015b606483106149cc576064830492506002015b600a83106108505760010192915050565b6149e681614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f838360405180606001604052806027815260200161591160279139614a51565b6060611dbb8484600085614ac9565b6060600080856001600160a01b031685604051614a6e91906158b4565b600060405180830381855af49150503d8060008114614aa9576040519150601f19603f3d011682016040523d82523d6000602084013e614aae565b606091505b5091509150614abf86838387614ba4565b9695505050505050565b606082471015614b2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b4691906158b4565b60006040518083038185875af1925050503d8060008114614b83576040519150601f19603f3d011682016040523d82523d6000602084013e614b88565b606091505b5091509150614b9987838387614ba4565b979650505050505050565b60608315614c13578251600003614c0c576001600160a01b0385163b614c0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614c285781518083602001fd5b8060405162461bcd60e51b81526004016109819190614cc5565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614c6a57600080fd5b8135612d0f81614c42565b60005b83811015614c90578181015183820152602001614c78565b50506000910152565b60008151808452614cb1816020860160208601614c75565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614c99565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614d1257614d12614cd8565b60405290565b600082601f830112614d2957600080fd5b813567ffffffffffffffff80821115614d4457614d44614cd8565b604051601f8301601f19908116603f01168101908282118183101715614d6c57614d6c614cd8565b81604052838152866020858801011115614d8557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614dcf57600080fd5b833567ffffffffffffffff80821115614de757600080fd5b614df387838801614d18565b94506020860135915080821115614e0957600080fd5b50614e1686828701614d18565b9250506040840135614e2781614da5565b809150509250925092565b600060208284031215614e4457600080fd5b5035919050565b60008060408385031215614e5e57600080fd5b8235614e6981614da5565b946020939093013593505050565b600080600060608486031215614e8c57600080fd5b8335614e9781614da5565b92506020840135614ea781614da5565b929592945050506040919091013590565b600060208284031215614eca57600080fd5b8135612d0f81614da5565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614f1683614eeb565b91905290565b60008060408385031215614f2f57600080fd5b8235614f3a81614da5565b9150602083013567ffffffffffffffff811115614f5657600080fd5b614f6285828601614d18565b9150509250929050565b600060208284031215614f7e57600080fd5b813567ffffffffffffffff811115614f9557600080fd5b611dbb84828501614d18565b60048110610d1257600080fd5b60008060408385031215614fc157600080fd5b8235614fcc81614da5565b91506020830135614fdc81614fa1565b809150509250929050565b80356139fd81614da5565b803564ffffffffff811681146139fd57600080fd5b60006101c0828403121561501a57600080fd5b615022614cee565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013581830152506101606150a0818401614fe7565b908201526101806150b2838201614ff2565b908201526101a06150c4838201614ff2565b9082015292915050565b60008060008061022085870312156150e557600080fd5b6150ef8686615007565b93506101c085013561510081614da5565b92506101e085013561511181614da5565b91506102008501356bffffffffffffffffffffffff8116811461513357600080fd5b939692955090935050565b60006101c0828403121561515157600080fd5b50919050565b60006101c0828403121561516a57600080fd5b612d0f838361513e565b6000806101e0838503121561518857600080fd5b615192848461513e565b946101c0939093013593505050565b600080602083850312156151b457600080fd5b823567ffffffffffffffff808211156151cc57600080fd5b818501915085601f8301126151e057600080fd5b8135818111156151ef57600080fd5b8660206101c08302850101111561520557600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561523857600080fd5b823561524381614da5565b91506020830135614fdc81615217565b6000806000806080858703121561526957600080fd5b843561527481614da5565b9350602085013561528481614da5565b925060408501359150606085013567ffffffffffffffff8111156152a757600080fd5b6152b387828801614d18565b91505092959194509250565b600080604083850312156152d257600080fd5b82356152dd81614da5565b91506020830135614fdc81614da5565b6000806101e0838503121561530157600080fd5b61530b848461513e565b91506101c0830135614fdc81615217565b600181811c9082168061533057607f821691505b60208210810361515157634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561544757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061544e565b601f821115610c0057600081815260208120601f850160051c8101602086101561549e5750805b601f850160051c820191505b818110156154bd578281556001016154aa565b505050505050565b815167ffffffffffffffff8111156154df576154df614cd8565b6154f3816154ed845461531c565b84615477565b602080601f83116001811461552857600084156155105750858301515b600019600386901b1c1916600185901b1785556154bd565b600085815260208120601f198616915b8281101561555757888601518255948401946001909101908401615538565b50858210156155755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561559757600080fd5b8151612d0f81615217565b604081016155af84614eeb565b8382526155bb83614eeb565b8260208301529392505050565b6000602082840312156155da57600080fd5b8151612d0f81614da5565b808201808211156108505761085061544e565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151818401525061012080820151818401525061014080820151818401525061016080820151615681828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846155f8565b6000602082840312156156d157600080fd5b612d0f82614ff2565b60006101c082840312156156ed57600080fd5b612d0f8383615007565b634e487b7160e01b600052603260045260246000fd5b60006001820161571f5761571f61544e565b5060010190565b60008351615738818460208801614c75565b83519083019061574c818360208801614c75565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161585560208301856155f8565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614abf90830184614c99565b6000602082840312156158a957600080fd5b8151612d0f81614c42565b600082516158c6818460208701614c75565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f99dac5ff11d2fa346d53b4451dee3002f93af94585ce2641398c570c29526dc64736f6c63430008100033",
|
|
1413
|
-
"deployedBytecode": "0x6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614c58565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614cc5565b3480156102b957600080fd5b506102cd6102c8366004614dba565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614e32565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614e4b565b610af0565b34801561033357600080fd5b506102cd610342366004614e77565b610c05565b34801561035357600080fd5b5061036960008051602061593883398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614eb8565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614f09565b3480156103ca57600080fd5b506102cd6103d9366004614eb8565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614e77565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614e4b565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614f1c565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004614f6c565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd610516366004614fae565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614e32565b611731565b34801561056657600080fd5b506103696105753660046150ce565b611791565b34801561058657600080fd5b506102cd610595366004615157565b611dc3565b3480156105a657600080fd5b506102cd6105b5366004614fae565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614eb8565b612464565b3480156105e657600080fd5b506103696105f5366004614eb8565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614e32565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615174565b612ad0565b34801561068757600080fd5b50610276610696366004614e32565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db3660046151a1565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615225565b612c72565b34801561072157600080fd5b506102cd610730366004615253565b612c7d565b34801561074157600080fd5b506102a0610750366004614e32565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a33660046152bf565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614eb8565b612d45565b3480156107d457600080fd5b506103696107e3366004614e4b565b612deb565b3480156107f457600080fd5b506103696000805160206158f183398151915281565b34801561081657600080fd5b506102cd6108253660046152ed565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb80546108659061531c565b80601f01602080910402602001604051908101604052809291908181526020018280546108919061531c565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b815260040161098190615350565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906153e9565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614ed5565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615435565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615435565b610fc79190615464565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615435565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b81526004016109819061539d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206158d1833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906153e9565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206158d183398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906154c5565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614ed5565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614ed5565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615585565b80611578575060038460038111156114c3576114c3614ed5565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615938833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615585565b806116475750600284600381111561159257611592614ed5565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206158f1833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615585565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614ed5565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff169088906155a2565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614ed5565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906155c8565b905060016118e9826138f5565b60038111156118fa576118fa614ed5565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166155e5565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a906004016156b0565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906155c8565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906155c8565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906155c8565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906155c8565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac91906156b0565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a084016156bf565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836156da565b60006001613a35565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614ed5565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906155c8565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614ed5565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615585565b80612149575060038360038111156120d2576120d2614ed5565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615585565b806121da5750600283600381111561216357612163614ed5565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615585565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614ed5565b0217905550600383600381111561226d5761226d614ed5565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906155c8565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906155c8565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef8460016040516124569291906155a2565b60405180910390a250505050565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614ed5565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614ed5565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615435565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614ed5565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615435565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614ed5565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615435565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906155c8565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906155c8565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff16906000906155a2565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846156da565b826000613a35565b6000805160206159388339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6156f7565b90506101c002016101a0016020810190612bd791906156bf565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6156f7565b90506101c00201803603810190611e3e91906156da565b80612c5b8161570d565b915050612ba2565b606060fc80546108659061531c565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b815260040161098190615350565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615726565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206158f18339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614ed5565b1480612e3357506002816003811115612e3157612e31614ed5565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615435565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846156da565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615755565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615755565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615755565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615755565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b8152600401610981906157a0565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b8152600401610981906157a0565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000805160206159388339815191526000805160206158f18339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906155c8565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906155c8565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615435565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206158d183398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614ed5565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614ed5565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614ed5565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b60008160405160200161399691906156b0565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906157e5565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614ed5565b1480613b4657506002816003811115613b4457613b44614ed5565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906155c8565b9050613c7b816138f5565b92506001836003811115613c9157613c91614ed5565b1480613cae57506002836003811115613cac57613cac614ed5565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615837565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a906004016156b0565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061485e565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906157e5565b606061013080546108659061531c565b6060600061405183614905565b600101905060008167ffffffffffffffff81111561407157614071614cd8565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615755565b60fb6141da83826154c5565b5060fc610c0082826154c5565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615755565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206158d183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149dd565b6000825111806142d95750805b15610c0057610ac38383614a1d565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a429092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615585565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615864565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615897565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906157e5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b6001600160a01b03811663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101869052606481018590526084016020604051808303816000875af19250505080156147ab575060408051601f3d908101601f191682019092526147a891810190615897565b60015b6147ee573d8080156147d9576040519150601f19603f3d011682016040523d82523d6000602084013e6147de565b606091505b5080516000036146735750505050565b6001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152602760248201527f496e76616c69642072657475726e2076616c75652066726f6d20506f6c696379604482015266102437b63232b960c91b6064820152608401610981565b600061486982611731565b90506001600160a01b0381163b61487e575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af19250505080156148fd575060408051601f3d908101601f191682019092526148fa91810190615897565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106149445772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614970576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061498e57662386f26fc10000830492506010015b6305f5e10083106149a6576305f5e100830492506008015b61271083106149ba57612710830492506004015b606483106149cc576064830492506002015b600a83106108505760010192915050565b6149e681614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f838360405180606001604052806027815260200161591160279139614a51565b6060611dbb8484600085614ac9565b6060600080856001600160a01b031685604051614a6e91906158b4565b600060405180830381855af49150503d8060008114614aa9576040519150601f19603f3d011682016040523d82523d6000602084013e614aae565b606091505b5091509150614abf86838387614ba4565b9695505050505050565b606082471015614b2a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b4691906158b4565b60006040518083038185875af1925050503d8060008114614b83576040519150601f19603f3d011682016040523d82523d6000602084013e614b88565b606091505b5091509150614b9987838387614ba4565b979650505050505050565b60608315614c13578251600003614c0c576001600160a01b0385163b614c0c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614c285781518083602001fd5b8060405162461bcd60e51b81526004016109819190614cc5565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614c6a57600080fd5b8135612d0f81614c42565b60005b83811015614c90578181015183820152602001614c78565b50506000910152565b60008151808452614cb1816020860160208601614c75565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614c99565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614d1257614d12614cd8565b60405290565b600082601f830112614d2957600080fd5b813567ffffffffffffffff80821115614d4457614d44614cd8565b604051601f8301601f19908116603f01168101908282118183101715614d6c57614d6c614cd8565b81604052838152866020858801011115614d8557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614dcf57600080fd5b833567ffffffffffffffff80821115614de757600080fd5b614df387838801614d18565b94506020860135915080821115614e0957600080fd5b50614e1686828701614d18565b9250506040840135614e2781614da5565b809150509250925092565b600060208284031215614e4457600080fd5b5035919050565b60008060408385031215614e5e57600080fd5b8235614e6981614da5565b946020939093013593505050565b600080600060608486031215614e8c57600080fd5b8335614e9781614da5565b92506020840135614ea781614da5565b929592945050506040919091013590565b600060208284031215614eca57600080fd5b8135612d0f81614da5565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614f1683614eeb565b91905290565b60008060408385031215614f2f57600080fd5b8235614f3a81614da5565b9150602083013567ffffffffffffffff811115614f5657600080fd5b614f6285828601614d18565b9150509250929050565b600060208284031215614f7e57600080fd5b813567ffffffffffffffff811115614f9557600080fd5b611dbb84828501614d18565b60048110610d1257600080fd5b60008060408385031215614fc157600080fd5b8235614fcc81614da5565b91506020830135614fdc81614fa1565b809150509250929050565b80356139fd81614da5565b803564ffffffffff811681146139fd57600080fd5b60006101c0828403121561501a57600080fd5b615022614cee565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e08201526101008083013581830152506101208083013581830152506101408083013581830152506101606150a0818401614fe7565b908201526101806150b2838201614ff2565b908201526101a06150c4838201614ff2565b9082015292915050565b60008060008061022085870312156150e557600080fd5b6150ef8686615007565b93506101c085013561510081614da5565b92506101e085013561511181614da5565b91506102008501356bffffffffffffffffffffffff8116811461513357600080fd5b939692955090935050565b60006101c0828403121561515157600080fd5b50919050565b60006101c0828403121561516a57600080fd5b612d0f838361513e565b6000806101e0838503121561518857600080fd5b615192848461513e565b946101c0939093013593505050565b600080602083850312156151b457600080fd5b823567ffffffffffffffff808211156151cc57600080fd5b818501915085601f8301126151e057600080fd5b8135818111156151ef57600080fd5b8660206101c08302850101111561520557600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561523857600080fd5b823561524381614da5565b91506020830135614fdc81615217565b6000806000806080858703121561526957600080fd5b843561527481614da5565b9350602085013561528481614da5565b925060408501359150606085013567ffffffffffffffff8111156152a757600080fd5b6152b387828801614d18565b91505092959194509250565b600080604083850312156152d257600080fd5b82356152dd81614da5565b91506020830135614fdc81614da5565b6000806101e0838503121561530157600080fd5b61530b848461513e565b91506101c0830135614fdc81615217565b600181811c9082168061533057607f821691505b60208210810361515157634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561544757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061544e565b601f821115610c0057600081815260208120601f850160051c8101602086101561549e5750805b601f850160051c820191505b818110156154bd578281556001016154aa565b505050505050565b815167ffffffffffffffff8111156154df576154df614cd8565b6154f3816154ed845461531c565b84615477565b602080601f83116001811461552857600084156155105750858301515b600019600386901b1c1916600185901b1785556154bd565b600085815260208120601f198616915b8281101561555757888601518255948401946001909101908401615538565b50858210156155755787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561559757600080fd5b8151612d0f81615217565b604081016155af84614eeb565b8382526155bb83614eeb565b8260208301529392505050565b6000602082840312156155da57600080fd5b8151612d0f81614da5565b808201808211156108505761085061544e565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151818401525061012080820151818401525061014080820151818401525061016080820151615681828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846155f8565b6000602082840312156156d157600080fd5b612d0f82614ff2565b60006101c082840312156156ed57600080fd5b612d0f8383615007565b634e487b7160e01b600052603260045260246000fd5b60006001820161571f5761571f61544e565b5060010190565b60008351615738818460208801614c75565b83519083019061574c818360208801614c75565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161585560208301856155f8565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614abf90830184614c99565b6000602082840312156158a957600080fd5b8151612d0f81614c42565b600082516158c6818460208701614c75565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f99dac5ff11d2fa346d53b4451dee3002f93af94585ce2641398c570c29526dc64736f6c63430008100033",
|
|
1412
|
+
"bytecode": "0x60e0604052306080523480156200001557600080fd5b5060405162005d9238038062005d9283398101604081905262000038916200020b565b6001600160a01b038216620000a65760405162461bcd60e51b815260206004820152602960248201527f506f6c696379506f6f6c3a206163636573732063616e6e6f74206265207a65726044820152686f206164647265737360b81b60648201526084015b60405180910390fd5b6001600160a01b038116620001125760405162461bcd60e51b815260206004820152602b60248201527f506f6c696379506f6f6c3a2063757272656e63792063616e6e6f74206265207a60448201526a65726f206164647265737360a81b60648201526084016200009d565b6200011c62000134565b6001600160a01b0391821660a0521660c0526200024a565b600054610100900460ff16156200019e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016200009d565b60005460ff90811614620001f0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200020857600080fd5b50565b600080604083850312156200021f57600080fd5b82516200022c81620001f2565b60208401519092506200023f81620001f2565b809150509250929050565b60805160a05160c051615a69620003296000396000818161076401528181610e7b01528181610eef01528181610f5001528181611a6901528181611b1401528181611bbd01528181611bfc01528181611d2d015261349c01526000818161060901528181610d3d015281816111e0015281816112e001528181611406015281816114d5015281816115a401528181611e600152818161247d01528181612b0b01528181612d5e0152818161331401526133a8015260008181610c4001528181610c800152818161104001528181611080015261110f0152615a696000f3fe6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614d34565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614da1565b3480156102b957600080fd5b506102cd6102c8366004614e96565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614f0e565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614f27565b610af0565b34801561033357600080fd5b506102cd610342366004614f53565b610c05565b34801561035357600080fd5b50610369600080516020615a1483398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614f94565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614fe5565b3480156103ca57600080fd5b506102cd6103d9366004614f94565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614f53565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614f27565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614ff8565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004615048565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd61051636600461508a565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614f0e565b611731565b34801561056657600080fd5b506103696105753660046151aa565b611791565b34801561058657600080fd5b506102cd610595366004615233565b611dc3565b3480156105a657600080fd5b506102cd6105b536600461508a565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614f94565b612464565b3480156105e657600080fd5b506103696105f5366004614f94565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614f0e565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615250565b612ad0565b34801561068757600080fd5b50610276610696366004614f0e565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db36600461527d565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615301565b612c72565b34801561072157600080fd5b506102cd61073036600461532f565b612c7d565b34801561074157600080fd5b506102a0610750366004614f0e565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a336600461539b565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614f94565b612d45565b3480156107d457600080fd5b506103696107e3366004614f27565b612deb565b3480156107f457600080fd5b506103696000805160206159cd83398151915281565b34801561081657600080fd5b506102cd6108253660046153c9565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb8054610865906153f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610891906153f8565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b81526004016109819061542c565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906154c5565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614fb1565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615511565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615511565b610fc79190615540565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615511565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906154c5565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206159ad83398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906155a1565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614fb1565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614fb1565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615661565b80611578575060038460038111156114c3576114c3614fb1565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615a14833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615661565b806116475750600284600381111561159257611592614fb1565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615661565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614fb1565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff1690889061567e565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614fb1565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906156a4565b905060016118e9826138f5565b60038111156118fa576118fa614fb1565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166156c1565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a9060040161578c565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906156a4565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906156a4565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906156a4565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906156a4565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac919061578c565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a0840161579b565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836157b6565b60006001613a35565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614fb1565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906156a4565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614fb1565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615661565b80612149575060038360038111156120d2576120d2614fb1565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615661565b806121da5750600283600381111561216357612163614fb1565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615661565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614fb1565b0217905550600383600381111561226d5761226d614fb1565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906156a4565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906156a4565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef84600160405161245692919061567e565b60405180910390a250505050565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614fb1565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614fb1565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615511565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614fb1565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615511565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614fb1565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615511565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906156a4565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906156a4565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff169060009061567e565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846157b6565b826000613a35565b600080516020615a148339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6157d3565b90506101c002016101a0016020810190612bd7919061579b565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6157d3565b90506101c00201803603810190611e3e91906157b6565b80612c5b816157e9565b915050612ba2565b606060fc8054610865906153f8565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b81526004016109819061542c565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615802565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614fb1565b1480612e3357506002816003811115612e3157612e31614fb1565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615511565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846157b6565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615831565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615831565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615831565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615831565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b81526004016109819061587c565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b81526004016109819061587c565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906156a4565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906156a4565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615511565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206159ad83398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614fb1565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614fb1565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614fb1565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b600081604051602001613996919061578c565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906158c1565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614fb1565b1480613b4657506002816003811115613b4457613b44614fb1565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906156a4565b9050613c7b816138f5565b92506001836003811115613c9157613c91614fb1565b1480613cae57506002836003811115613cac57613cac614fb1565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615913565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a9060040161578c565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061484d565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906158c1565b60606101308054610865906153f8565b606060006140518361490d565b600101905060008167ffffffffffffffff81111561407157614071614db4565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615831565b60fb6141da83826155a1565b5060fc610c0082826155a1565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615831565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206159ad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149e5565b6000825111806142d95750805b15610c0057610ac38383614a25565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a4a9092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615661565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615940565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615973565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906158c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b61473681633ece0a8960e01b614a59565b61473f57505050565b60006001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303816000875af11580156147ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147cf9190615973565b90506001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f6c696379506f6f6c3a20496e76616c69642072657475726e2076616c756560448201527210333937b69024a837b634b1bca437b63232b960691b6064820152608401610981565b600061485882611731565b90506001600160a01b0381163b61486d575050565b61487e81633ece0a8960e01b614a59565b614886575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af1925050508015614905575060408051601f3d908101601f1916820190925261490291810190615973565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061494c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614978576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061499657662386f26fc10000830492506010015b6305f5e10083106149ae576305f5e100830492506008015b61271083106149c257612710830492506004015b606483106149d4576064830492506002015b600a83106108505760010192915050565b6149ee81614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f83836040518060600160405280602781526020016159ed60279139614a75565b6060611dbb8484600085614aed565b6000614a6483614bc8565b8015612d0f5750612d0f8383614bfb565b6060600080856001600160a01b031685604051614a929190615990565b600060405180830381855af49150503d8060008114614acd576040519150601f19603f3d011682016040523d82523d6000602084013e614ad2565b606091505b5091509150614ae386838387614c80565b9695505050505050565b606082471015614b4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b6a9190615990565b60006040518083038185875af1925050503d8060008114614ba7576040519150601f19603f3d011682016040523d82523d6000602084013e614bac565b606091505b5091509150614bbd87838387614c80565b979650505050505050565b6000614bdb826301ffc9a760e01b614bfb565b80156108505750614bf4826001600160e01b0319614bfb565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614c6d575060208210155b8015614bbd575015159695505050505050565b60608315614cef578251600003614ce8576001600160a01b0385163b614ce85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614d045781518083602001fd5b8060405162461bcd60e51b81526004016109819190614da1565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614d4657600080fd5b8135612d0f81614d1e565b60005b83811015614d6c578181015183820152602001614d54565b50506000910152565b60008151808452614d8d816020860160208601614d51565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614d75565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614dee57614dee614db4565b60405290565b600082601f830112614e0557600080fd5b813567ffffffffffffffff80821115614e2057614e20614db4565b604051601f8301601f19908116603f01168101908282118183101715614e4857614e48614db4565b81604052838152866020858801011115614e6157600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614eab57600080fd5b833567ffffffffffffffff80821115614ec357600080fd5b614ecf87838801614df4565b94506020860135915080821115614ee557600080fd5b50614ef286828701614df4565b9250506040840135614f0381614e81565b809150509250925092565b600060208284031215614f2057600080fd5b5035919050565b60008060408385031215614f3a57600080fd5b8235614f4581614e81565b946020939093013593505050565b600080600060608486031215614f6857600080fd5b8335614f7381614e81565b92506020840135614f8381614e81565b929592945050506040919091013590565b600060208284031215614fa657600080fd5b8135612d0f81614e81565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614ff283614fc7565b91905290565b6000806040838503121561500b57600080fd5b823561501681614e81565b9150602083013567ffffffffffffffff81111561503257600080fd5b61503e85828601614df4565b9150509250929050565b60006020828403121561505a57600080fd5b813567ffffffffffffffff81111561507157600080fd5b611dbb84828501614df4565b60048110610d1257600080fd5b6000806040838503121561509d57600080fd5b82356150a881614e81565b915060208301356150b88161507d565b809150509250929050565b80356139fd81614e81565b803564ffffffffff811681146139fd57600080fd5b60006101c082840312156150f657600080fd5b6150fe614dca565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525061016061517c8184016150c3565b9082015261018061518e8382016150ce565b908201526101a06151a08382016150ce565b9082015292915050565b60008060008061022085870312156151c157600080fd5b6151cb86866150e3565b93506101c08501356151dc81614e81565b92506101e08501356151ed81614e81565b91506102008501356bffffffffffffffffffffffff8116811461520f57600080fd5b939692955090935050565b60006101c0828403121561522d57600080fd5b50919050565b60006101c0828403121561524657600080fd5b612d0f838361521a565b6000806101e0838503121561526457600080fd5b61526e848461521a565b946101c0939093013593505050565b6000806020838503121561529057600080fd5b823567ffffffffffffffff808211156152a857600080fd5b818501915085601f8301126152bc57600080fd5b8135818111156152cb57600080fd5b8660206101c0830285010111156152e157600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561531457600080fd5b823561531f81614e81565b915060208301356150b8816152f3565b6000806000806080858703121561534557600080fd5b843561535081614e81565b9350602085013561536081614e81565b925060408501359150606085013567ffffffffffffffff81111561538357600080fd5b61538f87828801614df4565b91505092959194509250565b600080604083850312156153ae57600080fd5b82356153b981614e81565b915060208301356150b881614e81565b6000806101e083850312156153dd57600080fd5b6153e7848461521a565b91506101c08301356150b8816152f3565b600181811c9082168061540c57607f821691505b60208210810361522d57634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561552357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061552a565b601f821115610c0057600081815260208120601f850160051c8101602086101561557a5750805b601f850160051c820191505b8181101561559957828155600101615586565b505050505050565b815167ffffffffffffffff8111156155bb576155bb614db4565b6155cf816155c984546153f8565b84615553565b602080601f83116001811461560457600084156155ec5750858301515b600019600386901b1c1916600185901b178555615599565b600085815260208120601f198616915b8281101561563357888601518255948401946001909101908401615614565b50858210156156515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561567357600080fd5b8151612d0f816152f3565b6040810161568b84614fc7565b83825261569783614fc7565b8260208301529392505050565b6000602082840312156156b657600080fd5b8151612d0f81614e81565b808201808211156108505761085061552a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152506101608082015161575d828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846156d4565b6000602082840312156157ad57600080fd5b612d0f826150ce565b60006101c082840312156157c957600080fd5b612d0f83836150e3565b634e487b7160e01b600052603260045260246000fd5b6000600182016157fb576157fb61552a565b5060010190565b60008351615814818460208801614d51565b835190830190615828818360208801614d51565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161593160208301856156d4565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614ae390830184614d75565b60006020828403121561598557600080fd5b8151612d0f81614d1e565b600082516159a2818460208701614d51565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a264697066735822122064ff4760b261111df66ec957f8e35c01fe2e9b480713db48b0464e2393b685e864736f6c63430008100033",
|
|
1413
|
+
"deployedBytecode": "0x6080604052600436106102515760003560e01c80636769a76f116101395780638c916d46116100b6578063e5a6b10f1161007a578063e5a6b10f14610755578063e985e9c514610788578063f0f44260146107a8578063f3fef3a3146107c8578063f67b2bad146107e8578063ffa600e31461080a57600080fd5b80638c916d46146106c057806395d89b41146106e0578063a22cb465146106f5578063b88d4fde14610715578063c87b56dd1461073557600080fd5b806371907f17116100fd57806371907f17146105fa578063792da09e1461062d5780637a702b3c1461065b57806382afd23b1461067b5780638456cb59146106ab57600080fd5b80636769a76f1461055a5780636af6f1ef1461057a5780636b8734e71461059a5780636f86c897146105ba57806370a08231146105da57600080fd5b806342842e0e116101d257806355f804b31161019657806355f804b31461048f5780635b494dd5146104af5780635c975abb146104e35780635fcbf445146104fb57806361d027b31461051b5780636352211e1461053a57600080fd5b806342842e0e146103f357806347e7ef24146104135780634a47a3e0146104335780634f1ef2861461046757806352d1902d1461047a57600080fd5b806323b872dd1161021957806323b872dd1461032757806324ea54f41461034757806333d6157a146103775780633659cfe6146103be5780633f4ba83a146103de57600080fd5b806301ffc9a71461025657806306fdde031461028b578063077f224a146102ad578063081812fc146102cf578063095ea7b314610307575b600080fd5b34801561026257600080fd5b50610276610271366004614d34565b61082a565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102a0610856565b6040516102829190614da1565b3480156102b957600080fd5b506102cd6102c8366004614e96565b6108e8565b005b3480156102db57600080fd5b506102ef6102ea366004614f0e565b610ac9565b6040516001600160a01b039091168152602001610282565b34801561031357600080fd5b506102cd610322366004614f27565b610af0565b34801561033357600080fd5b506102cd610342366004614f53565b610c05565b34801561035357600080fd5b50610369600080516020615a1483398151915281565b604051908152602001610282565b34801561038357600080fd5b506103b1610392366004614f94565b6001600160a01b0316600090815261012e602052604090205460ff1690565b6040516102829190614fe5565b3480156103ca57600080fd5b506102cd6103d9366004614f94565b610c36565b3480156103ea57600080fd5b506102cd610d15565b3480156103ff57600080fd5b506102cd61040e366004614f53565b610dd6565b34801561041f57600080fd5b506102cd61042e366004614f27565b610df1565b34801561043f57600080fd5b506103697fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b6102cd610475366004614ff8565b611036565b34801561048657600080fd5b50610369611102565b34801561049b57600080fd5b506102cd6104aa366004615048565b6111b5565b3480156104bb57600080fd5b506103697f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156104ef57600080fd5b5060335460ff16610276565b34801561050757600080fd5b506102cd61051636600461508a565b6112b8565b34801561052757600080fd5b5061012d546001600160a01b03166102ef565b34801561054657600080fd5b506102ef610555366004614f0e565b611731565b34801561056657600080fd5b506103696105753660046151aa565b611791565b34801561058657600080fd5b506102cd610595366004615233565b611dc3565b3480156105a657600080fd5b506102cd6105b536600461508a565b611e47565b3480156105c657600080fd5b506102cd6105d5366004614f94565b612464565b3480156105e657600080fd5b506103696105f5366004614f94565b612a4a565b34801561060657600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561063957600080fd5b50610369610648366004614f0e565b600090815261012f602052604090205490565b34801561066757600080fd5b506102cd610676366004615250565b612ad0565b34801561068757600080fd5b50610276610696366004614f0e565b600090815261012f6020526040902054151590565b3480156106b757600080fd5b506102cd612af2565b3480156106cc57600080fd5b506102cd6106db36600461527d565b612b97565b3480156106ec57600080fd5b506102a0612c63565b34801561070157600080fd5b506102cd610710366004615301565b612c72565b34801561072157600080fd5b506102cd61073036600461532f565b612c7d565b34801561074157600080fd5b506102a0610750366004614f0e565b612caf565b34801561076157600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102ef565b34801561079457600080fd5b506102766107a336600461539b565b612d16565b3480156107b457600080fd5b506102cd6107c3366004614f94565b612d45565b3480156107d457600080fd5b506103696107e3366004614f27565b612deb565b3480156107f457600080fd5b506103696000805160206159cd83398151915281565b34801561081657600080fd5b506102cd6108253660046153c9565b612f14565b600061083582612f47565b8061085057506001600160e01b0319821663191a7d6b60e11b145b92915050565b606060fb8054610865906153f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610891906153f8565b80156108de5780601f106108b3576101008083540402835291602001916108de565b820191906000526020600020905b8154815290600101906020018083116108c157829003601f168201915b5050505050905090565b600054610100900460ff16158080156109085750600054600160ff909116105b806109225750303b158015610922575060005460ff166001145b61098a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ad576000805461ff0019166101001790555b60008451116109fe5760405162461bcd60e51b815260206004820181905260248201527f506f6c696379506f6f6c3a206e616d652063616e6e6f7420626520656d7074796044820152606401610981565b6000835111610a5a5760405162461bcd60e51b815260206004820152602260248201527f506f6c696379506f6f6c3a2073796d626f6c2063616e6e6f7420626520656d70604482015261747960f01b6064820152608401610981565b610a62612f97565b610a6c8484612fc0565b610a74612ff1565b610a7d82613020565b8015610ac3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6000610ad482613050565b50600090815260ff60205260409020546001600160a01b031690565b6000610afb82611731565b9050806001600160a01b0316836001600160a01b031603610b685760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610981565b336001600160a01b0382161480610b845750610b848133612d16565b610bf65760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610981565b610c0083836130af565b505050565b610c0f338261311d565b610c2b5760405162461bcd60e51b81526004016109819061542c565b610c0083838361317b565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610c7e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cc76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b031614610ced5760405162461bcd60e51b8152600401610981906154c5565b610cf6816132ec565b60408051600080825260208201909252610d1291839190613588565b50565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b158015610db257600080fd5b505afa158015610dc6573d6000803e3d6000fd5b50505050610dd26136f3565b5050565b610c0083838360405180602001604052806000815250612c7d565b610df9613745565b6001610e048361378b565b6003811115610e1557610e15614fb1565b14610e595760405162461bcd60e51b815260206004820152601460248201527365546f6b656e206973206e6f742061637469766560601b6044820152606401610981565b6040516370a0823160e01b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190615511565b9050610f1f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316338585613818565b6001600160a01b0383166347e7ef24336040516370a0823160e01b81526001600160a01b03878116600483015285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd9190615511565b610fc79190615540565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611012573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac39190615511565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361107e5760405162461bcd60e51b815260040161098190615479565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110c76000805160206159ad833981519152546001600160a01b031690565b6001600160a01b0316146110ed5760405162461bcd60e51b8152600401610981906154c5565b6110f6826132ec565b610dd282826001613588565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111a25760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610981565b506000805160206159ad83398151915290565b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b15801561124c57600080fd5b505afa158015611260573d6000803e3d6000fd5b5050505081610130908161127491906155a1565b5060047fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f336040516001600160a01b03909116815260200160405180910390a25050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561135557600080fd5b505afa158015611369573d6000803e3d6000fd5b5050506001600160a01b038516600090815261012e602052604081209150815460ff16600381111561139d5761139d614fb1565b036113e05760405162461bcd60e51b815260206004820152601360248201527210dbdb5c1bdb995b9d081b9bdd08199bdd5b99606a1b6044820152606401610981565b60018460038111156113f4576113f4614fb1565b1480156114a957506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a99190615661565b80611578575060038460038111156114c3576114c3614fb1565b14801561157857506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d14854600080516020615a14833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190615661565b806116475750600284600381111561159257611592614fb1565b14801561164757506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166391d148546000805160206159cd833981519152336040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116479190615661565b6116b95760405162461bcd60e51b815260206004820152603e60248201527f4f6e6c7920475541524449414e2063616e2073757370656e64202f204f6e6c7960448201527f204c4556454c312063616e2061637469766174652f64657072656361746500006064820152608401610981565b80548490829060ff191660018360038111156116d7576116d7614fb1565b021790555080546040516001600160a01b038716917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef9161172291610100900460ff1690889061567e565b60405180910390a25050505050565b600081815260fd60205260408120546001600160a01b0316806108505760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600061179b613745565b6101608501516001600160a01b03811633146118055760405162461bcd60e51b815260206004820152602360248201527f4f6e6c792074686520524d2063616e20637265617465206e657720706f6c696360448201526269657360e81b6064820152608401610981565b600161181082613872565b600381111561182157611821614fb1565b146118785760405162461bcd60e51b815260206004820152602160248201527f524d206d6f64756c65206e6f7420666f756e64206f72206e6f742061637469766044820152606560f81b6064820152608401610981565b6000816001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118dc91906156a4565b905060016118e9826138f5565b60038111156118fa576118fa614fb1565b146119575760405162461bcd60e51b815260206004820152602760248201527f5072656d69756d734163636f756e74206e6f7420666f756e64206f72206e6f746044820152662061637469766560c81b6064820152608401610981565b6119826bffffffffffffffffffffffff85166bffffffffffffffffffffffff19606085901b166156c1565b808852600090815261012f6020526040902054156119da5760405162461bcd60e51b8152602060048201526015602482015274506f6c69637920616c72656164792065786973747360581b6044820152606401610981565b6119e387613983565b8751600090815261012f602052604090819020919091555163e3638ea360e01b81526001600160a01b0382169063e3638ea390611a24908a9060040161578c565b600060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b50505060c0880151611a9391506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169088908490613818565b61014087015115611b3c57611b3c86826001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0491906156a4565b6101408a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012087015115611be557611be586826001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad91906156a4565b6101208a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b61012d5460e0880151611c2a916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116928a929190911690613818565b6000876101000151118015611cb25750816001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9c91906156a4565b6001600160a01b0316866001600160a01b031614155b15611d5557611d5586836001600160a01b031663521eb2736040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1d91906156a4565b6101008a01516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190613818565b611d7385886000015160405180602001604052806000815250613a02565b816001600160a01b03167f38f420e3792044ba61536a1f83956eefc878b3fb09a7d4a28790f05b6a3eaf3b88604051611dac919061578c565b60405180910390a25050845190505b949350505050565b611dcb613745565b42611dde6101c083016101a0840161579b565b64ffffffffff161115611e2c5760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b610d12611e3e368390038301836157b6565b60006001613a35565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015611ecc57600080fd5b505afa158015611ee0573d6000803e3d6000fd5b5050506001600160a01b038416600090815261012e602052604081209150815460ff166003811115611f1457611f14614fb1565b14611f615760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e7420616c726561647920696e2074686520706f6f6c0000006044820152606401610981565b306001600160a01b0316846001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd91906156a4565b6001600160a01b03161461202d5760405162461bcd60e51b815260206004820152602160248201527f436f6d706f6e656e74206e6f74206c696e6b656420746f207468697320706f6f6044820152601b60fa1b6064820152608401610981565b600183600381111561204157612041614fb1565b1480156120b857506040516301ffc9a760e01b8152639077062160e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b89190615661565b80612149575060038360038111156120d2576120d2614fb1565b14801561214957506040516301ffc9a760e01b8152632dd9c4bb60e21b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190615661565b806121da5750600283600381111561216357612163614fb1565b1480156121da57506040516301ffc9a760e01b815263da40804f60e01b60048201526001600160a01b038516906301ffc9a790602401602060405180830381865afa1580156121b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121da9190615661565b6122265760405162461bcd60e51b815260206004820152601e60248201527f506f6c696379506f6f6c3a204e6f7420746865207269676874206b696e6400006044820152606401610981565b8054600160ff198216811783558491839161ffff199091161761010083600381111561225457612254614fb1565b0217905550600383600381111561226d5761226d614fb1565b0361241a5760008490506000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122db91906156a4565b90506001600160a01b03811615612348576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b15801561232f57600080fd5b505af1158015612343573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123aa91906156a4565b90506001600160a01b03811615612417576040516338ea38a760e21b81526001600160a01b03838116600483015282169063e3a8e29c90602401600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050505b50505b836001600160a01b03167ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef84600160405161245692919061567e565b60405180910390a250505050565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b1580156124e957600080fd5b505afa1580156124fd573d6000803e3d6000fd5b505050506001600160a01b038216600090815261012e602052604090206002815460ff16600381111561253257612532614fb1565b1461257f5760405162461bcd60e51b815260206004820152601860248201527f436f6d706f6e656e74206e6f74206465707265636174656400000000000000006044820152606401610981565b60018154610100900460ff16600381111561259c5761259c614fb1565b0361266457826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126039190615511565b1561265f5760405162461bcd60e51b815260206004820152602660248201527f45546f6b656e20686173206c69717569646974792c2063616e27742062652072604482015265195b5bdd995960d21b6064820152608401610981565b6129d6565b60028154610100900460ff16600381111561268157612681614fb1565b0361274857826001600160a01b0316637ff8bf256040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190615511565b1561265f5760405162461bcd60e51b815260206004820152602a60248201527f43616e27742072656d6f76652061206d6f64756c6520776974682061637469766044820152696520706f6c696369657360b01b6064820152608401610981565b60038154610100900460ff16600381111561276557612765614fb1565b036129d6576000839050806001600160a01b03166326ccbd226040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d19190615511565b156128335760405162461bcd60e51b815260206004820152602c60248201527f43616e27742072656d6f76652061205072656d69756d734163636f756e74207760448201526b697468207072656d69756d7360a01b6064820152608401610981565b6000816001600160a01b031663536ebbfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612873573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289791906156a4565b90506001600160a01b03811615612904576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050505b816001600160a01b0316637b83037b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612942573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296691906156a4565b90506001600160a01b038116156129d3576040516376c7fc5560e01b81526001600160a01b0383811660048301528216906376c7fc5590602401600060405180830381600087803b1580156129ba57600080fd5b505af11580156129ce573d6000803e3d6000fd5b505050505b50505b80546040516001600160a01b038516917ffe4c6998a06520b63340a48710b374432cb395da90e4e5360e1ec7aeefebecef91612a1d91610100900460ff169060009061567e565b60405180910390a250506001600160a01b0316600090815261012e60205260409020805461ffff19169055565b60006001600160a01b038216612ab45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610981565b506001600160a01b0316600090815260fe602052604090205490565b612ad8613745565b610dd2612aea368490038401846157b6565b826000613a35565b600080516020615a148339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612b7757600080fd5b505afa158015612b8b573d6000803e3d6000fd5b50505050610d12613ef5565b612b9f613745565b60005b81811015610c005742838383818110612bbd57612bbd6157d3565b90506101c002016101a0016020810190612bd7919061579b565b64ffffffffff161115612c255760405162461bcd60e51b8152602060048201526016602482015275141bdb1a58de481b9bdd08195e1c1a5c9959081e595d60521b6044820152606401610981565b612c51838383818110612c3a57612c3a6157d3565b90506101c00201803603810190611e3e91906157b6565b80612c5b816157e9565b915050612ba2565b606060fc8054610865906153f8565b610dd2338383613f32565b612c87338361311d565b612ca35760405162461bcd60e51b81526004016109819061542c565b610ac384848484614001565b6060612cba82613050565b6000612cc4614034565b90506000815111612ce45760405180602001604052806000815250612d0f565b80612cee84614044565b604051602001612cff929190615802565b6040516020818303038152906040525b9392505050565b6001600160a01b0391821660009081526101006020908152604080832093909416825291909152205460ff1690565b6000805160206159cd8339815191526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166312d9a6ad82336040516001600160e01b031960e085901b16815260048101929092526001600160a01b0316602482015260440160006040518083038186803b158015612dca57600080fd5b505afa158015612dde573d6000803e3d6000fd5b50505050610dd2826140d7565b6000612df5613745565b6000612e008461378b565b90506001816003811115612e1657612e16614fb1565b1480612e3357506002816003811115612e3157612e31614fb1565b145b612e915760405162461bcd60e51b815260206004820152602960248201527f65546f6b656e206e6f7420666f756e64206f7220776974686472617773206e6f6044820152681d08185b1b1bddd95960ba1b6064820152608401610981565b60003360405163f3fef3a360e01b81526001600160a01b038083166004830152602482018790529192509086169063f3fef3a3906044016020604051808303816000875af1158015612ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f0b9190615511565b95945050505050565b612f1c613745565b610dd2612f2e368490038401846157b6565b82612f3a576000612f40565b83602001355b6000613a35565b60006001600160e01b031982166380ac58cd60e01b1480612f7857506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b0319831614610850565b600054610100900460ff16612fbe5760405162461bcd60e51b815260040161098190615831565b565b600054610100900460ff16612fe75760405162461bcd60e51b815260040161098190615831565b610dd282826141a7565b600054610100900460ff166130185760405162461bcd60e51b815260040161098190615831565b612fbe6141e7565b600054610100900460ff166130475760405162461bcd60e51b815260040161098190615831565b610d12816140d7565b600081815260fd60205260409020546001600160a01b0316610d125760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610981565b600081815260ff6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130e482611731565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061312983611731565b9050806001600160a01b0316846001600160a01b0316148061315057506131508185612d16565b80611dbb5750836001600160a01b031661316984610ac9565b6001600160a01b031614949350505050565b826001600160a01b031661318e82611731565b6001600160a01b0316146131b45760405162461bcd60e51b81526004016109819061587c565b6001600160a01b0382166132165760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610981565b613223838383600161421a565b826001600160a01b031661323682611731565b6001600160a01b03161461325c5760405162461bcd60e51b81526004016109819061587c565b600081815260ff6020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260fe855283862080546000190190559087168086528386208054600101905586865260fd90945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080516020615a148339815191526000805160206159cd8339815191526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663c5b8f5cf8383336040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b0316604482015260640160006040518083038186803b15801561338957600080fd5b505afa15801561339d573d6000803e3d6000fd5b5050505060008390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561340e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343291906156a4565b6001600160a01b03161461349a5760405162461bcd60e51b815260206004820152602960248201527f43616e27742075706772616465206368616e67696e6720746865206163636573604482015268399036b0b730b3b2b960b91b6064820152608401610981565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061352691906156a4565b6001600160a01b031614610ac35760405162461bcd60e51b815260206004820152602360248201527f43616e27742075706772616465206368616e67696e67207468652063757272656044820152626e637960e81b6064820152608401610981565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156135bb57610c0083614227565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613615575060408051601f3d908101601f1916820190925261361291810190615511565b60015b6136785760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610981565b6000805160206159ad83398151915281146136e75760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610981565b50610c008383836142c3565b6136fb6142e8565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60335460ff1615612fbe5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060018154610100900460ff1660038111156137c1576137c1614fb1565b1461380e5760405162461bcd60e51b815260206004820152601a60248201527f436f6d706f6e656e74206973206e6f7420616e2065546f6b656e0000000000006044820152606401610981565b5460ff1692915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ac3908590614331565b6001600160a01b038116600090815261012e6020526040812060028154610100900460ff1660038111156138a8576138a8614fb1565b1461380e5760405162461bcd60e51b815260206004820152601d60248201527f436f6d706f6e656e74206973206e6f742061205269736b4d6f64756c650000006044820152606401610981565b6001600160a01b038116600090815261012e6020526040812060038154610100900460ff16600381111561392b5761392b614fb1565b1461380e5760405162461bcd60e51b815260206004820152602260248201527f436f6d706f6e656e74206973206e6f742061205072656d69756d734163636f756044820152611b9d60f21b6064820152608401610981565b600081604051602001613996919061578c565b60408051601f1981840301815291905280516020909101209050806139fd5760405162461bcd60e51b815260206004820152601860248201527f506f6c6963793a20686173682063616e6e6f74206265203000000000000000006044820152606401610981565b919050565b613a0c8383614406565b613a19600084848461459f565b610c005760405162461bcd60e51b8152600401610981906158c1565b613a3e8361469d565b6101608301518180613a5857506001600160a01b03811633145b613aa45760405162461bcd60e51b815260206004820181905260248201527f4f6e6c792074686520524d2063616e207265736f6c766520706f6c69636965736044820152606401610981565b821580613abc575042846101a0015164ffffffffff16115b613b085760405162461bcd60e51b815260206004820152601860248201527f43616e277420706179206578706972656420706f6c69637900000000000000006044820152606401610981565b6000613b1382613872565b90506001816003811115613b2957613b29614fb1565b1480613b4657506002816003811115613b4457613b44614fb1565b145b613bb85760405162461bcd60e51b815260206004820152603a60248201527f4d6f64756c65206d75737420626520616374697665206f72206465707265636160448201527f74656420746f2070726f63657373207265736f6c7574696f6e730000000000006064820152608401610981565b8460200151841115613c055760405162461bcd60e51b81526020600482015260166024820152751c185e5bdd5d080f881c1bdb1a58de4b9c185e5bdd5d60521b6044820152606401610981565b600080851190506000836001600160a01b03166373a952e86040518163ffffffff1660e01b8152600401602060405180830381865afa158015613c4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c7091906156a4565b9050613c7b816138f5565b92506001836003811115613c9157613c91614fb1565b1480613cae57506002836003811115613cac57613cac614fb1565b145b613d2c5760405162461bcd60e51b815260206004820152604360248201527f5072656d69756d734163636f756e74206d75737420626520616374697665206f60448201527f72206465707265636174656420746f2070726f63657373207265736f6c7574696064820152626f6e7360e81b608482015260a401610981565b8651600090815261012f60205260408120558115613dbe576000613d538860000151611731565b604051639d8c5ee760e01b81529091506001600160a01b03831690639d8c5ee790613d869084908c908c90600401615913565b600060405180830381600087803b158015613da057600080fd5b505af1158015613db4573d6000803e3d6000fd5b5050505050613e1d565b60405163c7a9c70d60e01b81526001600160a01b0382169063c7a9c70d90613dea908a9060040161578c565b600060405180830381600087803b158015613e0457600080fd5b505af1158015613e18573d6000803e3d6000fd5b505050505b6020870151604051636a448ef160e01b815260048101919091526001600160a01b03851690636a448ef190602401600060405180830381600087803b158015613e6557600080fd5b505af1158015613e79573d6000803e3d6000fd5b5050505086600001518761016001516001600160a01b03167f54f4a270ea08f88dc23b2520d6b063fecb24d956c4496f447926d736338f545e88604051613ec291815260200190565b60405180910390a38515613ee1578651613edc9087614704565b613eec565b8651613eec9061484d565b50505050505050565b613efd613745565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137283390565b816001600160a01b0316836001600160a01b031603613f935760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610981565b6001600160a01b0383811660008181526101006020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61400c84848461317b565b6140188484848461459f565b610ac35760405162461bcd60e51b8152600401610981906158c1565b60606101308054610865906153f8565b606060006140518361490d565b600101905060008167ffffffffffffffff81111561407157614071614db4565b6040519080825280601f01601f19166020018201604052801561409b576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140a557509392505050565b6001600160a01b0381166141455760405162461bcd60e51b815260206004820152602f60248201527f506f6c696379506f6f6c3a2074726561737572792063616e6e6f74206265207460448201526e6865207a65726f206164647265737360881b6064820152608401610981565b61012d80546001600160a01b0319166001600160a01b038316179055600161012d546040516001600160a01b0390911681527fb6bdbd44472629fc24a00b6f4ee3348b72c9eff333d0e9c16d78c49da1323c8f9060200160405180910390a250565b600054610100900460ff166141ce5760405162461bcd60e51b815260040161098190615831565b60fb6141da83826155a1565b5060fc610c0082826155a1565b600054610100900460ff1661420e5760405162461bcd60e51b815260040161098190615831565b6033805460ff19169055565b614222613745565b610ac3565b6001600160a01b0381163b6142945760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610981565b6000805160206159ad83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6142cc836149e5565b6000825111806142d95750805b15610c0057610ac38383614a25565b60335460ff16612fbe5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610981565b6000614386826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614a4a9092919063ffffffff16565b90508051600014806143a75750808060200190518101906143a79190615661565b610c005760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610981565b6001600160a01b03821661445c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610981565b600081815260fd60205260409020546001600160a01b0316156144c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6144cf60008383600161421a565b600081815260fd60205260409020546001600160a01b0316156145345760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610981565b6001600160a01b038216600081815260fe602090815260408083208054600101905584835260fd90915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561469557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906145e3903390899088908890600401615940565b6020604051808303816000875af192505050801561461e575060408051601f3d908101601f1916820190925261461b91810190615973565b60015b61467b573d80801561464c576040519150601f19603f3d011682016040523d82523d6000602084013e614651565b606091505b5080516000036146735760405162461bcd60e51b8152600401610981906158c1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611dbb565b506001611dbb565b8051158015906146c557508051600090815261012f60205260409020546146c382613983565b145b610d125760405162461bcd60e51b815260206004820152601060248201526f141bdb1a58de481b9bdd08199bdd5b9960821b6044820152606401610981565b600061470f83611731565b90506001600160a01b0381163b61472557505050565b61473681633ece0a8960e01b614a59565b61473f57505050565b60006001600160a01b03821663d6281d3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101879052606481018690526084016020604051808303816000875af11580156147ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147cf9190615973565b90506001600160e01b03198116636b140e9f60e11b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f6c696379506f6f6c3a20496e76616c69642072657475726e2076616c756560448201527210333937b69024a837b634b1bca437b63232b960691b6064820152608401610981565b600061485882611731565b90506001600160a01b0381163b61486d575050565b61487e81633ece0a8960e01b614a59565b614886575050565b6001600160a01b03811663e8e617b7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018590526064016020604051808303816000875af1925050508015614905575060408051601f3d908101601f1916820190925261490291810190615973565b60015b610c00575050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061494c5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614978576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061499657662386f26fc10000830492506010015b6305f5e10083106149ae576305f5e100830492506008015b61271083106149c257612710830492506004015b606483106149d4576064830492506002015b600a83106108505760010192915050565b6149ee81614227565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d0f83836040518060600160405280602781526020016159ed60279139614a75565b6060611dbb8484600085614aed565b6000614a6483614bc8565b8015612d0f5750612d0f8383614bfb565b6060600080856001600160a01b031685604051614a929190615990565b600060405180830381855af49150503d8060008114614acd576040519150601f19603f3d011682016040523d82523d6000602084013e614ad2565b606091505b5091509150614ae386838387614c80565b9695505050505050565b606082471015614b4e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610981565b600080866001600160a01b03168587604051614b6a9190615990565b60006040518083038185875af1925050503d8060008114614ba7576040519150601f19603f3d011682016040523d82523d6000602084013e614bac565b606091505b5091509150614bbd87838387614c80565b979650505050505050565b6000614bdb826301ffc9a760e01b614bfb565b80156108505750614bf4826001600160e01b0319614bfb565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015614c6d575060208210155b8015614bbd575015159695505050505050565b60608315614cef578251600003614ce8576001600160a01b0385163b614ce85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610981565b5081611dbb565b611dbb8383815115614d045781518083602001fd5b8060405162461bcd60e51b81526004016109819190614da1565b6001600160e01b031981168114610d1257600080fd5b600060208284031215614d4657600080fd5b8135612d0f81614d1e565b60005b83811015614d6c578181015183820152602001614d54565b50506000910152565b60008151808452614d8d816020860160208601614d51565b601f01601f19169290920160200192915050565b602081526000612d0f6020830184614d75565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715614dee57614dee614db4565b60405290565b600082601f830112614e0557600080fd5b813567ffffffffffffffff80821115614e2057614e20614db4565b604051601f8301601f19908116603f01168101908282118183101715614e4857614e48614db4565b81604052838152866020858801011115614e6157600080fd5b836020870160208301376000602085830101528094505050505092915050565b6001600160a01b0381168114610d1257600080fd5b600080600060608486031215614eab57600080fd5b833567ffffffffffffffff80821115614ec357600080fd5b614ecf87838801614df4565b94506020860135915080821115614ee557600080fd5b50614ef286828701614df4565b9250506040840135614f0381614e81565b809150509250925092565b600060208284031215614f2057600080fd5b5035919050565b60008060408385031215614f3a57600080fd5b8235614f4581614e81565b946020939093013593505050565b600080600060608486031215614f6857600080fd5b8335614f7381614e81565b92506020840135614f8381614e81565b929592945050506040919091013590565b600060208284031215614fa657600080fd5b8135612d0f81614e81565b634e487b7160e01b600052602160045260246000fd5b60048110610d1257634e487b7160e01b600052602160045260246000fd5b60208101614ff283614fc7565b91905290565b6000806040838503121561500b57600080fd5b823561501681614e81565b9150602083013567ffffffffffffffff81111561503257600080fd5b61503e85828601614df4565b9150509250929050565b60006020828403121561505a57600080fd5b813567ffffffffffffffff81111561507157600080fd5b611dbb84828501614df4565b60048110610d1257600080fd5b6000806040838503121561509d57600080fd5b82356150a881614e81565b915060208301356150b88161507d565b809150509250929050565b80356139fd81614e81565b803564ffffffffff811681146139fd57600080fd5b60006101c082840312156150f657600080fd5b6150fe614dca565b9050813581526020820135602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013560c082015260e082013560e082015261010080830135818301525061012080830135818301525061014080830135818301525061016061517c8184016150c3565b9082015261018061518e8382016150ce565b908201526101a06151a08382016150ce565b9082015292915050565b60008060008061022085870312156151c157600080fd5b6151cb86866150e3565b93506101c08501356151dc81614e81565b92506101e08501356151ed81614e81565b91506102008501356bffffffffffffffffffffffff8116811461520f57600080fd5b939692955090935050565b60006101c0828403121561522d57600080fd5b50919050565b60006101c0828403121561524657600080fd5b612d0f838361521a565b6000806101e0838503121561526457600080fd5b61526e848461521a565b946101c0939093013593505050565b6000806020838503121561529057600080fd5b823567ffffffffffffffff808211156152a857600080fd5b818501915085601f8301126152bc57600080fd5b8135818111156152cb57600080fd5b8660206101c0830285010111156152e157600080fd5b60209290920196919550909350505050565b8015158114610d1257600080fd5b6000806040838503121561531457600080fd5b823561531f81614e81565b915060208301356150b8816152f3565b6000806000806080858703121561534557600080fd5b843561535081614e81565b9350602085013561536081614e81565b925060408501359150606085013567ffffffffffffffff81111561538357600080fd5b61538f87828801614df4565b91505092959194509250565b600080604083850312156153ae57600080fd5b82356153b981614e81565b915060208301356150b881614e81565b6000806101e083850312156153dd57600080fd5b6153e7848461521a565b91506101c08301356150b8816152f3565b600181811c9082168061540c57607f821691505b60208210810361522d57634e487b7160e01b600052602260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561552357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108505761085061552a565b601f821115610c0057600081815260208120601f850160051c8101602086101561557a5750805b601f850160051c820191505b8181101561559957828155600101615586565b505050505050565b815167ffffffffffffffff8111156155bb576155bb614db4565b6155cf816155c984546153f8565b84615553565b602080601f83116001811461560457600084156155ec5750858301515b600019600386901b1c1916600185901b178555615599565b600085815260208120601f198616915b8281101561563357888601518255948401946001909101908401615614565b50858210156156515787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561567357600080fd5b8151612d0f816152f3565b6040810161568b84614fc7565b83825261569783614fc7565b8260208301529392505050565b6000602082840312156156b657600080fd5b8151612d0f81614e81565b808201808211156108505761085061552a565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152506101208082015181840152506101408082015181840152506101608082015161575d828501826001600160a01b03169052565b50506101808181015164ffffffffff81168483015250506101a08181015164ffffffffff811684830152610ac3565b6101c0810161085082846156d4565b6000602082840312156157ad57600080fd5b612d0f826150ce565b60006101c082840312156157c957600080fd5b612d0f83836150e3565b634e487b7160e01b600052603260045260246000fd5b6000600182016157fb576157fb61552a565b5060010190565b60008351615814818460208801614d51565b835190830190615828818360208801614d51565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0384168152610200810161593160208301856156d4565b826101e0830152949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614ae390830184614d75565b60006020828403121561598557600080fd5b8151612d0f81614d1e565b600082516159a2818460208701614d51565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb2416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a264697066735822122064ff4760b261111df66ec957f8e35c01fe2e9b480713db48b0464e2393b685e864736f6c63430008100033",
|
|
1414
1414
|
"linkReferences": {},
|
|
1415
1415
|
"deployedLinkReferences": {}
|
|
1416
1416
|
}
|
|
@@ -4,13 +4,7 @@
|
|
|
4
4
|
"sourceName": "contracts/mocks/PolicyHolderMock.sol",
|
|
5
5
|
"abi": [
|
|
6
6
|
{
|
|
7
|
-
"inputs": [
|
|
8
|
-
{
|
|
9
|
-
"internalType": "bool",
|
|
10
|
-
"name": "fail_",
|
|
11
|
-
"type": "bool"
|
|
12
|
-
}
|
|
13
|
-
],
|
|
7
|
+
"inputs": [],
|
|
14
8
|
"stateMutability": "nonpayable",
|
|
15
9
|
"type": "constructor"
|
|
16
10
|
},
|
|
@@ -19,9 +13,9 @@
|
|
|
19
13
|
"inputs": [
|
|
20
14
|
{
|
|
21
15
|
"indexed": false,
|
|
22
|
-
"internalType": "
|
|
16
|
+
"internalType": "enum PolicyHolderMock.NotificationKind",
|
|
23
17
|
"name": "kind",
|
|
24
|
-
"type": "
|
|
18
|
+
"type": "uint8"
|
|
25
19
|
},
|
|
26
20
|
{
|
|
27
21
|
"indexed": false,
|
|
@@ -45,6 +39,32 @@
|
|
|
45
39
|
"name": "NotificationReceived",
|
|
46
40
|
"type": "event"
|
|
47
41
|
},
|
|
42
|
+
{
|
|
43
|
+
"inputs": [],
|
|
44
|
+
"name": "badlyImplemented",
|
|
45
|
+
"outputs": [
|
|
46
|
+
{
|
|
47
|
+
"internalType": "bool",
|
|
48
|
+
"name": "",
|
|
49
|
+
"type": "bool"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"stateMutability": "view",
|
|
53
|
+
"type": "function"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"inputs": [],
|
|
57
|
+
"name": "emptyRevert",
|
|
58
|
+
"outputs": [
|
|
59
|
+
{
|
|
60
|
+
"internalType": "bool",
|
|
61
|
+
"name": "",
|
|
62
|
+
"type": "bool"
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"stateMutability": "view",
|
|
66
|
+
"type": "function"
|
|
67
|
+
},
|
|
48
68
|
{
|
|
49
69
|
"inputs": [],
|
|
50
70
|
"name": "fail",
|
|
@@ -58,6 +78,19 @@
|
|
|
58
78
|
"stateMutability": "view",
|
|
59
79
|
"type": "function"
|
|
60
80
|
},
|
|
81
|
+
{
|
|
82
|
+
"inputs": [],
|
|
83
|
+
"name": "noERC165",
|
|
84
|
+
"outputs": [
|
|
85
|
+
{
|
|
86
|
+
"internalType": "bool",
|
|
87
|
+
"name": "",
|
|
88
|
+
"type": "bool"
|
|
89
|
+
}
|
|
90
|
+
],
|
|
91
|
+
"stateMutability": "view",
|
|
92
|
+
"type": "function"
|
|
93
|
+
},
|
|
61
94
|
{
|
|
62
95
|
"inputs": [],
|
|
63
96
|
"name": "notImplemented",
|
|
@@ -194,6 +227,32 @@
|
|
|
194
227
|
"stateMutability": "view",
|
|
195
228
|
"type": "function"
|
|
196
229
|
},
|
|
230
|
+
{
|
|
231
|
+
"inputs": [
|
|
232
|
+
{
|
|
233
|
+
"internalType": "bool",
|
|
234
|
+
"name": "badlyImplemented_",
|
|
235
|
+
"type": "bool"
|
|
236
|
+
}
|
|
237
|
+
],
|
|
238
|
+
"name": "setBadlyImplemented",
|
|
239
|
+
"outputs": [],
|
|
240
|
+
"stateMutability": "nonpayable",
|
|
241
|
+
"type": "function"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"inputs": [
|
|
245
|
+
{
|
|
246
|
+
"internalType": "bool",
|
|
247
|
+
"name": "emptyRevert_",
|
|
248
|
+
"type": "bool"
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"name": "setEmptyRevert",
|
|
252
|
+
"outputs": [],
|
|
253
|
+
"stateMutability": "nonpayable",
|
|
254
|
+
"type": "function"
|
|
255
|
+
},
|
|
197
256
|
{
|
|
198
257
|
"inputs": [
|
|
199
258
|
{
|
|
@@ -207,6 +266,19 @@
|
|
|
207
266
|
"stateMutability": "nonpayable",
|
|
208
267
|
"type": "function"
|
|
209
268
|
},
|
|
269
|
+
{
|
|
270
|
+
"inputs": [
|
|
271
|
+
{
|
|
272
|
+
"internalType": "bool",
|
|
273
|
+
"name": "noERC165_",
|
|
274
|
+
"type": "bool"
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
"name": "setNoERC165",
|
|
278
|
+
"outputs": [],
|
|
279
|
+
"stateMutability": "nonpayable",
|
|
280
|
+
"type": "function"
|
|
281
|
+
},
|
|
210
282
|
{
|
|
211
283
|
"inputs": [
|
|
212
284
|
{
|
|
@@ -219,10 +291,29 @@
|
|
|
219
291
|
"outputs": [],
|
|
220
292
|
"stateMutability": "nonpayable",
|
|
221
293
|
"type": "function"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"inputs": [
|
|
297
|
+
{
|
|
298
|
+
"internalType": "bytes4",
|
|
299
|
+
"name": "interfaceId",
|
|
300
|
+
"type": "bytes4"
|
|
301
|
+
}
|
|
302
|
+
],
|
|
303
|
+
"name": "supportsInterface",
|
|
304
|
+
"outputs": [
|
|
305
|
+
{
|
|
306
|
+
"internalType": "bool",
|
|
307
|
+
"name": "",
|
|
308
|
+
"type": "bool"
|
|
309
|
+
}
|
|
310
|
+
],
|
|
311
|
+
"stateMutability": "view",
|
|
312
|
+
"type": "function"
|
|
222
313
|
}
|
|
223
314
|
],
|
|
224
|
-
"bytecode": "
|
|
225
|
-
"deployedBytecode": "
|
|
315
|
+
"bytecode": "0x608060405234801561001057600080fd5b506002805464ffffffffff19169055600019600155610821806100346000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80639d76940211610097578063c3af904e11610066578063c3af904e14610286578063d6281d3e1461029a578063e8e617b7146102ad578063ee89ef3a146102c057600080fd5b80639d76940214610219578063a9cc47181461023a578063aeec8f9d14610247578063bcce53991461027157600080fd5b806331ca2944116100d357806331ca2944146101b557806335287014146101dd57806363bd1d4a146101f05780636db656191461020757600080fd5b806301ffc9a714610105578063150b7a021461012d5780632bb2adb3146101595780632fb6436214610187575b600080fd5b610118610113366004610623565b6102c9565b60405190151581526020015b60405180910390f35b61014061013b366004610669565b610332565b6040516001600160e01b03199091168152602001610124565b610185610167366004610704565b6002805491151563010000000263ff00000019909216919091179055565b005b610185610195366004610704565b600280549115156401000000000264ff0000000019909216919091179055565b6101856101c3366004610704565b600280549115156101000261ff0019909216919091179055565b6002546101189062010000900460ff1681565b6101f960015481565b604051908152602001610124565b60025461011890610100900460ff1681565b610185610227366004610704565b6002805460ff1916911515919091179055565b6002546101189060ff1681565b610185610255366004610704565b60028054911515620100000262ff000019909216919091179055565b60025461011890640100000000900460ff1681565b600254610118906301000000900460ff1681565b6101406102a8366004610726565b610432565b6101406102bb366004610768565b61052b565b6101f960005481565b600254600090640100000000900460ff16156102e457600080fd5b60025462010000900460ff16156102fd57506000919050565b6001600160e01b03198216633ece0a8960e01b148061032c57506001600160e01b031982166301ffc9a760e01b145b92915050565b60025460009060ff16156103b857600254610100900460ff161561035557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556000196001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916103f79187908a908a906107a4565b60405180910390a16002546301000000900460ff161561041f5750630badf00d60e01b610429565b50630a85bd0160e11b5b95945050505050565b60025460009060ff16156104b357600254610100900460ff161561045557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084016103af565b600083905560018281556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916104f1918690899089906107a4565b60405180910390a16002546301000000900460ff16156105195750630badf00d60e01b610523565b50636b140e9f60e11b5b949350505050565b60025460009060ff16156105ab57600254610100900460ff161561054e57600080fd5b60405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b60648201526084016103af565b60008281556001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5906105ea906002908590889088906107a4565b60405180910390a16002546301000000900460ff16156106125750630badf00d60e01b61061c565b5063e8e617b760e01b5b9392505050565b60006020828403121561063557600080fd5b81356001600160e01b03198116811461061c57600080fd5b80356001600160a01b038116811461066457600080fd5b919050565b60008060008060006080868803121561068157600080fd5b61068a8661064d565b94506106986020870161064d565b935060408601359250606086013567ffffffffffffffff808211156106bc57600080fd5b818801915088601f8301126106d057600080fd5b8135818111156106df57600080fd5b8960208285010111156106f157600080fd5b9699959850939650602001949392505050565b60006020828403121561071657600080fd5b8135801515811461061c57600080fd5b6000806000806080858703121561073c57600080fd5b6107458561064d565b93506107536020860161064d565b93969395505050506040820135916060013590565b60008060006060848603121561077d57600080fd5b6107868461064d565b92506107946020850161064d565b9150604084013590509250925092565b60808101600386106107c657634e487b7160e01b600052602160045260246000fd5b94815260208101939093526001600160a01b039182166040840152166060909101529056fea26469706673582212202e49c5f2f0355608eb652a83821517c4ded37d91845f3f6fe597dafdfed7e90364736f6c63430008100033",
|
|
316
|
+
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80639d76940211610097578063c3af904e11610066578063c3af904e14610286578063d6281d3e1461029a578063e8e617b7146102ad578063ee89ef3a146102c057600080fd5b80639d76940214610219578063a9cc47181461023a578063aeec8f9d14610247578063bcce53991461027157600080fd5b806331ca2944116100d357806331ca2944146101b557806335287014146101dd57806363bd1d4a146101f05780636db656191461020757600080fd5b806301ffc9a714610105578063150b7a021461012d5780632bb2adb3146101595780632fb6436214610187575b600080fd5b610118610113366004610623565b6102c9565b60405190151581526020015b60405180910390f35b61014061013b366004610669565b610332565b6040516001600160e01b03199091168152602001610124565b610185610167366004610704565b6002805491151563010000000263ff00000019909216919091179055565b005b610185610195366004610704565b600280549115156401000000000264ff0000000019909216919091179055565b6101856101c3366004610704565b600280549115156101000261ff0019909216919091179055565b6002546101189062010000900460ff1681565b6101f960015481565b604051908152602001610124565b60025461011890610100900460ff1681565b610185610227366004610704565b6002805460ff1916911515919091179055565b6002546101189060ff1681565b610185610255366004610704565b60028054911515620100000262ff000019909216919091179055565b60025461011890640100000000900460ff1681565b600254610118906301000000900460ff1681565b6101406102a8366004610726565b610432565b6101406102bb366004610768565b61052b565b6101f960005481565b600254600090640100000000900460ff16156102e457600080fd5b60025462010000900460ff16156102fd57506000919050565b6001600160e01b03198216633ece0a8960e01b148061032c57506001600160e01b031982166301ffc9a760e01b145b92915050565b60025460009060ff16156103b857600254610100900460ff161561035557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e45524337323152656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084015b60405180910390fd5b60008481556000196001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916103f79187908a908a906107a4565b60405180910390a16002546301000000900460ff161561041f5750630badf00d60e01b610429565b50630a85bd0160e11b5b95945050505050565b60025460009060ff16156104b357600254610100900460ff161561045557600080fd5b60405162461bcd60e51b815260206004820152602d60248201527f6f6e5061796f757452656365697665643a205468657920746f6c64206d65204960448201526c081a185d99481d1bc819985a5b609a1b60648201526084016103af565b600083905560018281556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5916104f1918690899089906107a4565b60405180910390a16002546301000000900460ff16156105195750630badf00d60e01b610523565b50636b140e9f60e11b5b949350505050565b60025460009060ff16156105ab57600254610100900460ff161561054e57600080fd5b60405162461bcd60e51b815260206004820152602c60248201527f6f6e506f6c696379457870697265643a205468657920746f6c64206d6520492060448201526b1a185d99481d1bc819985a5b60a21b60648201526084016103af565b60008281556001556040517fcb6442f1752a34d49fd946725ee915eae9914b3fe3f3193b98232c772393e7c5906105ea906002908590889088906107a4565b60405180910390a16002546301000000900460ff16156106125750630badf00d60e01b61061c565b5063e8e617b760e01b5b9392505050565b60006020828403121561063557600080fd5b81356001600160e01b03198116811461061c57600080fd5b80356001600160a01b038116811461066457600080fd5b919050565b60008060008060006080868803121561068157600080fd5b61068a8661064d565b94506106986020870161064d565b935060408601359250606086013567ffffffffffffffff808211156106bc57600080fd5b818801915088601f8301126106d057600080fd5b8135818111156106df57600080fd5b8960208285010111156106f157600080fd5b9699959850939650602001949392505050565b60006020828403121561071657600080fd5b8135801515811461061c57600080fd5b6000806000806080858703121561073c57600080fd5b6107458561064d565b93506107536020860161064d565b93969395505050506040820135916060013590565b60008060006060848603121561077d57600080fd5b6107868461064d565b92506107946020850161064d565b9150604084013590509250925092565b60808101600386106107c657634e487b7160e01b600052602160045260246000fd5b94815260208101939093526001600160a01b039182166040840152166060909101529056fea26469706673582212202e49c5f2f0355608eb652a83821517c4ded37d91845f3f6fe597dafdfed7e90364736f6c63430008100033",
|
|
226
317
|
"linkReferences": {},
|
|
227
318
|
"deployedLinkReferences": {}
|
|
228
319
|
}
|
package/contracts/PolicyPool.sol
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
pragma solidity ^0.8.0;
|
|
3
3
|
|
|
4
|
-
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
|
5
4
|
import {AddressUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
|
|
6
|
-
import {
|
|
5
|
+
import {ERC165Checker} from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
|
|
7
6
|
import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";
|
|
7
|
+
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
|
|
8
|
+
import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
|
|
8
9
|
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
10
|
+
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
|
|
11
|
+
|
|
9
12
|
import {IAccessManager} from "./interfaces/IAccessManager.sol";
|
|
10
|
-
import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
|
|
11
|
-
import {IPremiumsAccount} from "./interfaces/IPremiumsAccount.sol";
|
|
12
|
-
import {IPolicyPool} from "./interfaces/IPolicyPool.sol";
|
|
13
|
-
import {IRiskModule} from "./interfaces/IRiskModule.sol";
|
|
14
|
-
import {IPolicyPoolComponent} from "./interfaces/IPolicyPoolComponent.sol";
|
|
15
13
|
import {IEToken} from "./interfaces/IEToken.sol";
|
|
16
14
|
import {IPolicyHolder} from "./interfaces/IPolicyHolder.sol";
|
|
15
|
+
import {IPolicyPool} from "./interfaces/IPolicyPool.sol";
|
|
16
|
+
import {IPolicyPoolComponent} from "./interfaces/IPolicyPoolComponent.sol";
|
|
17
|
+
import {IPremiumsAccount} from "./interfaces/IPremiumsAccount.sol";
|
|
18
|
+
import {IRiskModule} from "./interfaces/IRiskModule.sol";
|
|
17
19
|
import {Policy} from "./Policy.sol";
|
|
20
|
+
|
|
18
21
|
import {WadRayMath} from "./dependencies/WadRayMath.sol";
|
|
19
22
|
|
|
20
23
|
/**
|
|
@@ -601,29 +604,24 @@ contract PolicyPool is IPolicyPool, PausableUpgradeable, UUPSUpgradeable, ERC721
|
|
|
601
604
|
}
|
|
602
605
|
|
|
603
606
|
/**
|
|
604
|
-
* @dev Notifies the payout with a callback if the policyholder is a contract
|
|
605
|
-
* contract explicitly reverts
|
|
607
|
+
* @dev Notifies the payout with a callback if the policyholder is a contract and implementes the IPolicyHolder interface.
|
|
608
|
+
* Only reverts if the policyholder contract explicitly reverts or it doesn't return the IPolicyHolder.onPayoutReceived selector.
|
|
606
609
|
*/
|
|
607
610
|
function _notifyPayout(uint256 policyId, uint256 payout) internal {
|
|
608
611
|
address customer = ownerOf(policyId);
|
|
609
612
|
if (!AddressUpgradeable.isContract(customer)) return;
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
assembly {
|
|
623
|
-
revert(add(32, reason), mload(reason))
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
}
|
|
613
|
+
if (!ERC165Checker.supportsInterface(customer, type(IPolicyHolder).interfaceId)) return;
|
|
614
|
+
|
|
615
|
+
bytes4 retval = IPolicyHolder(customer).onPayoutReceived(
|
|
616
|
+
_msgSender(),
|
|
617
|
+
address(this),
|
|
618
|
+
policyId,
|
|
619
|
+
payout
|
|
620
|
+
);
|
|
621
|
+
require(
|
|
622
|
+
retval == IPolicyHolder.onPayoutReceived.selector,
|
|
623
|
+
"PolicyPool: Invalid return value from IPolicyHolder"
|
|
624
|
+
);
|
|
627
625
|
}
|
|
628
626
|
|
|
629
627
|
/**
|
|
@@ -632,6 +630,8 @@ contract PolicyPool is IPolicyPool, PausableUpgradeable, UUPSUpgradeable, ERC721
|
|
|
632
630
|
function _notifyExpiration(uint256 policyId) internal {
|
|
633
631
|
address customer = ownerOf(policyId);
|
|
634
632
|
if (!AddressUpgradeable.isContract(customer)) return;
|
|
633
|
+
if (!ERC165Checker.supportsInterface(customer, type(IPolicyHolder).interfaceId)) return;
|
|
634
|
+
|
|
635
635
|
try IPolicyHolder(customer).onPolicyExpired(_msgSender(), address(this), policyId) returns (
|
|
636
636
|
bytes4
|
|
637
637
|
) {
|
|
@@ -3,18 +3,36 @@ pragma solidity ^0.8.0;
|
|
|
3
3
|
|
|
4
4
|
import {IPolicyHolder} from "../interfaces/IPolicyHolder.sol";
|
|
5
5
|
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
|
|
6
|
+
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
|
|
6
7
|
|
|
7
8
|
contract PolicyHolderMock is IPolicyHolder {
|
|
8
9
|
uint256 public policyId;
|
|
9
10
|
uint256 public payout;
|
|
10
11
|
bool public fail;
|
|
12
|
+
bool public emptyRevert;
|
|
11
13
|
bool public notImplemented;
|
|
14
|
+
bool public badlyImplemented;
|
|
15
|
+
bool public noERC165;
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
enum NotificationKind {
|
|
18
|
+
PolicyReceived,
|
|
19
|
+
PayoutReceived,
|
|
20
|
+
PolicyExpired
|
|
21
|
+
}
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
event NotificationReceived(
|
|
24
|
+
NotificationKind kind,
|
|
25
|
+
uint256 policyId,
|
|
26
|
+
address operator,
|
|
27
|
+
address from
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
constructor() {
|
|
31
|
+
fail = false;
|
|
17
32
|
notImplemented = false;
|
|
33
|
+
badlyImplemented = false;
|
|
34
|
+
emptyRevert = false;
|
|
35
|
+
noERC165 = false;
|
|
18
36
|
payout = type(uint256).max;
|
|
19
37
|
}
|
|
20
38
|
|
|
@@ -26,20 +44,50 @@ contract PolicyHolderMock is IPolicyHolder {
|
|
|
26
44
|
notImplemented = notImplemented_;
|
|
27
45
|
}
|
|
28
46
|
|
|
47
|
+
function setBadlyImplemented(bool badlyImplemented_) external {
|
|
48
|
+
badlyImplemented = badlyImplemented_;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function setNoERC165(bool noERC165_) external {
|
|
52
|
+
noERC165 = noERC165_;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function setEmptyRevert(bool emptyRevert_) external {
|
|
56
|
+
emptyRevert = emptyRevert_;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @dev See {IERC165-supportsInterface}.
|
|
61
|
+
*/
|
|
62
|
+
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
|
|
63
|
+
if (noERC165)
|
|
64
|
+
assembly {
|
|
65
|
+
revert(0, 0)
|
|
66
|
+
}
|
|
67
|
+
if (notImplemented) return false;
|
|
68
|
+
return
|
|
69
|
+
interfaceId == type(IPolicyHolder).interfaceId || interfaceId == type(IERC165).interfaceId;
|
|
70
|
+
}
|
|
71
|
+
|
|
29
72
|
function onERC721Received(
|
|
30
73
|
address operator,
|
|
31
74
|
address from,
|
|
32
75
|
uint256 policyId_,
|
|
33
76
|
bytes calldata
|
|
34
77
|
) external override returns (bytes4) {
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
78
|
+
if (fail)
|
|
79
|
+
if (emptyRevert)
|
|
80
|
+
assembly {
|
|
81
|
+
revert(0, 0)
|
|
82
|
+
}
|
|
83
|
+
else revert("onERC721Received: They told me I have to fail");
|
|
84
|
+
|
|
41
85
|
policyId = policyId_;
|
|
42
|
-
|
|
86
|
+
payout = type(uint256).max;
|
|
87
|
+
emit NotificationReceived(NotificationKind.PolicyReceived, policyId_, operator, from);
|
|
88
|
+
|
|
89
|
+
if (badlyImplemented) return bytes4(0x0badf00d);
|
|
90
|
+
|
|
43
91
|
return IERC721Receiver.onERC721Received.selector;
|
|
44
92
|
}
|
|
45
93
|
|
|
@@ -48,15 +96,18 @@ contract PolicyHolderMock is IPolicyHolder {
|
|
|
48
96
|
address from,
|
|
49
97
|
uint256 policyId_
|
|
50
98
|
) external override returns (bytes4) {
|
|
51
|
-
if (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
99
|
+
if (fail)
|
|
100
|
+
if (emptyRevert)
|
|
101
|
+
assembly {
|
|
102
|
+
revert(0, 0)
|
|
103
|
+
}
|
|
104
|
+
else revert("onPolicyExpired: They told me I have to fail");
|
|
57
105
|
policyId = policyId_;
|
|
58
106
|
payout = 0;
|
|
59
|
-
emit NotificationReceived(
|
|
107
|
+
emit NotificationReceived(NotificationKind.PolicyExpired, policyId_, operator, from);
|
|
108
|
+
|
|
109
|
+
if (badlyImplemented) return bytes4(0x0badf00d);
|
|
110
|
+
|
|
60
111
|
return IPolicyHolder.onPolicyExpired.selector;
|
|
61
112
|
}
|
|
62
113
|
|
|
@@ -75,15 +126,18 @@ contract PolicyHolderMock is IPolicyHolder {
|
|
|
75
126
|
uint256 policyId_,
|
|
76
127
|
uint256 amount
|
|
77
128
|
) external override returns (bytes4) {
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
129
|
+
if (fail)
|
|
130
|
+
if (emptyRevert)
|
|
131
|
+
assembly {
|
|
132
|
+
revert(0, 0)
|
|
133
|
+
}
|
|
134
|
+
else revert("onPayoutReceived: They told me I have to fail");
|
|
84
135
|
policyId = policyId_;
|
|
85
136
|
payout = amount;
|
|
86
|
-
emit NotificationReceived(
|
|
137
|
+
emit NotificationReceived(NotificationKind.PayoutReceived, policyId_, operator, from);
|
|
138
|
+
|
|
139
|
+
if (badlyImplemented) return bytes4(0x0badf00d);
|
|
140
|
+
|
|
87
141
|
return IPolicyHolder.onPayoutReceived.selector;
|
|
88
142
|
}
|
|
89
143
|
}
|
package/js/constants.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
1
|
+
const HOUR = 3600;
|
|
2
|
+
const WEEK = HOUR * 24 * 7;
|
|
3
|
+
const DAY = HOUR * 24;
|
|
4
|
+
|
|
5
|
+
// From https://eips.ethereum.org/EIPS/eip-1967
|
|
6
|
+
const IMPLEMENTATION_SLOT = "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";
|
|
3
7
|
|
|
4
8
|
module.exports = {
|
|
5
9
|
WEEK,
|
|
6
10
|
DAY,
|
|
11
|
+
HOUR,
|
|
12
|
+
IMPLEMENTATION_SLOT,
|
|
7
13
|
};
|
package/js/deploy.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
const upgrades_core = require("@openzeppelin/upgrades-core");
|
|
2
2
|
const helpers = require("@nomicfoundation/hardhat-network-helpers");
|
|
3
3
|
const fs = require("fs");
|
|
4
|
-
const { request } = require("undici");
|
|
5
4
|
const ethers = require("ethers");
|
|
6
5
|
const { task, types } = require("hardhat/config");
|
|
7
6
|
const { WhitelistStatus } = require("../js/enums");
|
|
@@ -78,39 +77,33 @@ async function logContractCreated(hre, contractName, address) {
|
|
|
78
77
|
async function verifyContract(hre, contract, isProxy, constructorArguments) {
|
|
79
78
|
if (isProxy === undefined) isProxy = false;
|
|
80
79
|
if (constructorArguments === undefined) constructorArguments = [];
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
const address = isProxy
|
|
81
|
+
? await upgrades_core.getImplementationAddress(hre.network.provider, contract.address)
|
|
82
|
+
: contract.address;
|
|
83
83
|
try {
|
|
84
84
|
await hre.run("verify:verify", {
|
|
85
85
|
address: address,
|
|
86
86
|
constructorArguments: constructorArguments,
|
|
87
87
|
});
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.log("Error verifying contract implementation: ", error);
|
|
90
|
+
console.log("You can retry with:");
|
|
91
|
+
console.log(
|
|
92
|
+
` npx hardhat verify --network '${hre.network.name}' '${address}' ${constructorArguments
|
|
93
|
+
.map((a) => `'${a.toString()}'`)
|
|
94
|
+
.join(" ")}`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
88
98
|
if (isProxy) {
|
|
89
|
-
|
|
90
|
-
// await hre.run("verify:verify", {
|
|
91
|
-
// address: contract.address,
|
|
92
|
-
// });
|
|
93
|
-
|
|
94
|
-
// so we use the following workaround
|
|
95
|
-
const endpoints = await hre.run("verify:get-etherscan-endpoint");
|
|
96
|
-
const params = new URLSearchParams({
|
|
97
|
-
module: "contract",
|
|
98
|
-
action: "verifyproxycontract",
|
|
99
|
-
apiKey: hre.config.etherscan.apiKey,
|
|
99
|
+
await hre.run("verify:verify", {
|
|
100
100
|
address: contract.address,
|
|
101
101
|
});
|
|
102
|
-
const response = await request(endpoints.urls.apiURL, {
|
|
103
|
-
method: "POST",
|
|
104
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
105
|
-
body: params.toString(),
|
|
106
|
-
});
|
|
107
|
-
if (response.statusCode != 200)
|
|
108
|
-
throw new Error(`Etherscan replied with ${response.statusCode}: ${await response.body.text()}`);
|
|
109
|
-
const body = await response.body.json();
|
|
110
|
-
if (body.status != 1) throw new Error(`Etherscan replied with ${body}`);
|
|
111
102
|
}
|
|
112
103
|
} catch (error) {
|
|
113
|
-
console.log("Error verifying contract", error);
|
|
104
|
+
console.log("Error verifying contract proxy: ", error);
|
|
105
|
+
const endpoints = await hre.run("verify:get-etherscan-endpoint");
|
|
106
|
+
console.log(`You should do it manually at ${endpoints.urls.browserURL}/proxyContractChecker?a=${contract.address}`);
|
|
114
107
|
}
|
|
115
108
|
}
|
|
116
109
|
|
|
@@ -264,8 +257,11 @@ async function deployRiskModule(
|
|
|
264
257
|
},
|
|
265
258
|
hre
|
|
266
259
|
) {
|
|
267
|
-
extraArgs = extraArgs || [];
|
|
268
|
-
|
|
260
|
+
extraArgs = typeof extraArgs === "string" ? JSON.parse(extraArgs) : extraArgs || [];
|
|
261
|
+
|
|
262
|
+
extraConstructorArgs =
|
|
263
|
+
typeof extraConstructorArgs === "string" ? JSON.parse(extraConstructorArgs) : extraConstructorArgs || [];
|
|
264
|
+
|
|
269
265
|
const { contract } = await deployProxyContract(
|
|
270
266
|
{
|
|
271
267
|
contractClass: rmClass,
|
|
@@ -583,6 +579,8 @@ function add_task() {
|
|
|
583
579
|
.addOptionalParam("exposureLimit", "Exposure (sum of payouts) limit for the RM", 1e6, types.float)
|
|
584
580
|
.addOptionalParam("maxDuration", "Maximum policy duration in hours", 24 * 365, types.int)
|
|
585
581
|
.addOptionalParam("moc", "Margin of Conservativism", 1.0, types.float)
|
|
582
|
+
.addOptionalParam("extraConstructorArgs", "Additional constructor args", undefined, types.str)
|
|
583
|
+
.addOptionalParam("extraArgs", "Additional initializer args", undefined, types.str)
|
|
586
584
|
.addParam("wallet", "RM address", types.address)
|
|
587
585
|
.setAction(deployRiskModule);
|
|
588
586
|
|
package/js/enums.js
CHANGED
|
@@ -4,7 +4,29 @@ const WhitelistStatus = {
|
|
|
4
4
|
blacklisted: 2,
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
+
const ComponentKind = {
|
|
8
|
+
eToken: 1,
|
|
9
|
+
riskModule: 2,
|
|
10
|
+
premiumsAccount: 3,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const ComponentStatus = {
|
|
14
|
+
inactive: 0,
|
|
15
|
+
active: 1,
|
|
16
|
+
deprecated: 2,
|
|
17
|
+
suspended: 3,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const ETokenParameter = {
|
|
21
|
+
// From IEToken.Parameter
|
|
22
|
+
liquidityRequirement: 0,
|
|
23
|
+
minUtilizationRate: 1,
|
|
24
|
+
maxUtilizationRate: 2,
|
|
25
|
+
internalLoanInterestRate: 3,
|
|
26
|
+
};
|
|
27
|
+
|
|
7
28
|
const RiskModuleParameter = {
|
|
29
|
+
// From IRiskModule.Parameter
|
|
8
30
|
moc: 0,
|
|
9
31
|
jrCollRatio: 1,
|
|
10
32
|
collRatio: 2,
|
|
@@ -17,14 +39,10 @@ const RiskModuleParameter = {
|
|
|
17
39
|
maxDuration: 9,
|
|
18
40
|
};
|
|
19
41
|
|
|
20
|
-
const ComponentKind = {
|
|
21
|
-
eToken: 1,
|
|
22
|
-
riskModule: 2,
|
|
23
|
-
premiumsAccount: 3,
|
|
24
|
-
};
|
|
25
|
-
|
|
26
42
|
module.exports = {
|
|
27
|
-
WhitelistStatus,
|
|
28
|
-
RiskModuleParameter,
|
|
29
43
|
ComponentKind,
|
|
44
|
+
ComponentStatus,
|
|
45
|
+
ETokenParameter,
|
|
46
|
+
RiskModuleParameter,
|
|
47
|
+
WhitelistStatus,
|
|
30
48
|
};
|
package/js/test-utils.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
const hre = require("hardhat");
|
|
2
2
|
const { _W, grantRole, getTransactionEvent } = require("../js/utils");
|
|
3
3
|
const { RiskModuleParameter } = require("../js/enums");
|
|
4
|
+
const helpers = require("@nomicfoundation/hardhat-network-helpers");
|
|
4
5
|
|
|
5
|
-
const {
|
|
6
|
+
const { ethers } = hre;
|
|
7
|
+
const { AddressZero } = ethers.constants;
|
|
6
8
|
|
|
7
9
|
async function initCurrency(options, initial_targets, initial_balances) {
|
|
8
|
-
const Currency = await
|
|
10
|
+
const Currency = await ethers.getContractFactory(options.contractClass || "TestCurrency");
|
|
9
11
|
let currency = await Currency.deploy(
|
|
10
12
|
options.name || "Test Currency",
|
|
11
13
|
options.symbol || "TEST",
|
|
@@ -21,6 +23,26 @@ async function initCurrency(options, initial_targets, initial_balances) {
|
|
|
21
23
|
return currency;
|
|
22
24
|
}
|
|
23
25
|
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @param currencyAddress The currency contract address, for example the USDC address
|
|
29
|
+
* @param currencyOrigin An account that holds at least sum(initialBalances) of currency tokens
|
|
30
|
+
* @param initialTargets Array of addresses that will receive the initial balances
|
|
31
|
+
* @param initialBalances Initial balances for each address
|
|
32
|
+
*/
|
|
33
|
+
async function initForkCurrency(currencyAddress, currencyOrigin, initialTargets, initialBalances) {
|
|
34
|
+
const currency = await ethers.getContractAt("IERC20", currencyAddress);
|
|
35
|
+
await helpers.impersonateAccount(currencyOrigin);
|
|
36
|
+
await helpers.setBalance(currencyOrigin, ethers.utils.parseEther("100"));
|
|
37
|
+
const whale = await ethers.getSigner(currencyOrigin);
|
|
38
|
+
await Promise.all(
|
|
39
|
+
initialTargets.map(async function (user, index) {
|
|
40
|
+
await currency.connect(whale).transfer(user.address, initialBalances[index]);
|
|
41
|
+
})
|
|
42
|
+
);
|
|
43
|
+
return currency;
|
|
44
|
+
}
|
|
45
|
+
|
|
24
46
|
async function createRiskModule(
|
|
25
47
|
pool,
|
|
26
48
|
premiumsAccount,
|
|
@@ -106,7 +128,7 @@ async function createEToken(
|
|
|
106
128
|
pool,
|
|
107
129
|
{ etkName, etkSymbol, maxUtilizationRate, poolLoanInterestRate, extraArgs, extraConstructorArgs }
|
|
108
130
|
) {
|
|
109
|
-
const EToken = await
|
|
131
|
+
const EToken = await ethers.getContractFactory("EToken");
|
|
110
132
|
extraArgs = extraArgs || [];
|
|
111
133
|
extraConstructorArgs = extraConstructorArgs || [];
|
|
112
134
|
const etk = await hre.upgrades.deployProxy(
|
|
@@ -162,8 +184,8 @@ const randomAddress = "0x89cDb70Fee571251a66E34caa1673cE40f7549Dc";
|
|
|
162
184
|
* - .dontGrantL123Roles: if specified, doesn't grants LEVEL1, 2 and 3 roles.
|
|
163
185
|
*/
|
|
164
186
|
async function deployPool(options) {
|
|
165
|
-
const PolicyPool = await
|
|
166
|
-
const AccessManager = await
|
|
187
|
+
const PolicyPool = await ethers.getContractFactory("PolicyPool");
|
|
188
|
+
const AccessManager = await ethers.getContractFactory("AccessManager");
|
|
167
189
|
|
|
168
190
|
let accessManager;
|
|
169
191
|
|
|
@@ -172,7 +194,7 @@ async function deployPool(options) {
|
|
|
172
194
|
accessManager = await hre.upgrades.deployProxy(AccessManager, [], { kind: "uups" });
|
|
173
195
|
await accessManager.deployed();
|
|
174
196
|
} else {
|
|
175
|
-
accessManager = await
|
|
197
|
+
accessManager = await ethers.getContractAt("AccessManager", options.access);
|
|
176
198
|
}
|
|
177
199
|
|
|
178
200
|
const policyPool = await hre.upgrades.deployProxy(
|
|
@@ -204,7 +226,7 @@ async function deployPool(options) {
|
|
|
204
226
|
}
|
|
205
227
|
|
|
206
228
|
async function deployPremiumsAccount(pool, options, addToPool = true) {
|
|
207
|
-
const PremiumsAccount = await
|
|
229
|
+
const PremiumsAccount = await ethers.getContractFactory("PremiumsAccount");
|
|
208
230
|
const premiumsAccount = await hre.upgrades.deployProxy(PremiumsAccount, [], {
|
|
209
231
|
constructorArgs: [pool.address, options.jrEtkAddr || AddressZero, options.srEtkAddr || AddressZero],
|
|
210
232
|
kind: "uups",
|
|
@@ -226,6 +248,51 @@ async function makePolicy(pool, rm, cust, payout, premium, lossProb, expiration,
|
|
|
226
248
|
return newPolicyEvt;
|
|
227
249
|
}
|
|
228
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Resets hardhat network to fork on the specified block and url
|
|
253
|
+
*/
|
|
254
|
+
async function setupChain(block, alchemyUrlEnv = "ALCHEMY_URL") {
|
|
255
|
+
const alchemyUrl = process.env[alchemyUrlEnv];
|
|
256
|
+
if (alchemyUrl === undefined) throw new Error(`Define envvar ${alchemyUrlEnv} for this test`);
|
|
257
|
+
|
|
258
|
+
if (block === undefined) throw new Error("Block can't be undefined use null for the current block");
|
|
259
|
+
if (block === null) block = undefined;
|
|
260
|
+
return hre.network.provider.request({
|
|
261
|
+
method: "hardhat_reset",
|
|
262
|
+
params: [
|
|
263
|
+
{
|
|
264
|
+
forking: {
|
|
265
|
+
jsonRpcUrl: alchemyUrl,
|
|
266
|
+
blockNumber: block,
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const skipForkTests = process.env.SKIP_FORK_TESTS === "true";
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Chai test case wrapper for tests that require forking a live chain.
|
|
277
|
+
*
|
|
278
|
+
* It validates that the chain node URL is set, forks the chain at the specified block and adds the
|
|
279
|
+
* block number to the test name.
|
|
280
|
+
*/
|
|
281
|
+
const fork = {
|
|
282
|
+
it: (name, blockNumber, test, alchemyUrlEnv = "ALCHEMY_URL") => {
|
|
283
|
+
const fullName = `[FORK ${blockNumber}] ${name}`;
|
|
284
|
+
|
|
285
|
+
// eslint-disable-next-line func-style
|
|
286
|
+
const wrapped = async (...args) => {
|
|
287
|
+
await setupChain(blockNumber, alchemyUrlEnv);
|
|
288
|
+
|
|
289
|
+
return test(...args);
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
return (skipForkTests ? it.skip : it)(fullName, wrapped);
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
|
|
229
296
|
if (process.env.ENABLE_HH_WARNINGS !== "yes") hre.upgrades.silenceWarnings();
|
|
230
297
|
|
|
231
298
|
module.exports = {
|
|
@@ -235,6 +302,10 @@ module.exports = {
|
|
|
235
302
|
createRiskModule,
|
|
236
303
|
deployPool,
|
|
237
304
|
deployPremiumsAccount,
|
|
305
|
+
fork,
|
|
238
306
|
initCurrency,
|
|
307
|
+
initForkCurrency,
|
|
239
308
|
makePolicy,
|
|
309
|
+
setupChain,
|
|
310
|
+
skipForkTests,
|
|
240
311
|
};
|
package/js/utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const { findAll } = require("solidity-ast/utils");
|
|
2
2
|
const ethers = require("ethers");
|
|
3
3
|
const helpers = require("@nomicfoundation/hardhat-network-helpers");
|
|
4
|
+
const { DAY, IMPLEMENTATION_SLOT } = require("./constants");
|
|
4
5
|
|
|
5
6
|
const _E = ethers.utils.parseEther;
|
|
6
7
|
const _BN = ethers.BigNumber.from;
|
|
@@ -234,12 +235,26 @@ async function defaultPolicyParams(
|
|
|
234
235
|
payout: payout || _A(1000),
|
|
235
236
|
premium: premium || ethers.constants.MaxUint256,
|
|
236
237
|
lossProb: lossProb || _W(0.1),
|
|
237
|
-
expiration: expiration || now +
|
|
238
|
+
expiration: expiration || now + DAY * 30,
|
|
238
239
|
policyData: policyData || ethers.utils.hexlify(ethers.utils.randomBytes(32)),
|
|
239
|
-
validUntil: validUntil || now +
|
|
240
|
+
validUntil: validUntil || now + DAY * 30,
|
|
240
241
|
};
|
|
241
242
|
}
|
|
242
243
|
|
|
244
|
+
async function readImplementationAddress(contractAddress) {
|
|
245
|
+
const implStorage = await ethers.provider.getStorageAt(contractAddress, IMPLEMENTATION_SLOT);
|
|
246
|
+
return ethers.utils.getAddress(ethers.utils.hexDataSlice(implStorage, 12));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Converts a string value to uint256(keccak(value))
|
|
251
|
+
* @param {string} value
|
|
252
|
+
* @returns {ethers.BigNumber}
|
|
253
|
+
*/
|
|
254
|
+
function uintKeccak(value) {
|
|
255
|
+
return ethers.BigNumber.from(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(value)));
|
|
256
|
+
}
|
|
257
|
+
|
|
243
258
|
module.exports = {
|
|
244
259
|
_BN,
|
|
245
260
|
_E,
|
|
@@ -260,5 +275,7 @@ module.exports = {
|
|
|
260
275
|
makeQuoteMessage,
|
|
261
276
|
makeSignedQuote,
|
|
262
277
|
RAY,
|
|
278
|
+
readImplementationAddress,
|
|
279
|
+
uintKeccak,
|
|
263
280
|
WAD,
|
|
264
281
|
};
|