@coti-io/coti-contracts-examples
Version:
Example smart contracts demonstrating the use of COTI's GC technology, including integrations with MPC, private ERC20, and ERC721 contracts.
845 lines • 104 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "OnChainDatabase",
"sourceName": "contracts/OnChainDatabase.sol",
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"indexed": false,
"internalType": "uint64",
"name": "value",
"type": "uint64"
}
],
"name": "clearUint",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"indexed": false,
"internalType": "ctBool",
"name": "value",
"type": "uint256"
}
],
"name": "encryptedBool",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "_from",
"type": "address"
},
{
"indexed": false,
"internalType": "ctUint64",
"name": "value",
"type": "uint256"
}
],
"name": "encryptedUint",
"type": "event"
},
{
"inputs": [],
"name": "ADDRESS_ALL",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "STRING_ALL",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "activePermissions",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "uint64",
"name": "value",
"type": "uint64"
}
],
"name": "add",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "operation",
"type": "string"
}
],
"name": "addAllowedOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "operation",
"type": "string"
}
],
"name": "addRestrictedOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "addressDefaultPermission",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"name": "allowedOperations",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "conditions",
"outputs": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "bool",
"name": "active",
"type": "bool"
},
{
"internalType": "bool",
"name": "falseKey",
"type": "bool"
},
{
"internalType": "bool",
"name": "trueKey",
"type": "bool"
},
{
"internalType": "uint256",
"name": "timestampBefore",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestampAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "uintParameter",
"type": "uint256"
},
{
"internalType": "address",
"name": "addressParameter",
"type": "address"
},
{
"internalType": "string",
"name": "stringParameter",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
}
],
"name": "decrypt",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getClearCotiUsdPrice",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getClearOilCotiPrice",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getClearOilUsdPrice",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "startIdx",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "chunkSize",
"type": "uint256"
}
],
"name": "getConditions",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "bool",
"name": "active",
"type": "bool"
},
{
"internalType": "bool",
"name": "falseKey",
"type": "bool"
},
{
"internalType": "bool",
"name": "trueKey",
"type": "bool"
},
{
"internalType": "uint256",
"name": "timestampBefore",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestampAfter",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "uintParameter",
"type": "uint256"
},
{
"internalType": "address",
"name": "addressParameter",
"type": "address"
},
{
"internalType": "string",
"name": "stringParameter",
"type": "string"
}
],
"internalType": "struct DataPrivacyFramework.Condition[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getConditionsCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
}
],
"name": "getItem",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getItems",
"outputs": [
{
"components": [
{
"internalType": "string",
"name": "key",
"type": "string"
},
{
"internalType": "address",
"name": "creator",
"type": "address"
},
{
"internalType": "uint256",
"name": "createTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lastAccessTimestamp",
"type": "uint256"
}
],
"internalType": "struct OnChainDatabase.DatabaseEntry[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "uint64",
"name": "value",
"type": "uint64"
}
],
"name": "greaterThan",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "uint256",
"name": "uintParameter",
"type": "uint256"
}
],
"name": "isOperationAllowed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
}
],
"name": "isOperationAllowed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "string",
"name": "stringParameter",
"type": "string"
}
],
"name": "isOperationAllowed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "address",
"name": "addressParameter",
"type": "address"
}
],
"name": "isOperationAllowed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "uint64",
"name": "value",
"type": "uint64"
}
],
"name": "lessThan",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "operationDefaultPermission",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"name": "permissions",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "operation",
"type": "string"
}
],
"name": "removeAllowedOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "operation",
"type": "string"
}
],
"name": "removeRestrictedOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"name": "restrictedOperations",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "defaultPermission",
"type": "bool"
}
],
"name": "setAddressDefaultPermission",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"components": [
{
"internalType": "ctUint64",
"name": "ciphertext",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct itUint64",
"name": "value",
"type": "tuple"
}
],
"name": "setItem",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "defaultPermission",
"type": "bool"
}
],
"name": "setOperationDefaultPermission",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "string",
"name": "operation",
"type": "string"
},
{
"internalType": "bool",
"name": "active",
"type": "bool"
},
{
"internalType": "uint256",
"name": "timestampBefore",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "timestampAfter",
"type": "uint256"
},
{
"internalType": "bool",
"name": "falseKey",
"type": "bool"
},
{
"internalType": "bool",
"name": "trueKey",
"type": "bool"
},
{
"internalType": "uint256",
"name": "uintParameter",
"type": "uint256"
},
{
"internalType": "address",
"name": "addressParameter",
"type": "address"
},
{
"internalType": "string",
"name": "stringParameter",
"type": "string"
}
],
"internalType": "struct DataPrivacyFramework.InputData",
"name": "inputData",
"type": "tuple"
}
],
"name": "setPermission",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "uint64",
"name": "value",
"type": "uint64"
}
],
"name": "subtract",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x608060405260016005553480156200001657600080fd5b506000805461ffff191681556040516430b236b4b760d91b815281908190819060019081906005019081526040805160209281900383018120805460ff1916941515949094179093556101408301815233835280518082018252600581526430b236b4b760d91b81840152828401526001838201526000606084018190526080840181905260a0840181905260c0840181905260e08401819052610100840181905281519283019091528152610120820152620000d39062000423565b506040805180820182526001808252601560f91b602083015291518291620000fb9162000a12565b9081526040805160209281900383018120805460ff19169415159490941790935561014083018152600180845281518083018352818152601560f91b8185015283850152838201526000606084018190526080840181905260a0840181905260c0840181905260e084018190526101008401819052815192830190915281526101208201526200018b9062000423565b505050505062000237604051806101400160405280336001600160a01b031681526020016040518060400160405280600b81526020016a6f705f7365745f6974656d60a81b815250815260200160011515815260200160008152602001600081526020016000151581526020016000151581526020016000815260200160006001600160a01b03168152602001604051806020016040528060008152508152506200042360201b60201c565b50620002df604051806101400160405280336001600160a01b031681526020016040518060400160405280600b81526020016a6f705f6765745f6974656d60a81b815250815260200160011515815260200160008152602001600081526020016000151581526020016000151581526020016000815260200160006001600160a01b03168152602001604051806020016040528060008152508152506200042360201b60201c565b506040516306cdb05b60e51b8152600160fa1b600482015242602482015260009060649063d9b60b60906044016020604051808303816000875af11580156200032c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000352919062000a43565b90506200038b6040518060400160405280600d81526020016c636f6e74726163745f6461746560981b815250826200081f60201b60201c565b60006200039960056200095d565b9050620003d36040518060400160405280600e81526020016d636f74695f7573645f707269636560901b815250826200081f60201b60201c565b6000620003e160646200095d565b90506200041a6040518060400160405280600d81526020016c6f696c5f7573645f707269636560981b815250826200081f60201b60201c565b50505062000c1a565b80516001600160a01b0316600090815260046020908152604080832091840151905162000451919062000a12565b9081526020016040518091039020546000036200068c5760055482516001600160a01b031660009081526004602090815260409182902090850151915190916200049b9162000a12565b908152602001604051809103902081905550604051806101600160405280600554815260200183600001516001600160a01b03168152602001836020015181526020018360400151151581526020018360a00151151581526020018360c001511515815260200183606001518152602001836080015181526020018360e0015181526020018361010001516001600160a01b031681526020018361012001518152506006600060055481526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506040820151816002019081620005a0919062000b02565b506060820151600382018054608085015160a086015161ffff1990921693151561ff0019169390931761010093151584021762ff00001916620100009115159190910217905560c0830151600483015560e0830151600583015582015160068201556101208201516007820180546001600160a01b0319166001600160a01b03909216919091179055610140820151600882019062000640908262000b02565b50905050600560008154620006559062000be4565b9091555081516001600160a01b031660009081526003602052604081208054909190620006829062000be4565b9091555062000817565b81516001600160a01b0316600090815260046020908152604080832091850151905160069284929091620006c1919062000a12565b9081526020016040518091039020548152602001908152602001600020905082604001518015620006f75750600381015460ff16155b156200072b5782516001600160a01b031660009081526003602052604081208054909190620007269062000be4565b909155505b8260400151158015620007425750600381015460ff165b15620007765782516001600160a01b031660009081526003602052604081208054909190620007719062000c00565b909155505b6040830151600382018054606086015160048501556080860151600585015560a086015160c087015161ffff1990921693151561ff0019169390931761010093151584021762ff00001916620100009115159190910217905560e084015160068301558301516007820180546001600160a01b0319166001600160a01b03909216919091179055610120830151600882019062000814908262000b02565b50505b506001919050565b60078260405162000831919062000a12565b9081526020016040518091039020546000036200092657604080516080810182528381523360208201524291810191909152600060608201819052600880546001810182559152815160049091027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301908190620008b0908262000b02565b5060208201516001820180546001600160a01b0319166001600160a01b0390921691909117905560408201516002820155606090910151600390910155600a8054906000620008ff8362000be4565b9190505560098360405162000915919062000a12565b908152604051908190036020019020555b60006200093382620009df565b90508060078460405162000948919062000a12565b90815260405190819003602001902055505050565b6040516306cdb05b60e51b8152600160fa1b60048201526001600160401b038216602482015260009060649063d9b60b60906044015b6020604051808303816000875af1158015620009b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009d9919062000a43565b92915050565b6040516362864e0160e11b8152600160fa1b60048201526024810182905260009060649063c50c9c029060440162000993565b6000825160005b8181101562000a35576020818601810151858301520162000a19565b506000920191825250919050565b60006020828403121562000a5657600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a8857607f821691505b60208210810362000aa957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000afd57600081815260208120601f850160051c8101602086101562000ad85750805b601f850160051c820191505b8181101562000af95782815560010162000ae4565b5050505b505050565b81516001600160401b0381111562000b1e5762000b1e62000a5d565b62000b368162000b2f845462000a73565b8462000aaf565b602080601f83116001811462000b6e576000841562000b555750858301515b600019600386901b1c1916600185901b17855562000af9565b600085815260208120601f198616915b8281101562000b9f5788860151825594840194600190910190840162000b7e565b508582101562000bbe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b60006001820162000bf95762000bf962000bce565b5060010190565b60008162000c125762000c1262000bce565b506000190190565b614dc98062000c2a6000396000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c8063a7804d651161012a578063efdcec9c116100bd578063f80ed2d11161008c578063fa1b3cac11610071578063fa1b3cac146104df578063fac66f01146104ff578063fb83bb731461051f57600080fd5b8063f80ed2d1146104b9578063f9529ee2146104cc57600080fd5b8063efdcec9c14610444578063f169952014610471578063f28b9f3414610479578063f55893641461048b57600080fd5b8063ba19094d116100f9578063ba19094d146103cf578063c6064b28146103e2578063c8d757fd146103f5578063d85661d31461043157600080fd5b8063a7804d6514610376578063ade0bee414610396578063b53fff00146103a9578063b6010fcd146103bc57600080fd5b806366195701116101a25780638b6bccf0116101715780638b6bccf0146103305780639359c28714610343578063a5fcf16214610356578063a74d34391461036357600080fd5b806366195701146102ec578063699d7c331461030257806381cf9ec31461031557806382dab96e1461031d57600080fd5b8063372db089116101de578063372db0891461029e578063410d59cc146102b1578063476a95ad146102c657806365c58152146102d957600080fd5b80630c58ea56146102105780631680d2691461021a57806326c500071461022d57806334906a4a14610260575b600080fd5b610218610532565b005b6102186102283660046141a6565b61085a565b61024061023b366004614205565b610924565b6040516102579b9a9998979695949392919061426e565b60405180910390f35b61028e61026e3660046143ca565b805160208183018101805160018252928201919093012091525460ff1681565b6040519015158152602001610257565b61028e6102ac36600461441b565b610aa7565b6102b9610ad2565b6040516102579190614475565b61028e6102d4366004614525565b610bf0565b61028e6102e73660046143ca565b610c62565b6102f4610d34565b604051908152602001610257565b61028e610310366004614542565b610d4a565b610218610d74565b61028e61032b366004614595565b61137a565b61021861033e3660046141a6565b611776565b61028e6103513660046143ca565b6117f9565b60005461028e9060ff1681565b61028e61037136600461469f565b61187c565b6102f4610384366004614720565b60036020526000908152604090205481565b61028e6103a4366004614525565b6118cf565b6102186103b736600461473b565b611951565b6102186103ca3660046143ca565b611bb9565b6102186103dd3660046141a6565b611e69565b61028e6103f03660046147a6565b611f27565b6102f461040336600461480b565b6004602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b61021861043f3660046141a6565b611f49565b610464604051806040016040528060018152602001601560f91b81525081565b6040516102579190614859565b610218611fcc565b60005461028e90610100900460ff1681565b61028e6104993660046143ca565b805160208183018101805160028252928201919093012091525460ff1681565b6102186104c736600461486c565b61227a565b61028e6104da36600461486c565b612334565b6104e7600181565b6040516001600160a01b039091168152602001610257565b61051261050d3660046148ae565b6123e5565b60405161025791906148d0565b61028e61052d36600461486c565b612817565b6040518060400160405280601a81526020017f6f705f6765745f636c6561725f6f696c5f7573645f707269636500000000000081525060008060405180602001604052806000815250826000146106375760405163372db08960e01b8152309063372db089906105aa903390889088906004016149d1565b602060405180830381865afa1580156105c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105eb9190614a03565b6106325760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b60448201526064015b60405180910390fd5b610777565b6001600160a01b0382161561066d576040516318c0c96560e31b8152309063c6064b28906105aa90339088908790600401614a20565b604080516000815260208101808352815190209161068d91849101614a56565b60405160208183030381529060405280519060200120146106cf5760405163a74d343960e01b8152309063a74d3439906105aa90339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c33906106f49033908890600401614aa6565b602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190614a03565b6107775760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b60006107b2600760405161079e906c6f696c5f7573645f707269636560981b8152600d0190565b90815260200160405180910390205461289e565b905042600860096040516107d9906c6f696c5f7573645f707269636560981b8152600d0190565b908152602001604051809103902054815481106107f8576107f8614ac8565b6000918252602090912060036004909202010155337f394b5d00bc18dc8b032bed0087bce3cbe009ef65b007769fa4d9d3d31927b6206108378361293b565b60405167ffffffffffffffff909116815260200160405180910390a25050505050565b60006108716007858560405161079e929190614ade565b905042600860098686604051610888929190614ade565b908152602001604051809103902054815481106108a7576108a7614ac8565b90600052602060002090600402016003018190555060006108c78361294b565b905060006108e36108dd84846000808b8b6129bb565b33612c3b565b60405181815290915033907ffa53b3e7b29e2b9515c6b94cbd1d08a18394415d736aea20abee01980d834145906020015b60405180910390a2505050505050565b60066020526000908152604090208054600182015460028301805492936001600160a01b039092169261095690614aee565b80601f016020809104026020016040519081016040528092919081815260200182805461098290614aee565b80156109cf5780601f106109a4576101008083540402835291602001916109cf565b820191906000526020600020905b8154815290600101906020018083116109b257829003601f168201915b5050505060038301546004840154600585015460068601546007870154600888018054979860ff808816996101008904821699506201000090980416966001600160a01b0390931692909190610a2490614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5090614aee565b8015610a9d5780601f10610a7257610100808354040283529160200191610a9d565b820191906000526020600020905b815481529060010190602001808311610a8057829003601f168201915b505050505090508b565b6000610ac9858585600186600060405180602001604052806000815250612cfd565b95945050505050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610be75783829060005260206000209060040201604051806080016040529081600082018054610b2990614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5590614aee565b8015610ba25780601f10610b7757610100808354040283529160200191610ba2565b820191906000526020600020905b815481529060010190602001808311610b8557829003601f168201915b50505091835250506001828101546001600160a01b03166020808401919091526002840154604084015260039093015460609092019190915291835292019101610af6565b50505050905090565b6000805482151560ff909116151503610c4b5760405162461bcd60e51b815260206004820152601e60248201527f4450463a20494e56414c49445f5045524d495353494f4e5f4348414e474500006044820152606401610629565b506000805460ff1916911515919091179055600190565b6000600282604051610c749190614a56565b9081526040519081900360200190205460ff1615610cfa5760405162461bcd60e51b815260206004820152602160248201527f4450463a204f5045524154494f4e5f414c52454144595f52455354524943544560448201527f44000000000000000000000000000000000000000000000000000000000000006064820152608401610629565b6001600283604051610d0c9190614a56565b908152604051908190036020019020805491151560ff19909216919091179055506001919050565b60006001600554610d459190614b3e565b905090565b6000610d6c848484600080600060405180602001604052806000815250612cfd565b949350505050565b6040518060400160405280601a81526020017f6f705f6765745f636c6561725f6f696c5f7573645f70726963650000000000008152506000806040518060200160405280600081525082600014610e745760405163372db08960e01b8152309063372db08990610dec903390889088906004016149d1565b602060405180830381865afa158015610e09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2d9190614a03565b610e6f5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b610fb4565b6001600160a01b03821615610eaa576040516318c0c96560e31b8152309063c6064b2890610dec90339088908790600401614a20565b6040805160008152602081018083528151902091610eca91849101614a56565b6040516020818303038152906040528051906020012014610f0c5760405163a74d343960e01b8152309063a74d343990610dec90339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c3390610f319033908890600401614aa6565b602060405180830381865afa158015610f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f729190614a03565b610fb45760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b6040518060400160405280601b81526020017f6f705f6765745f636c6561725f636f74695f7573645f7072696365000000000081525060008060405180602001604052806000815250826000146110b45760405163372db08960e01b8152309063372db0899061102c903390889088906004016149d1565b602060405180830381865afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190614a03565b6110af5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b6111f4565b6001600160a01b038216156110ea576040516318c0c96560e31b8152309063c6064b289061102c90339088908790600401614a20565b604080516000815260208101808352815190209161110a91849101614a56565b604051602081830303815290604052805190602001201461114c5760405163a74d343960e01b8152309063a74d34399061102c90339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c33906111719033908890600401614aa6565b602060405180830381865afa15801561118e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b29190614a03565b6111f45760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b600061121b600760405161079e906c6f696c5f7573645f707269636560981b8152600d0190565b90506000611254600760405161079e907f636f74695f7573645f70726963650000000000000000000000000000000000008152600e0190565b9050426008600960405161127b906c6f696c5f7573645f707269636560981b8152600d0190565b9081526020016040518091039020548154811061129a5761129a614ac8565b90600052602060002090600402016003018190555042600860096040516112e4907f636f74695f7573645f70726963650000000000000000000000000000000000008152600e0190565b9081526020016040518091039020548154811061130357611303614ac8565b906000526020600020906004020160030181905550600061132483836132b5565b9050337f394b5d00bc18dc8b032bed0087bce3cbe009ef65b007769fa4d9d3d31927b6206113518361293b565b60405167ffffffffffffffff909116815260200160405180910390a25050505050505050505050565b80516001600160a01b031660009081526004602090815260408083209184015190516113a69190614a56565b9081526020016040518091039020546000036115e25760055482516001600160a01b031660009081526004602090815260409182902090850151915190916113ed91614a56565b908152602001604051809103902081905550604051806101600160405280600554815260200183600001516001600160a01b03168152602001836020015181526020018360400151151581526020018360a00151151581526020018360c001511515815260200183606001518152602001836080015181526020018360e0015181526020018361010001516001600160a01b031681526020018361012001518152506006600060055481526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020190816114f09190614ba0565b506060820151600382018054608085015160a086015161ffff1990921693151561ff0019169390931761010093151584021762ff00001916620100009115159190910217905560c0830151600483015560e08301516005830155820151600682015561012082015160078201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055610140820151600882019061159b9082614ba0565b509050506005600081546115ae90614c60565b9091555081516001600160a01b0316600090815260036020526040812080549091906115d990614c60565b9091555061176e565b81516001600160a01b03166000908152600460209081526040808320918501519051600692849290916116159190614a56565b908152602001604051809103902054815260200190815260200160002090508260400151801561164a5750600381015460ff16155b1561167b5782516001600160a01b03166000908152600360205260408120805490919061167690614c60565b909155505b82604001511580156116915750600381015460ff165b156116c25782516001600160a01b0316600090815260036020526040812080549091906116bd90614c7a565b909155505b6040830151600382018054606086015160048501556080860151600585015560a086015160c087015161ffff1990921693151561ff0019169390931761010093151584021762ff00001916620100009115159190910217905560e0840151600683015583015160078201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055610120830151600882019061176b9082614ba0565b50505b506001919050565b600061178d6007858560405161079e929190614ade565b9050426008600986866040516117a4929190614ade565b908152602001604051809103902054815481106117c3576117c3614ac8565b90600052602060002090600402016003018190555060006117e38361294b565b905060006108e36108dd84846000808b8b613335565b600060018260405161180b9190614a56565b9081526040519081900360200190205460ff161561186b5760405162461bcd60e51b815260206004820152601e60248201527f4450463a204f5045524154494f4e5f414c52454144595f414c4c4f57454400006044820152606401610629565b60018083604051610d0c9190614a56565b60006118c5868686600360008089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612cfd92505050565b9695505050505050565b6000811515600060019054906101000a900460ff161515036119335760405162461bcd60e51b815260206004820152601e60248201527f4450463a20494e56414c49445f5045524d495353494f4e5f4348414e474500006044820152606401610629565b50600080549115156101000261ff0019909216919091179055600190565b6040518060400160405280600b81526020017f6f705f7365745f6974656d0000000000000000000000000000000000000000008152506000806040518060200160405280600081525082600014611a515760405163372db08960e01b8152309063372db089906119c9903390889088906004016149d1565b602060405180830381865afa1580156119e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0a9190614a03565b611a4c5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b611b91565b6001600160a01b03821615611a87576040516318c0c96560e31b8152309063c6064b28906119c990339088908790600401614a20565b6040805160008152602081018083528151902091611aa791849101614a56565b6040516020818303038152906040528051906020012014611ae95760405163a74d343960e01b8152309063a74d3439906119c990339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c3390611b0e9033908890600401614aa6565b602060405180830381865afa158015611b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4f9190614a03565b611b915760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b6000611ba4611b9f87614c91565b6135a6565b9050611bb0878261360f565b50505050505050565b60408051808201909152600b81527f6f705f6765745f6974656d000000000000000000000000000000000000000000602082015260008083611c7e565b602060405180830381865afa158015611c13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c379190614a03565b611c795760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b611dbe565b6001600160a01b03821615611cb4576040516318c0c96560e31b8152309063c6064b2890611bf690339088908790600401614a20565b6040805160008152602081018083528151902091611cd491849101614a56565b6040516020818303038152906040528051906020012014611d165760405163a74d343960e01b8152309063a74d343990611bf690339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c3390611d3b9033908890600401614aa6565b602060405180830381865afa158015611d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7c9190614a03565b611dbe5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b6000611dd360078760405161079e9190614a56565b9050426008600988604051611de89190614a56565b90815260200160405180910390205481548110611e0757611e07614ac8565b9060005260206000209060040201600301819055506000611e28823361374d565b60405181815290915033907fe170b38a9363c69461373809ba020956f24621e94965682736aa2f236c17717c9060200160405180910390a250505050505050565b6000611e806007858560405161079e929190614ade565b905042600860098686604051611e97929190614ade565b90815260200160405180910390205481548110611eb657611eb6614ac8565b9060005260206000209060040201600301819055506000611ed68361294b565b90506000611ef2611eec84846000808b8b61375d565b3361374d565b60405181815290915033907fe170b38a9363c69461373809ba020956f24621e94965682736aa2f236c17717c90602001610914565b6000610ac9858585600260008760405180602001604052806000815250612cfd565b6000611f606007858560405161079e929190614ade565b905042600860098686604051611f77929190614ade565b90815260200160405180910390205481548110611f9657611f96614ac8565b9060005260206000209060040201600301819055506000611fb68361294b565b90506000611ef2611eec84846000808b8b6139ce565b6040518060400160405280601b81526020017f6f705f6765745f636c6561725f636f74695f7573645f7072696365000000000081525060008060405180602001604052806000815250826000146120cc5760405163372db08960e01b8152309063372db08990612044903390889088906004016149d1565b602060405180830381865afa158015612061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120859190614a03565b6120c75760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b61220c565b6001600160a01b03821615612102576040516318c0c96560e31b8152309063c6064b289061204490339088908790600401614a20565b604080516000815260208101808352815190209161212291849101614a56565b60405160208183030381529060405280519060200120146121645760405163a74d343960e01b8152309063a74d34399061204490339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c33906121899033908890600401614aa6565b602060405180830381865afa1580156121a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ca9190614a03565b61220c5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b6000612243600760405161079e907f636f74695f7573645f70726963650000000000000000000000000000000000008152600e0190565b905042600860096040516107d9907f636f74695f7573645f70726963650000000000000000000000000000000000008152600e0190565b60006122916007848460405161079e929190614ade565b9050426008600985856040516122a8929190614ade565b908152602001604051809103902054815481106122c7576122c7614ac8565b90600052602060002090600402016003018190555060006122ec826000808787613c3f565b60405167ffffffffffffffff8216815290915033907f394b5d00bc18dc8b032bed0087bce3cbe009ef65b007769fa4d9d3d31927b6209060200160405180910390a250505050565b600060018383604051612348929190614ade565b9081526040519081900360200190205460ff166123a75760405162461bcd60e51b815260206004820152601a60248201527f4450463a204f5045524154494f4e5f4e4f545f414c4c4f5745440000000000006044820152606401610629565b6000600184846040516123bb929190614ade565b908152604051908190036020019020805491151560ff199092169190911790555060015b92915050565b6060600083116124375760405162461bcd60e51b815260206004820152601360248201527f4450463a2053544152545f4944585f5a45524f000000000000000000000000006044820152606401610629565b600082116124875760405162461bcd60e51b815260206004820152601460248201527f4450463a204348554e4b5f53495a455f5a45524f0000000000000000000000006044820152606401610629565b6005548310612519576040805160008082526020820190925290612511565b604080516101608101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201526101408101919091528152602001906001900390816124a65790505b5090506123df565b6000600160055461252a9190614b3e565b60016125368587614d10565b6125409190614b3e565b111561255957836005546125549190614b3e565b61255b565b825b905060008167ffffffffffffffff811115612578576125786142f4565b60405190808252806020026020018201604052801561260157816020015b604080516101608101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201526101408101919091528152602001906001900390816125965790505b50905060005b8281101561280e576006600061261d8389614d10565b815260208082019290925260409081016000208151610160810183528154815260018201546001600160a01b031693810193909352600281018054919284019161266690614aee565b80601f016020809104026020016040519081016040528092919081815260200182805461269290614aee565b80156126df5780601f106126b4576101008083540402835291602001916126df565b820191906000526020600020905b8154815290600101906020018083116126c257829003601f168201915b5050509183525050600382015460ff8082161515602084015261010080830482161515604085015262010000909204161515606083015260048301546080830152600583015460a0830152600683015460c083015260078301546001600160a01b031660e083015260088301805491909201919061275c90614aee565b80601f016020809104026020016040519081016040528092919081815260200182805461278890614aee565b80156127d55780601f106127aa576101008083540402835291602001916127d5565b820191906000526020600020905b8154815290600101906020018083116127b857829003601f168201915b5050505050815250508282815181106127f0576127f0614ac8565b6020026020010181905250808061280690614c60565b915050612607565b50949350505050565b60006002838360405161282b929190614ade565b9081526040519081900360200190205460ff1661288a5760405162461bcd60e51b815260206004820152601d60248201527f4450463a204f5045524154494f4e5f4e4f545f524553545249435445440000006044820152606401610629565b6000600284846040516123bb929190614ade565b6000606463d2c135e560045b60f81b846040518363ffffffff1660e01b81526004016128f89291907fff00000000000000000000000000000000000000000000000000000000000000929092168252602082015260400190565b6020604051808303816000875af1158015612917573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123df9190614d39565b60006064630cfed56160046128aa565b6040517fd9b60b600000000000000000000000000000000000000000000000000000000081527f0400000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff8216602482015260009060649063d9b60b60906044016128f8565b60006040518060400160405280600581526020017f6f705f6c74000000000000000000000000000000000000000000000000000000815250858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505084159150612ae290505760405163372db08960e01b8152309063372db08990612a5a903390889088906004016149d1565b602060405180830381865afa158015612a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9b9190614a03565b612add5760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b612c22565b6001600160a01b03821615612b18576040516318c0c96560e31b8152309063c6064b2890612a5a90339088908790600401614a20565b6040805160008152602081018083528151902091612b3891849101614a56565b6040516020818303038152906040528051906020012014612b7a5760405163a74d343960e01b8152309063a74d343990612a5a90339088908690600401614a72565b60405163699d7c3360e01b8152309063699d7c3390612b9f9033908890600401614aa6565b602060405180830381865afa158015612bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612be09190614a03565b612c225760405162461bcd60e51b81526020600482015260136024820152724450463a204e6f205065726d697373696f6e2160681b6044820152606401610629565b612c2c8b8b613ebd565b9b9a5050505050505050505050565b60006064633c6f0e68825b60f81b8585604051602001612c86919060609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612cb393929190614d52565b6020604051808303816000875af1158015612cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf69190614d39565b9392505050565b600060028787604051612d11929190614ade565b9081526040519081900360200190205460ff1615612d31575060006132aa565b6040805180820182526001808252601560f91b60208301529151612d559190614a56565b9081526040519081900360200190205460ff16158015612d97575060018787604051612d82929190614ade565b9081526040519081900360200190205460ff16155b15612da4575060006132aa565b6001600160a01b03881660009081526004602052604080822090516006929190612dd1908b908b90614ade565b908152604080516020928190038301902054835290820192909252016000206003015460ff1615613027576001600160a01b0388166000908152600460205260408082209051613020926006929091612e2d908c908c90614ade565b908152602001604051809103902054815260200190815260200160002060405180610160016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282018054612e9f90614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054612ecb90614aee565b8015612f185780601f10612eed57610100808354040283529160200191612f18565b820191906000526020600020905b815481529060010190602001808311612efb57829003601f168201915b5050509183525050600382015460ff8082161515602084015261010080830482161515604085015262010000909204161515606083015260048301546080830152600583015460a0830152600683015460c083015260078301546001600160a01b031660e0830152600883018054919092019190612f9590614aee565b80601f0160208091040260200160405190810160405280929190818152602001828054612fc190614aee565b801561300e5780601f10612fe35761010080835404028352916020019161300e565b820191906000526020600020905b815481529060010190602001808311612ff157829003601f168201915b50505050508152505086868686613ed2565b90506132aa565b6001600160a01b03881660009081526004602090815260408083208151808301835260018152601560f91b9381019390935290516006939261306891614a56565b908152604080516020928190038301902054835290820192909252016000206003015460ff16156130e65761302060066000600460008c6001600160a01b03166001600160a01b03168152602001908152602001600020604051806040016040528060018152602001601560f91b815250604051612e2d9190614a56565b6001600160a01b038816600090815260036020526040902054156131155750600054610100900460ff166132aa565b600160009081526004602052604051600691907fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe0590613157908b908b90614ade565b908152604080516020928190038301902054835290820192909252016000206003