UNPKG

@ensuro/core

Version:

Ensuro - Decentralized insurance protocol

1,104 lines 113 kB
{ "_format": "hh-sol-artifact-1", "contractName": "SignedBucketRiskModule", "sourceName": "contracts/SignedBucketRiskModule.sol", "abi": [ { "inputs": [ { "internalType": "contract IPolicyPool", "name": "policyPool_", "type": "address" }, { "internalType": "contract IPremiumsAccount", "name": "premiumsAccount_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "BucketCannotBeZero", "type": "error" }, { "inputs": [], "name": "BucketNotFound", "type": "error" }, { "inputs": [], "name": "ExposureLimitCannotBeLessThanActiveExposure", "type": "error" }, { "inputs": [], "name": "NoZeroPolicyPool", "type": "error" }, { "inputs": [], "name": "NoZeroWallet", "type": "error" }, { "inputs": [], "name": "OnlyPolicyPool", "type": "error" }, { "inputs": [], "name": "PremiumsAccountMustBePartOfThePool", "type": "error" }, { "inputs": [], "name": "QuoteExpired", "type": "error" }, { "inputs": [], "name": "UpgradeCannotChangePolicyPool", "type": "error" }, { "inputs": [], "name": "UpgradeCannotChangePremiumsAccount", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "previousAdmin", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newAdmin", "type": "address" } ], "name": "AdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "beacon", "type": "address" } ], "name": "BeaconUpgraded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "bucketId", "type": "uint256" } ], "name": "BucketDeleted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "enum IAccessManager.GovernanceActions", "name": "action", "type": "uint8" }, { "indexed": false, "internalType": "address", "name": "value", "type": "address" } ], "name": "ComponentChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "enum IAccessManager.GovernanceActions", "name": "action", "type": "uint8" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "GovernanceAction", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "bucketId", "type": "uint256" }, { "components": [ { "internalType": "uint256", "name": "moc", "type": "uint256" }, { "internalType": "uint256", "name": "jrCollRatio", "type": "uint256" }, { "internalType": "uint256", "name": "collRatio", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroPpFee", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCocFee", "type": "uint256" }, { "internalType": "uint256", "name": "jrRoc", "type": "uint256" }, { "internalType": "uint256", "name": "srRoc", "type": "uint256" } ], "indexed": false, "internalType": "struct IRiskModule.Params", "name": "params", "type": "tuple" } ], "name": "NewBucket", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "policyId", "type": "uint256" }, { "indexed": false, "internalType": "bytes32", "name": "policyData", "type": "bytes32" } ], "name": "NewSignedPolicy", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Paused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "account", "type": "address" } ], "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "inputs": [], "name": "activeExposure", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "bucketId", "type": "uint256" } ], "name": "bucketParams", "outputs": [ { "components": [ { "internalType": "uint256", "name": "moc", "type": "uint256" }, { "internalType": "uint256", "name": "jrCollRatio", "type": "uint256" }, { "internalType": "uint256", "name": "collRatio", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroPpFee", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCocFee", "type": "uint256" }, { "internalType": "uint256", "name": "jrRoc", "type": "uint256" }, { "internalType": "uint256", "name": "srRoc", "type": "uint256" } ], "internalType": "struct IRiskModule.Params", "name": "params_", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "currency", "outputs": [ { "internalType": "contract IERC20Metadata", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "bucketId", "type": "uint256" } ], "name": "deleteBucket", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "exposureLimit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" } ], "name": "getMinimumPremium", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" }, { "internalType": "uint256", "name": "bucketId", "type": "uint256" } ], "name": "getMinimumPremiumForBucket", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "uint256", "name": "collRatio_", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroPpFee_", "type": "uint256" }, { "internalType": "uint256", "name": "srRoc_", "type": "uint256" }, { "internalType": "uint256", "name": "maxPayoutPerPolicy_", "type": "uint256" }, { "internalType": "uint256", "name": "exposureLimit_", "type": "uint256" }, { "internalType": "address", "name": "wallet_", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "maxDuration", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxPayoutPerPolicy", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" }, { "internalType": "address", "name": "onBehalfOf", "type": "address" }, { "internalType": "bytes32", "name": "policyData", "type": "bytes32" }, { "internalType": "uint256", "name": "bucketId", "type": "uint256" }, { "internalType": "bytes32", "name": "quoteSignatureR", "type": "bytes32" }, { "internalType": "bytes32", "name": "quoteSignatureVS", "type": "bytes32" }, { "internalType": "uint40", "name": "quoteValidUntil", "type": "uint40" } ], "name": "newPolicy", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "params", "outputs": [ { "components": [ { "internalType": "uint256", "name": "moc", "type": "uint256" }, { "internalType": "uint256", "name": "jrCollRatio", "type": "uint256" }, { "internalType": "uint256", "name": "collRatio", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroPpFee", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCocFee", "type": "uint256" }, { "internalType": "uint256", "name": "jrRoc", "type": "uint256" }, { "internalType": "uint256", "name": "srRoc", "type": "uint256" } ], "internalType": "struct IRiskModule.Params", "name": "ret", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "paused", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "policyPool", "outputs": [ { "internalType": "contract IPolicyPool", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "premiumsAccount", "outputs": [ { "internalType": "contract IPremiumsAccount", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "payout", "type": "uint256" } ], "name": "releaseExposure", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "jrScr", "type": "uint256" }, { "internalType": "uint256", "name": "srScr", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint256", "name": "purePremium", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCommission", "type": "uint256" }, { "internalType": "uint256", "name": "partnerCommission", "type": "uint256" }, { "internalType": "uint256", "name": "jrCoc", "type": "uint256" }, { "internalType": "uint256", "name": "srCoc", "type": "uint256" }, { "internalType": "contract IRiskModule", "name": "riskModule", "type": "address" }, { "internalType": "uint40", "name": "start", "type": "uint40" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" } ], "internalType": "struct Policy.PolicyData", "name": "oldPolicy", "type": "tuple" }, { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" }, { "internalType": "bytes32", "name": "policyData", "type": "bytes32" }, { "internalType": "uint256", "name": "bucketId", "type": "uint256" }, { "internalType": "bytes32", "name": "quoteSignatureR", "type": "bytes32" }, { "internalType": "bytes32", "name": "quoteSignatureVS", "type": "bytes32" }, { "internalType": "uint40", "name": "quoteValidUntil", "type": "uint40" } ], "name": "replacePolicy", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "payout", "type": "uint256" }, { "internalType": "uint256", "name": "premium", "type": "uint256" }, { "internalType": "uint256", "name": "jrScr", "type": "uint256" }, { "internalType": "uint256", "name": "srScr", "type": "uint256" }, { "internalType": "uint256", "name": "lossProb", "type": "uint256" }, { "internalType": "uint256", "name": "purePremium", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCommission", "type": "uint256" }, { "internalType": "uint256", "name": "partnerCommission", "type": "uint256" }, { "internalType": "uint256", "name": "jrCoc", "type": "uint256" }, { "internalType": "uint256", "name": "srCoc", "type": "uint256" }, { "internalType": "contract IRiskModule", "name": "riskModule", "type": "address" }, { "internalType": "uint40", "name": "start", "type": "uint40" }, { "internalType": "uint40", "name": "expiration", "type": "uint40" } ], "internalType": "struct Policy.PolicyData", "name": "policy", "type": "tuple" }, { "internalType": "uint256", "name": "payout", "type": "uint256" } ], "name": "resolvePolicy", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "bucketId", "type": "uint256" }, { "components": [ { "internalType": "uint256", "name": "moc", "type": "uint256" }, { "internalType": "uint256", "name": "jrCollRatio", "type": "uint256" }, { "internalType": "uint256", "name": "collRatio", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroPpFee", "type": "uint256" }, { "internalType": "uint256", "name": "ensuroCocFee", "type": "uint256" }, { "internalType": "uint256", "name": "jrRoc", "type": "uint256" }, { "internalType": "uint256", "name": "srRoc", "type": "uint256" } ], "internalType": "struct IRiskModule.Params", "name": "params_", "type": "tuple" } ], "name": "setBucketParams", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "enum IRiskModule.Parameter", "name": "param", "type": "uint8" }, { "internalType": "uint256", "name": "newValue", "type": "uint256" } ], "name": "setParam", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "wallet_", "type": "address" } ], "name": "setWallet", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" } ], "name": "upgradeTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "wallet", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ], "bytecode": "0x60e060405230608052348015610013575f5ffd5b50604051615793380380615793833981016040819052610032916101f8565b8181816001600160a01b03811661005c57604051636b23cf0160e01b815260040160405180910390fd5b610064610125565b806001600160a01b031660a0816001600160a01b03168152505050816001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e99190610230565b6001600160a01b0316146101105760405163fec343d560e01b815260040160405180910390fd5b6001600160a01b031660c05250610252915050565b5f54610100900460ff16156101905760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146101df575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101f5575f5ffd5b50565b5f5f60408385031215610209575f5ffd5b8251610214816101e1565b6020840151909250610225816101e1565b809150509250929050565b5f60208284031215610240575f5ffd5b815161024b816101e1565b9392505050565b60805160a05160c05161544c6103475f395f81816103a001526131e801525f8181610275015281816106750152818161090401528181610b9b01528181610f02015281816110a6015281816111d6015281816112d001528181611365015281816114940152818161160201528181611cbd01528181611ded01528181611ed1015281816126c401528181612a7e01528181612b1b01528181612bce01528181612d9d01528181612fa0015281816137d3015281816138700152818161391601528181613ac30152613f8801525f81816107f701528181610840015281816109f801528181610a380152610ac5015261544c5ff3fe6080604052600436106101ba575f3560e01c806373a952e8116100f25780638bac3a2411610092578063cfd4c60611610062578063cfd4c6061461052e578063cff0ab9614610542578063deaa59df14610556578063e5a6b10f14610575575f5ffd5b80638bac3a241461045d578063b9b28f2a1461047c578063c1cca2b31461049b578063ceddac6f146104ba575f5ffd5b80637ff8bf25116100cd5780637ff8bf251461040257806382ff9c8c146104165780638456cb591461043557806385272a6e14610449575f5ffd5b806373a952e814610392578063766dbc56146103c45780637a702b3c146103e3575f5ffd5b8063521eb2731161015d5780635c975abb116101385780635c975abb1461031e5780636a448ef1146103355780636db5c8fd146103545780636f0dbe6f14610373575f5ffd5b8063521eb273146102c057806352d1902d146102dd578063571e8bcc146102ff575f5ffd5b80633659cfe6116101985780633659cfe6146102345780633f4ba83a146102535780634d15eb03146102675780634f1ef286146102ad575f5ffd5b806301ffc9a7146101be57806306fdde03146101f257806318e26bb914610213575b5f5ffd5b3480156101c9575f5ffd5b506101dd6101d83660046146bc565b610589565b60405190151581526020015b60405180910390f35b3480156101fd575f5ffd5b506102066105b4565b6040516101e991906146e3565b34801561021e575f5ffd5b5061023261022d366004614718565b610644565b005b34801561023f575f5ffd5b5061023261024e366004614743565b6107ed565b34801561025e575f5ffd5b506102326108d3565b348015610272575f5ffd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101e9565b6102326102bb3660046147e9565b6109ee565b3480156102cb575f5ffd5b5060fe546001600160a01b0316610295565b3480156102e8575f5ffd5b506102f1610ab9565b6040519081526020016101e9565b34801561030a575f5ffd5b50610232610319366004614849565b610b6a565b348015610329575f5ffd5b5060975460ff166101dd565b348015610340575f5ffd5b5061023261034f366004614718565b610eff565b34801561035f575f5ffd5b5060fc54600160b01b900461ffff166102f1565b34801561037e575f5ffd5b5061023261038d36600461487f565b610f61565b34801561039d575f5ffd5b507f0000000000000000000000000000000000000000000000000000000000000000610295565b3480156103cf575f5ffd5b506102f16103de366004614922565b61107a565b3480156103ee575f5ffd5b506102326103fd3660046149be565b6111b3565b34801561040d575f5ffd5b5060fd546102f1565b348015610421575f5ffd5b506102f16104303660046149e9565b611339565b348015610440575f5ffd5b50610232611471565b348015610454575f5ffd5b506102f1611578565b348015610468575f5ffd5b506102f1610477366004614a63565b61159a565b348015610487575f5ffd5b506102f1610496366004614a95565b6115b7565b3480156104a6575f5ffd5b506102326104b5366004614acf565b6115d1565b3480156104c5575f5ffd5b506104d96104d4366004614718565b611ad2565b6040516101e991905f60e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b348015610539575f5ffd5b506102f1611bcf565b34801561054d575f5ffd5b506104d9611bed565b348015610561575f5ffd5b50610232610570366004614743565b611c9a565b348015610580575f5ffd5b50610295611dea565b5f61059382611e6b565b806105ae57506001600160e01b0319821663da40804f60e01b145b92915050565b606060fb80546105c390614afc565b80601f01602080910402602001604051908101604052809291908181526020018280546105ef90614afc565b801561063a5780601f106106115761010080835404028352916020019161063a565b820191905f5260205f20905b81548152906001019060200180831161061d57829003601f168201915b5050505050905090565b5f5160206153d05f395f51905f527fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f39190614b2e565b6001600160a01b0316632b1cff1f3084843360016040518663ffffffff1660e01b8152600401610727959493929190614b49565b5f6040518083038186803b15801561073d575f5ffd5b505afa15801561074f573d5f5f3e3d5ffd5b50505050825f03610773576040516364ba211360e11b815260040160405180910390fd5b5f83815261012d602052604081205461ffff1690036107a55760405163c4c1a0c560e01b815260040160405180910390fd5b5f83815261012d602052604080822080546001600160c01b03191690555184917fda8c8883e1b3ead63d3ef64674f8fc499048554f6fa36776af0ab41d2f99834691a2505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361083e5760405162461bcd60e51b815260040161083590614b7c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108865f5160206153b05f395f51905f52546001600160a01b031690565b6001600160a01b0316146108ac5760405162461bcd60e51b815260040161083590614bc8565b6108b581611ea0565b604080515f808252602082019092526108d091839190611fbd565b50565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50415f5160206153d05f395f51905f527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561095e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109829190614b2e565b6001600160a01b0316632b1cff1f3084843360016040518663ffffffff1660e01b81526004016109b6959493929190614b49565b5f6040518083038186803b1580156109cc575f5ffd5b505afa1580156109de573d5f5f3e3d5ffd5b505050506109ea612127565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610a365760405162461bcd60e51b815260040161083590614b7c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a7e5f5160206153b05f395f51905f52546001600160a01b031690565b6001600160a01b031614610aa45760405162461bcd60e51b815260040161083590614bc8565b610aad82611ea0565b6109ea82826001611fbd565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b585760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610835565b505f5160206153b05f395f51905f5290565b5f5160206153d05f395f51905f527fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bf5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c199190614b2e565b6001600160a01b0316632b1cff1f3084843360016040518663ffffffff1660e01b8152600401610c4d959493929190614b49565b5f6040518083038186803b158015610c63575f5ffd5b505afa158015610c75573d5f5f3e3d5ffd5b50505050835f03610c99576040516364ba211360e11b815260040160405180910390fd5b604051806101400160405280610cb1855f0135612179565b61ffff168152602001610cc78560200135612179565b61ffff168152602001610cdd8560400135612179565b61ffff168152602001610cf38560600135612179565b61ffff168152602001610d098560800135612179565b61ffff168152602001610d1f8560a00135612179565b61ffff168152602001610d358560c00135612179565b61ffff908116825263ffffffff6020808401829052604080850183905260609485018490525f8a815261012d835281902086518154938801519288015196880151608089015160a08a015160c08b015160e08c01516101008d0151610120909d01518b16600160b01b0261ffff60b01b199d8b16600160901b029d909d1665ffffffffffff60901b1991909a16600160701b0263ffffffff60701b19928c16600160601b029290921665ffffffffffff60601b19938c16600160501b0261ffff60501b19958d16600160401b029590951663ffffffff60401b19968d16600160301b0261ffff60301b199e8e16600160201b029e909e1667ffffffff00000000199a8e16620100000263ffffffff19909c1698909d1697909717999099179790971699909917999099179190911691909117179590951691909117929092179190911617919091178155610e8890612192565b6040805184358152602080860135908201528482013581830152606080860135908201526080808601359082015260a0808601359082015260c08086013590820152905185917f1f02d2d352ddbf27121545f4d4730d7656c038f9ce75851410c9ef6982728975919081900360e00190a250505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610f485760405163799e780f60e01b815260040160405180910390fd5b8060fd5f828254610f599190614c28565b909155505050565b5f54610100900460ff1615808015610f7f57505f54600160ff909116105b80610f985750303b158015610f9857505f5460ff166001145b610ffb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610835565b5f805460ff19166001179055801561101c575f805461ff0019166101001790555b61102b8888888888888861258c565b8015611070575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b5f6110836125c9565b7f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611100573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111249190614b2e565b6001600160a01b0316635ff57d203083335f6040518563ffffffff1660e01b81526004016111559493929190614c3b565b5f6040518083038186803b15801561116b575f5ffd5b505afa15801561117d573d5f5f3e3d5ffd5b505050506111928c8c8c8c8b8b8b8b8b612611565b6111a28c8c8c8c8b8b338f6127cc565b519c9b505050505050505050505050565b7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611230573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112549190614b2e565b6001600160a01b0316635ff57d203083335f6040518563ffffffff1660e01b81526004016112859493929190614c3b565b5f6040518083038186803b15801561129b575f5ffd5b505afa1580156112ad573d5f5f3e3d5ffd5b505050506112b96125c9565b604051631e9c0acf60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637a702b3c906113079086908690600401614d31565b5f604051808303815f87803b15801561131e575f5ffd5b505af1158015611330573d5f5f3e3d5ffd5b50505050505050565b5f6113426125c9565b7f13413a37e797fdcf9481024e55772fdede41168298ffead0664159cf5d0745557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e39190614b2e565b6001600160a01b0316635ff57d203083335f6040518563ffffffff1660e01b81526004016114149493929190614c3b565b5f6040518083038186803b15801561142a575f5ffd5b505afa15801561143c573d5f5f3e3d5ffd5b505050506114518b8b8b8b8b8b8b8b8b612611565b6111a28c8c8c8c8c336114638e612839565b61146c8e611ad2565b612848565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50417f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ee573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115129190614b2e565b6001600160a01b0316635ff57d2030833360016040518563ffffffff1660e01b81526004016115449493929190614c3b565b5f6040518083038186803b15801561155a575f5ffd5b505afa15801561156c573d5f5f3e3d5ffd5b505050506108d0612e26565b60fc545f90611595908290600160901b900463ffffffff16612e63565b905090565b5f6115af848484426115aa611bed565b612ef1565b949350505050565b5f6115c8858585426115aa87611ad2565b95945050505050565b5f5160206153d05f395f51905f527fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c07f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116809190614b2e565b6001600160a01b0316632b1cff1f3084843360016040518663ffffffff1660e01b81526004016116b4959493929190614b49565b5f6040518083038186803b1580156116ca575f5ffd5b505afa1580156116dc573d5f5f3e3d5ffd5b505f92506116e8915050565b8460098111156116fa576116fa614d4e565b036117235761170883612179565b60fc805461ffff191661ffff92909216919091179055611a95565b600184600981111561173757611737614d4e565b036117695761174583612179565b60fc805461ffff92909216620100000263ffff000019909216919091179055611a95565b600284600981111561177d5761177d614d4e565b036117b25761178b83612179565b60fc805461ffff92909216600160201b0265ffff0000000019909216919091179055611a95565b60038460098111156117c6576117c6614d4e565b036117fa576117d483612179565b60fc805461ffff92909216600160301b0261ffff60301b19909216919091179055611a95565b600484600981111561180e5761180e614d4e565b036118475761181c83612179565b60fc805461ffff92909216600160401b0269ffff000000000000000019909216919091179055611a95565b600584600981111561185b5761185b614d4e565b0361188f5761186983612179565b60fc805461ffff92909216600160501b0261ffff60501b19909216919091179055611a95565b60068460098111156118a3576118a3614d4e565b036118d7576118b183612179565b60fc805461ffff92909216600160601b0261ffff60601b19909216919091179055611a95565b60078460098111156118eb576118eb614d4e565b03611925576118fb600284612f0d565b60fc805463ffffffff92909216600160701b0263ffffffff60701b19909216919091179055611a95565b600884600981111561193957611939614d4e565b03611a515760fd548310156119aa5760405162461bcd60e51b815260206004820152603160248201527f43616e277420736574206578706f737572654c696d6974206c657373207468616044820152706e20616374697665206578706f7375726560781b6064820152608401610835565b6119b2611578565b831115806119d157506119d15f5160206153d05f395f51905f52612f9d565b611a1d5760405162461bcd60e51b815260206004820152601d60248201527f496e637265617365207265717569726573204c4556454c315f524f4c450000006044820152606401610835565b611a275f84612f0d565b60fc805463ffffffff92909216600160901b0263ffffffff60901b19909216919091179055611a95565b6009846009811115611a6557611a65614d4e565b03611a9557611a738361308f565b60fc805461ffff92909216600160b01b0261ffff60b01b199092169190911790555b611acc846009811115611aaa57611aaa614d4e565b611ab5906008614d62565b602d811115611ac657611ac6614d4e565b846130f5565b50505050565b611ada61460e565b8115611bc2575f82815261012d602052604081208054909161ffff9091169003611b175760405163c4c1a0c560e01b815260040160405180910390fd5b6040805161014081018252825461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c083015263ffffffff600160701b8204811660e0840152600160901b820416610100830152600160b01b9004909116610120820152611bbb90613146565b9392505050565b6105ae611bed565b919050565b60fc545f9061159590600290600160701b900463ffffffff16612e63565b611bf561460e565b604080516101408101825260fc5461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c083015263ffffffff600160701b8204811660e0840152600160901b820416610100830152600160b01b900490911661012082015261159590613146565b7f0df0a8869cf58168a14cd7ac426ff1b8c6ff5d5c800c6f44803f3431dcb3bad17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d17573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3b9190614b2e565b6001600160a01b0316635ff57d203083335f6040518563ffffffff1660e01b8152600401611d6c9493929190614c3b565b5f6040518083038186803b158015611d82575f5ffd5b505afa158015611d94573d5f5f3e3d5ffd5b5050506001600160a01b0383169050611dc057604051634d1c286960e11b815260040160405180910390fd5b60fe80546001600160a01b0319166001600160a01b0384169081179091556109ea906012906130f5565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e47573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115959190614b2e565b5f6001600160e01b031982166301ffc9a760e01b14806105ae57506001600160e01b03198216634d15eb0360e01b1492915050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50415f5160206153d05f395f51905f527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f2b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4f9190614b2e565b6001600160a01b0316632b1cff1f3084843360016040518663ffffffff1660e01b8152600401611f83959493929190614b49565b5f6040518083038186803b158015611f99575f5ffd5b505afa158015611fab573d5f5f3e3d5ffd5b50505050611fb8836131d9565b505050565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611ff057611fb883613297565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561204a575060408051601f3d908101601f1916820190925261204791810190614d75565b60015b6120ad5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610835565b5f5160206153b05f395f51905f52811461211b5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610835565b50611fb8838383613332565b61212f613356565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f6105ae61218d655af3107a400084614da0565b61308f565b80546127106201000090910461ffff1611156121fc5760405162461bcd60e51b815260206004820152602360248201527f56616c69646174696f6e3a206a72436f6c6c526174696f206d757374206265206044820152623c3d3160e81b6064820152608401610835565b8054612710600160201b90910461ffff161180159061222657508054600160201b900461ffff1615155b61227c5760405162461bcd60e51b815260206004820152602160248201527f56616c69646174696f6e3a20636f6c6c526174696f206d757374206265203c3d6044820152603160f81b6064820152608401610835565b805461ffff6201000082048116600160201b9092041610156122ec5760405162461bcd60e51b8152602060048201526024808201527f56616c69646174696f6e3a20636f6c6c526174696f203e3d206a72436f6c6c526044820152636174696f60e01b6064820152608401610835565b8054619c4061ffff9091161180159061230e5750805461138861ffff90911610155b61235a5760405162461bcd60e51b815260206004820181905260248201527f56616c69646174696f6e3a206d6f63206d757374206265205b302e352c20345d6044820152606401610835565b8054612710600160301b90910461ffff1611156123c55760405162461bcd60e51b8152602060048201526024808201527f56616c69646174696f6e3a20656e7375726f5070466565206d757374206265206044820152633c3d203160e01b6064820152608401610835565b8054612710600160401b90910461ffff1611156124325760405162461bcd60e51b815260206004820152602560248201527f56616c69646174696f6e3a20656e7375726f436f63466565206d757374206265604482015264203c3d203160d81b6064820152608401610835565b8054612710600160601b90910461ffff16111561249f5760405162461bcd60e51b815260206004820152602560248201527f56616c69646174696f6e3a207372526f63206d757374206265203c3d20312028604482015264313030252960d81b6064820152608401610835565b8054612710600160501b90910461ffff16111561250c5760405162461bcd60e51b815260206004820152602560248201527f56616c69646174696f6e3a206a72526f63206d757374206265203c3d20312028604482015264313030252960d81b6064820152608401610835565b8054600160901b900463ffffffff161580159061253657508054600160701b900463ffffffff1615155b6108d05760405162461bcd60e51b815260206004820152602160248201527f4578706f7375726520616e64204d61785061796f7574206d757374206265203e6044820152600360fc1b6064820152608401610835565b5f54610100900460ff166125b25760405162461bcd60e51b815260040161083590614db3565b6125ba61339f565b611330878787878787876133d5565b60975460ff161561260f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610835565b565b428164ffffffffff16101561263957604051638727a7f960e01b815260040160405180910390fd5b6040516bffffffffffffffffffffffff193060601b166020820152603481018a905260548101899052607481018890526001600160d81b031960d888811b821660948401526099830188905260b9830187905283901b1660d98201525f906126b29060de016040516020818303038152906040526135d6565b90505f6126c0828686613610565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa15801561271e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127429190614b2e565b6001600160a01b0316635ff57d20307fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a845f6040518563ffffffff1660e01b81526004016127939493929190614c3b565b5f6040518083038186803b1580156127a9575f5ffd5b505afa1580156127bb573d5f5f3e3d5ffd5b505050505050505050505050505050565b6127d4614644565b6127f48989898987876127e68c612839565b6127ef8c611ad2565b613634565b8051604051878152919250907f3e4224c37ba48f27f735eecea98c4d71568b9825d0006b6e128aa73695e35f709060200160405180910390a298975050505050505050565b5f6105ae600160601b83614dfe565b612850614644565b5f198703612879576128768887876128706101a08e016101808f01614e11565b86612ef1565b96505b8787106128c85760405162461bcd60e51b815260206004820181905260248201527f5072656d69756d206d757374206265206c657373207468616e207061796f75746044820152606401610835565b64ffffffffff42166128e26101c08b016101a08c01614e11565b64ffffffffff161161292e5760405162461bcd60e51b815260206004820152601560248201527413db19081c1bdb1a58de481a5cc8195e1c1a5c9959605a1b6044820152606401610835565b6129406101c08a016101a08b01614e11565b64ffffffffff168564ffffffffff1610158015612961575088602001358810155b8015612971575088604001358710155b6129e35760405162461bcd60e51b815260206004820152603b60248201527f506f6c696379207265706c6163656d656e74206d75737420626520677265617460448201527f6572206f7220657175616c207468616e206f6c6420706f6c69637900000000006064820152608401610835565b60fc54600160b01b900461ffff16610e10612a066101a08c016101808d01614e11565b612a109088614e2a565b612a1a9190614e47565b64ffffffffff1610612a6e5760405162461bcd60e51b815260206004820152601b60248201527f506f6c6963792065786365656473206d6178206475726174696f6e00000000006044820152606401610835565b612a7c60408a013588614c28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612afc9190614b2e565b604051636eb1769f60e11b81526001600160a01b0387811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152919091169063dd62ed3e90604401602060405180830381865afa158015612b6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8e9190614d75565b1015612bac5760405162461bcd60e51b815260040161083590614e70565b6001600160a01b038416331480612ccc5750612bcc60408a013588614c28565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c4c9190614b2e565b6001600160a01b031663dd62ed3e86336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015612ca5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc99190614d75565b10155b612ce85760405162461bcd60e51b815260040161083590614ebd565b612cf0611bcf565b881115612d0f5760405162461bcd60e51b815260040161083590614f0c565b612d313083898b8a8a8f610180016020810190612d2c9190614e11565b613b4d565b905088602001358160200151612d479190614c28565b60fd5f828254612d579190614d62565b90915550612d65