UNPKG

@gnosis.pm/hg-contracts

Version:

Collection of smart contracts for the Gnosis prediction market platform

631 lines 1.88 MB
{ "contractName": "PredictionMarketSystem", "abi": [ { "constant": true, "inputs": [ { "name": "owner", "type": "address" }, { "name": "id", "type": "uint256" } ], "name": "balanceOf", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "bytes32" }, { "name": "", "type": "uint256" } ], "name": "payoutNumerators", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "ids", "type": "uint256[]" }, { "name": "values", "type": "uint256[]" }, { "name": "data", "type": "bytes" } ], "name": "safeBatchTransferFrom", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "owners", "type": "address[]" }, { "name": "ids", "type": "uint256[]" } ], "name": "balanceOfBatch", "outputs": [ { "name": "", "type": "uint256[]" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "operator", "type": "address" }, { "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "bytes32" } ], "name": "payoutDenominator", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "owner", "type": "address" }, { "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "from", "type": "address" }, { "name": "to", "type": "address" }, { "name": "id", "type": "uint256" }, { "name": "value", "type": "uint256" }, { "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "conditionId", "type": "bytes32" }, { "indexed": true, "name": "oracle", "type": "address" }, { "indexed": true, "name": "questionId", "type": "bytes32" }, { "indexed": false, "name": "outcomeSlotCount", "type": "uint256" } ], "name": "ConditionPreparation", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "conditionId", "type": "bytes32" }, { "indexed": true, "name": "oracle", "type": "address" }, { "indexed": true, "name": "questionId", "type": "bytes32" }, { "indexed": false, "name": "outcomeSlotCount", "type": "uint256" }, { "indexed": false, "name": "payoutNumerators", "type": "uint256[]" } ], "name": "ConditionResolution", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "stakeholder", "type": "address" }, { "indexed": false, "name": "collateralToken", "type": "address" }, { "indexed": true, "name": "parentCollectionId", "type": "bytes32" }, { "indexed": true, "name": "conditionId", "type": "bytes32" }, { "indexed": false, "name": "partition", "type": "uint256[]" }, { "indexed": false, "name": "amount", "type": "uint256" } ], "name": "PositionSplit", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "stakeholder", "type": "address" }, { "indexed": false, "name": "collateralToken", "type": "address" }, { "indexed": true, "name": "parentCollectionId", "type": "bytes32" }, { "indexed": true, "name": "conditionId", "type": "bytes32" }, { "indexed": false, "name": "partition", "type": "uint256[]" }, { "indexed": false, "name": "amount", "type": "uint256" } ], "name": "PositionsMerge", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "redeemer", "type": "address" }, { "indexed": true, "name": "collateralToken", "type": "address" }, { "indexed": true, "name": "parentCollectionId", "type": "bytes32" }, { "indexed": false, "name": "conditionId", "type": "bytes32" }, { "indexed": false, "name": "indexSets", "type": "uint256[]" }, { "indexed": false, "name": "payout", "type": "uint256" } ], "name": "PayoutRedemption", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "operator", "type": "address" }, { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "id", "type": "uint256" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "TransferSingle", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "operator", "type": "address" }, { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "ids", "type": "uint256[]" }, { "indexed": false, "name": "values", "type": "uint256[]" } ], "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "owner", "type": "address" }, { "indexed": true, "name": "operator", "type": "address" }, { "indexed": false, "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "value", "type": "string" }, { "indexed": true, "name": "id", "type": "uint256" } ], "name": "URI", "type": "event" }, { "constant": false, "inputs": [ { "name": "oracle", "type": "address" }, { "name": "questionId", "type": "bytes32" }, { "name": "outcomeSlotCount", "type": "uint256" } ], "name": "prepareCondition", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "questionId", "type": "bytes32" }, { "name": "result", "type": "bytes" } ], "name": "receiveResult", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "collateralToken", "type": "address" }, { "name": "parentCollectionId", "type": "bytes32" }, { "name": "conditionId", "type": "bytes32" }, { "name": "partition", "type": "uint256[]" }, { "name": "amount", "type": "uint256" } ], "name": "splitPosition", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "collateralToken", "type": "address" }, { "name": "parentCollectionId", "type": "bytes32" }, { "name": "conditionId", "type": "bytes32" }, { "name": "partition", "type": "uint256[]" }, { "name": "amount", "type": "uint256" } ], "name": "mergePositions", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "collateralToken", "type": "address" }, { "name": "parentCollectionId", "type": "bytes32" }, { "name": "conditionId", "type": "bytes32" }, { "name": "indexSets", "type": "uint256[]" } ], "name": "redeemPositions", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "conditionId", "type": "bytes32" } ], "name": "getOutcomeSlotCount", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "bytecode": "0x6080604052620000416301ffc9a77c010000000000000000000000000000000000000000000000000000000002620001d8640100000000026401000000009004565b620001d2600073ffffffffffffffffffffffffffffffffffffffff1663e985e9c590507c010000000000000000000000000000000000000000000000000000000002600073ffffffffffffffffffffffffffffffffffffffff1663a22cb46590507c010000000000000000000000000000000000000000000000000000000002600073ffffffffffffffffffffffffffffffffffffffff16634e1273f490507c010000000000000000000000000000000000000000000000000000000002600073ffffffffffffffffffffffffffffffffffffffff1662fdd58e90507c010000000000000000000000000000000000000000000000000000000002600073ffffffffffffffffffffffffffffffffffffffff16632eb2c2d690507c010000000000000000000000000000000000000000000000000000000002600073ffffffffffffffffffffffffffffffffffffffff1663f242432a90507c0100000000000000000000000000000000000000000000000000000000021818181818620001d8640100000000026401000000009004565b620002ff565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415151562000293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b615258806200030f6000396000f3fe6080604052600436106100d4576000357c010000000000000000000000000000000000000000000000000000000090048062fdd58e146100d957806301b7037c1461014857806301ffc9a7146102025780630504c814146102745780632eb2c2d6146102cd5780634e1273f41461043d5780635dd80855146105eb57806372ce42751461067b5780639e7212ad1461073f578063a22cb46514610803578063d42dc0c214610860578063d96ee754146108af578063dd34de6714610914578063e985e9c514610963578063f242432a146109ec575b600080fd5b3480156100e557600080fd5b50610132600480360360408110156100fc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610ac6565b6040518082815260200191505060405180910390f35b34801561015457600080fd5b506102006004803603608081101561016b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156101bc57600080fd5b8201836020820111156101ce57600080fd5b803590602001918460208302840111640100000000831117156101f057600080fd5b9091929391929390505050610beb565b005b34801561020e57600080fd5b5061025a6004803603602081101561022557600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611233565b604051808215151515815260200191505060405180910390f35b34801561028057600080fd5b506102b76004803603604081101561029757600080fd5b81019080803590602001909291908035906020019092919050505061129a565b6040518082815260200191505060405180910390f35b3480156102d957600080fd5b5061043b600480360360a08110156102f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561034d57600080fd5b82018360208201111561035f57600080fd5b8035906020019184602083028401116401000000008311171561038157600080fd5b9091929391929390803590602001906401000000008111156103a257600080fd5b8201836020820111156103b457600080fd5b803590602001918460208302840111640100000000831117156103d657600080fd5b9091929391929390803590602001906401000000008111156103f757600080fd5b82018360208201111561040957600080fd5b8035906020019184600183028401116401000000008311171561042b57600080fd5b90919293919293905050506112ca565b005b34801561044957600080fd5b506105946004803603604081101561046057600080fd5b810190808035906020019064010000000081111561047d57600080fd5b82018360208201111561048f57600080fd5b803590602001918460208302840111640100000000831117156104b157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561051157600080fd5b82018360208201111561052357600080fd5b8035906020019184602083028401116401000000008311171561054557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611918565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105d75780820151818401526020810190506105bc565b505050509050019250505060405180910390f35b3480156105f757600080fd5b506106796004803603604081101561060e57600080fd5b81019080803590602001909291908035906020019064010000000081111561063557600080fd5b82018360208201111561064757600080fd5b8035906020019184600183028401116401000000008311171561066957600080fd5b9091929391929390505050611b90565b005b34801561068757600080fd5b5061073d600480360360a081101561069e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156106ef57600080fd5b82018360208201111561070157600080fd5b8035906020019184602083028401116401000000008311171561072357600080fd5b90919293919293908035906020019092919050505061211f565b005b34801561074b57600080fd5b50610801600480360360a081101561076257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460208302840111640100000000831117156107e757600080fd5b90919293919293908035906020019092919050505061272d565b005b34801561080f57600080fd5b5061085e6004803603604081101561082657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612cf2565b005b34801561086c57600080fd5b506108996004803603602081101561088357600080fd5b8101908080359060200190929190505050612df3565b6040518082815260200191505060405180910390f35b3480156108bb57600080fd5b50610912600480360360608110156108d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050612e13565b005b34801561092057600080fd5b5061094d6004803603602081101561093757600080fd5b81019080803590602001909291905050506130b6565b6040518082815260200191505060405180910390f35b34801561096f57600080fd5b506109d26004803603604081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506130ce565b604051808215151515815260200191505060405180910390f35b3480156109f857600080fd5b50610ac4600480360360a0811015610a0f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190640100000000811115610a8057600080fd5b820183602082011115610a9257600080fd5b80359060200191846001830284011164010000000083111715610ab457600080fd5b9091929391929390505050613162565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f455243313135353a2062616c616e636520717565727920666f7220746865207a81526020017f65726f206164647265737300000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006004600085815260200190815260200160002054111515610c9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f726573756c7420666f7220636f6e646974696f6e206e6f74207265636569766581526020017f642079657400000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600060036000858152602001908152602001600020805490509050600081111515610d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f636f6e646974696f6e206e6f742070726570617265642079657400000000000081525060200191505060405180910390fd5b600080905060008060018460019060020a0203905060008090505b86869050811015610f625760008787838181101515610d6557fe5b905060200201359050600081118015610d7d57508281105b1515610df1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f676f7420696e76616c696420696e64657820736574000000000000000000000081525060200191505060405180910390fd5b8a610dfd8b8b846135da565b604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200192505050604051602081830303815290604052805190602001209350600080905060008090505b87811015610eda5760008160019060020a028416141515610ecd57610eca600360008d815260200190815260200160002082815481101515610eb057fe5b90600052602060002001548361362190919063ffffffff16565b91505b8080600101915050610e72565b506000610eeb338760019004610ac6565b90506000811115610f5257610f40610f31600460008e815260200190815260200160002054610f2385856136ab90919063ffffffff16565b61377890919063ffffffff16565b8861362190919063ffffffff16565b9650610f513387600190048361380b565b5b5050508080600101915050610d4a565b5060008311156111835760006001028814156110f5578873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561101b57600080fd5b505af115801561102f573d6000803e3d6000fd5b505050506040513d602081101561104557600080fd5b810190808051906020019092919050505015156110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f636f756c64206e6f74207472616e73666572207061796f757420746f206d657381526020017f736167652073656e64657200000000000000000000000000000000000000000081525060400191505060405180910390fd5b611182565b8888604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120915061118133836001900485602060405190810160405280600081525061394c565b5b5b878973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2682012a4a4f1973119f1c9b90745d1bd91fa2bab387344f044cb3586864d18d8a8a8a8960405180858152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a4505050505050505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6003602052816000526040600020818154811015156112b557fe5b90600052602060002001600091509150505481565b838390508686905014151561136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f455243313135353a2049447320616e642076616c756573206d7573742068617681526020017f652073616d65206c656e6774687300000000000000000000000000000000000081525060400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614151515611438576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f455243313135353a207461726765742061646472657373206d7573742062652081526020017f6e6f6e2d7a65726f00000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614806114ff575060011515600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b1515611599576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f455243313135353a206e656564206f70657261746f7220617070726f76616c2081526020017f666f7220337264207061727479207472616e73666572732e000000000000000081525060400191505060405180910390fd5b60008090505b8686905081101561175757600087878381811015156115ba57fe5b905060200201359050600086868481811015156115d357fe5b90506020020135905061163f816001600085815260200190815260200160002060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6890919063ffffffff16565b6001600084815260200190815260200160002060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506116f66001600084815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548261362190919063ffffffff16565b6001600084815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505080600101905061159f565b508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040518080602001806020018381038352878782818152602001925060200280828437600081840152601f19601f8201169050808301925050508381038252858582818152602001925060200280828437600081840152601f19601f820116905080830192505050965050505050505060405180910390a461190e338989898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050888880806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613bf3565b5050505050505050565b6060815183511415156119b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001807f455243313135353a206f776e65727320616e6420494473206d7573742068617681526020017f652073616d65206c656e6774687300000000000000000000000000000000000081525060400191505060405180910390fd5b606083516040519080825280602002602001820160405280156119eb5781602001602082028038833980820191505090505b50905060008090505b8451811015611b8557600073ffffffffffffffffffffffffffffffffffffffff168582815181101515611a2357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614151515611adf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001807f455243313135353a20736f6d65206164647265737320696e206261746368206281526020017f616c616e6365207175657279206973207a65726f00000000000000000000000081525060400191505060405180910390fd5b600160008583815181101515611af157fe5b90602001906020020151815260200190815260200160002060008683815181101515611b1957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548282815181101515611b6c57fe5b90602001906020020181815250508060010190506119f4565b508091505092915050565b600082829050111515611c0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f726573756c747320656d7074790000000000000000000000000000000000000081525060200191505060405180910390fd5b6000602083839050811515611c1c57fe5b06141515611c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f726573756c7473206e6f742033322d6279746520616c69676e6564000000000081525060200191505060405180910390fd5b6000602083839050811515611ca357fe5b0490506101008111151515611d20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f746f6f206d616e79206f7574636f6d6520736c6f74730000000000000000000081525060200191505060405180910390fd5b6000338583604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019350505050604051602081830303815290604052805190602001209050816003600083815260200190815260200160002080549050141515611e23576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6e756d626572206f66206f7574636f6d6573206d69736d61746368000000000081525060200191505060405180910390fd5b60006004600083815260200190815260200160002054141515611eae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f7061796f75742064656e6f6d696e61746f7220616c726561647920736574000081525060200191505060405180910390fd5b60008090505b82811015611fe457600081602002606401359050611eee81600460008681526020019081526020016000205461362190919063ffffffff16565b600460008581526020019081526020016000208190555060006003600085815260200190815260200160002083815481101515611f2757fe5b9060005260206000200154141515611fa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f7061796f7574206e756d657261746f7220616c7265616479207365740000000081525060200191505060405180910390fd5b806003600085815260200190815260200160002083815481101515611fc857fe5b9060005260206000200181905550508080600101915050611eb4565b5060006004600083815260200190815260200160002054111515612070576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f7061796f757420697320616c6c207a65726f657300000000000000000000000081525060200191505060405180910390fd5b843373ffffffffffffffffffffffffffffffffffffffff16827fb44d84d3289691f71497564b85d4233648d9dbae8cbdbb4329f301c3a018589485600360008781526020019081526020016000206040518083815260200180602001828103825283818154815260200191508054801561210957602002820191906000526020600020905b8154815260200190600101908083116120f5575b5050935050505060405180910390a45050505050565b6000600360008681526020019081526020016000208054905090506000811115156121b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f636f6e646974696f6e206e6f742070726570617265642079657400000000000081525060200191505060405180910390fd5b60008060018360019060020a02039050600081905060008090505b8787905081101561239657600088888381811015156121e857fe5b90506020020135905060008111801561220057508381105b1515612274576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f676f7420696e76616c696420696e64657820736574000000000000000000000081525060200191505060405180910390fd5b808382161415156122ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f706172746974696f6e206e6f74206469736a6f696e740000000000000000000081525060200191505060405180910390fd5b80831892508b6122fe8c8c846135da565b604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120945061238833866001900489602060405190810160405280600081525061394c565b5080806001019150506121cd565b5060008114156125de57600060010289141561255d578973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561248357600080fd5b505af1158015612497573d6000803e3d6000fd5b505050506040513d60208110156124ad57600080fd5b81019080805190602001909291905050501515612558576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001807f636f756c64206e6f74207265636569766520636f6c6c61746572616c20746f6b81526020017f656e73000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6125d9565b8989604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040528051906020012092506125d83384600190048761380b565b5b612666565b896125ec8a8a8486186135da565b604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040528051906020012092506126653384600190048761380b565b5b87893373ffffffffffffffffffffffffffffffffffffffff167f2e6bb91f8cbcda0c93623c54d0403a43514fabc40084ec96b6d5379a747862988d8b8b8b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a450505050505050505050565b6000600360008681526020019081526020016000208054905090506000811115156127c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f636f6e646974696f6e206e6f742070726570617265642079657400000000000081525060200191505060405180910390fd5b60008060018360019060020a02039050600081905060008090505b8787905081101561299357600088888381811015156127f657fe5b90506020020135905060008111801561280e57508381105b1515612882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f676f7420696e76616c696420696e64657820736574000000000000000000000081525060200191505060405180910390fd5b808382161415156128fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f706172746974696f6e206e6f74206469736a6f696e740000000000000000000081525060200191505060405180910390fd5b80831892508b61290c8c8c846135da565b604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040528051906020012094506129853386600190048961380b565b5080806001019150506127db565b506000811415612b92576000600102891415612b00578973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a4c57600080fd5b505af1158015612a60573d6000803e3d6000fd5b505050506040513d6020811015612a7657600080fd5b81019080805190602001909291905050501515612afb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f636f756c64206e6f742073656e6420636f6c6c61746572616c20746f6b656e7381525060200191505060405180910390fd5b612b8d565b8989604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200192505050604051602081830303815290604052805190602001209250612b8c33846001900487602060405190810160405280600081525061394c565b5b612c2b565b89612ba08a8a8486186135da565b604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200192505050604051602081830303815290604052805190602001209250612c2a33846001900487602060405190810160405280600081525061394c565b5b87893373ffffffffffffffffffffffffffffffffffffffff167f6f13ca62553fcc2bcd2372180a43949c1e4cebba603901ede2f4e14f36b282ca8d8b8b8b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018381526020018281038252858582818152602001925060200280828437600081840152601f19601f8201169050808301925050509550505050505060405180910390a450505050505050505050565b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600060036000838152602001908152602001600020805490509050919050565b6101008111151515612e8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f746f6f206d616e79206f7574636f6d6520736c6f74730000000000000000000081525060200191505060405180910390fd5b600081111515612f05576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6e6f206f7574636f6d6520736c6f74732070726f76696465640000000000000081525060200191505060405180910390fd5b6000838383604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401838152602001828152602001935050505060405160208183030381529060405280519060200120905060006003600083815260200190815260200160002080549050141515613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f636f6e646974696f6e20616c726561647920707265706172656400000000000081525060200191505060405180910390fd5b816040519080825280602002602001820160405280156130385781602001602082028038833980820191505090505b5060036000838152602001908152602001600020908051906020019061305f9291906151ba565b50828473ffffffffffffffffffffffffffffffffffffffff16827fab3760c3bd2bb38b5bcf54dc79802ed67338b4cf29f3054ded67ed24661e4177856040518082815260200191505060405180910390a450505050565b60046020528060005260406000206000915090505481565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561322d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f455243313135353a207461726765742061646472657373206d7573742062652081526020017f6e6f6e2d7a65726f00000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806132f4575060011515600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b151561338e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f455243313135353a206e656564206f70657261746f7220617070726f76616c2081526020017f666f7220337264207061727479207472616e73666572732e000000000000000081525060400191505060405180910390fd5b6133f1836001600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6890919063ffffffff16565b6001600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134a86001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548461362190919063ffffffff16565b6001600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a46135d2338787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050614761565b505050505050565b600082826040516020018083815260200182815260200192505050604051602081830303815290604052805190602001206001900484600190040160010290509392505050565b60008082840190508381101515156136a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808314156136be5760009050613772565b600082840290508284828115156136d157fe5b0414151561376d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81526020017f770000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b809150505b92915050565b600080821115156137f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060200191505060405180910390fd5b600082848115156137fe57fe5b0490508091505092915050565b61386e816001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b6890919063ffffffff16565b6001600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515613a17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f455243313135353a206d696e7420746f20746865207a65726f2061646472657381526020017f730000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613a7a6001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548361362190919063ffffffff16565b6001600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4613b6233600086868686614761565b50505050565b6000828211151515613be2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b613c128473ffffffffffffffffffffffffffffffffffffffff166151a7565b156147595760646102346102bc6001603f604061271002811515613c3257fe5b04010101015a10151515613cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001807f455243313135353a206e6f7420656e6f7567682067617320726573657276656481526020017f20666f7220746f6b656e20726563656976657220636865636b0000000000000081525060400191505060405180910390fd5b600060608573ffffffffffffffffffffffffffffffffffffffff1661271060405180807f6f6e455243313135354261746368526563656976656428616464726573732c6181526020017f6464726573732c75696e743235365b5d2c75696e743235365b5d2c627974657381526020017f29000000000000000000000000000000000000000000000000000000000000008152506041019050604051809103902060405180807f6f6e45524331313535526563656976656428616464726573732c61646472657381526020017f732c75696e743235362c75696e743235362c6279746573290000000000000000815250603801905060405180910390201860405160240180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019150506040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515613ed15780518252602082019150602081019050602083039250613eac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303818686fa925050503d8060008114613f32576040519150601f19603f3d011682016040523d82523d6000602084013e613f37565b606091505b5091509150818015613f4a575060008151115b8015613f7f575060011515818060200190516020811015613f6a57600080fd5b81019080805190602001909291905050501515145b156142a8578573ffffffffffffffffffffffffffffffffffffffff1663bc197c8190507c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663bc197c818a8a8989896040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b838110156140db5780820151818401526020810190506140c0565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561411d578082015181840152602081019050614102565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561415c578082015181840152602081019050614141565b50505050905090810190601f1680156141895780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156141ae57600080fd5b505af11580156141c2573d6000803e3d6000fd5b505050506040513d60208110156141d857600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156142a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f455243313135353a20676f7420756e6b6e6f776e2076616c75652066726f6d2081526020017f6f6e45524331313535426174636852656365697665640000000000000000000081525060400191505060405180910390fd5b614756565b6000731820a4b7618bde71dce8cdc73aab6c95905fad2473ffffffffffffffffffffffffffffffffffffffff1663aabbb8ca886040805190810160405280601481526020017f45524331313535546f6b656e5265636569766572000000000000000000000000815250805190602001206040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561439b57600080fd5b505afa1580156143af573d6000803e3d6000fd5b505050506040513d60208110156143c557600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515614754578073ffffffffffffffffffffffffffffffffffffffff1663bc197c8190507c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168173ffffffffffffffffffffffffffffffffffffffff1663bc197c818b8b8a8a8a6040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561456557808201518184015260208101905061454a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156145a757808201518184015260208101905061458c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156145e65780820151818401526020810190506145cb565b50505050905090810190601f1680156146135780820380516001836020036101000a031916815260