{
"schemaVersion": "2.0.0",
"contractName": "Forwarder",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
},
{
"name": "",
"type": "address"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"name": "",
"type": "bytes4"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "orders",
"type": "tuple[]"
},
{
"name": "signatures",
"type": "bytes[]"
},
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "feeOrders",
"type": "tuple[]"
},
{
"name": "feeSignatures",
"type": "bytes[]"
},
{
"name": "feeProportion",
"type": "uint16"
},
{
"name": "feeRecipient",
"type": "address"
}
],
"name": "marketSellEthForERC20",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "orders",
"type": "tuple[]"
},
{
"name": "makerAssetFillAmount",
"type": "uint256"
}
],
"name": "calculateMarketBuyResults",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "ALLOWABLE_EXCHANGE_PERCENTAGE",
"outputs": [
{
"name": "",
"type": "uint16"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "orders",
"type": "tuple[]"
},
{
"name": "signatures",
"type": "bytes[]"
},
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "feeOrders",
"type": "tuple[]"
},
{
"name": "feeSignatures",
"type": "bytes[]"
},
{
"name": "makerTokenFillAmount",
"type": "uint256"
},
{
"name": "feeProportion",
"type": "uint16"
},
{
"name": "feeRecipient",
"type": "address"
}
],
"name": "marketBuyTokensWithEth",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
}
],
"payable": true,
"stateMutability": "payable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "PERCENTAGE_DENOMINATOR",
"outputs": [
{
"name": "",
"type": "uint16"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "MAX_FEE",
"outputs": [
{
"name": "",
"type": "uint16"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "orders",
"type": "tuple[]"
},
{
"name": "takerAssetFillAmount",
"type": "uint256"
}
],
"name": "calculateMarketSellResults",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"components": [
{
"name": "makerAddress",
"type": "address"
},
{
"name": "takerAddress",
"type": "address"
},
{
"name": "feeRecipientAddress",
"type": "address"
},
{
"name": "senderAddress",
"type": "address"
},
{
"name": "makerAssetAmount",
"type": "uint256"
},
{
"name": "takerAssetAmount",
"type": "uint256"
},
{
"name": "makerFee",
"type": "uint256"
},
{
"name": "takerFee",
"type": "uint256"
},
{
"name": "expirationTimeSeconds",
"type": "uint256"
},
{
"name": "salt",
"type": "uint256"
},
{
"name": "makerAssetData",
"type": "bytes"
},
{
"name": "takerAssetData",
"type": "bytes"
}
],
"name": "orders",
"type": "tuple[]"
},
{
"name": "zrxFillAmount",
"type": "uint256"
}
],
"name": "calculateMarketBuyZrxResults",
"outputs": [
{
"components": [
{
"name": "makerAssetFilledAmount",
"type": "uint256"
},
{
"name": "takerAssetFilledAmount",
"type": "uint256"
},
{
"name": "makerFeePaid",
"type": "uint256"
},
{
"name": "takerFeePaid",
"type": "uint256"
}
],
"name": "totalFillResults",
"type": "tuple"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "",
"type": "address"
},
{
"name": "",
"type": "uint256"
},
{
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"name": "",
"type": "bytes4"
}
],
"payable": false,
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"name": "_exchange",
"type": "address"
},
{
"name": "_etherToken",
"type": "address"
},
{
"name": "_zrxToken",
"type": "address"
},
{
"name": "_zrxAssetData",
"type": "bytes"
},
{
"name": "_wethAssetData",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"payable": true,
"stateMutability": "payable",
"type": "fallback"
}
],
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040523480156200001157600080fd5b506040516200374638038062003746833981018060405262000037919081019062000433565b60008054600160a060020a03808816600160a060020a03199283161783556001805482891690841617905560028054918716919092161790558251869086908690869086906200008f906003906020850190620002e6565b508051620000a5906004906020840190620002e6565b5050600054604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a039092169550636070410894506200012593509091506004016200054a565b602060405180830381600087803b1580156200014057600080fd5b505af115801562000155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200017b91908101906200040a565b9050600160a060020a03811615620002da576001546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001dc908490600019906004016200052b565b602060405180830381600087803b158015620001f757600080fd5b505af11580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002329190810190620004e3565b506002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b39062000282908490600019906004016200052b565b602060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002d89190810190620004e3565b505b50505050505062000618565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032957805160ff191683800117855562000359565b8280016001018555821562000359579182015b82811115620003595782518255916020019190600101906200033c565b50620003679291506200036b565b5090565b6200038891905b8082111562000367576000815560010162000372565b90565b6000620003998251620005af565b9392505050565b6000620003998251620005e0565b6000601f82018313620003c057600080fd5b8151620003d7620003d18262000587565b62000560565b91508082526020830160208301858383011115620003f457600080fd5b62000401838284620005e5565b50505092915050565b6000602082840312156200041d57600080fd5b60006200042b84846200038b565b949350505050565b600080600080600060a086880312156200044c57600080fd5b60006200045a88886200038b565b95505060206200046d888289016200038b565b945050604062000480888289016200038b565b93505060608601516001604060020a038111156200049d57600080fd5b620004ab88828901620003ae565b92505060808601516001604060020a03811115620004c857600080fd5b620004d688828901620003ae565b9150509295509295909350565b600060208284031215620004f657600080fd5b60006200042b8484620003a0565b6200050f81620005af565b82525050565b6200050f81620005bb565b6200050f8162000388565b604081016200053b828562000504565b62000399602083018462000520565b602081016200055a828462000515565b92915050565b6040518181016001604060020a03811182821017156200057f57600080fd5b604052919050565b60006001604060020a038211156200059e57600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b8381101562000602578181015183820152602001620005e8565b8381111562000612576000848401525b50505050565b61311e80620006286000396000f3006080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820b73c34fdd0074f75c38120f3e5867a8ac00d0d638473186785135c77973c71a26c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x3746 CODESIZE SUB DUP1 PUSH3 0x3746 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP9 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP3 DUP4 AND OR DUP4 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 DUP10 AND SWAP1 DUP5 AND OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP2 DUP8 AND SWAP2 SWAP1 SWAP3 AND OR SWAP1 SSTORE DUP3 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x8F SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xA5 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2E6 JUMP JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x125 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x54A JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x140 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x155 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x17B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x40A JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2DA JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1DC SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x20C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x232 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x282 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x52B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2B2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2D8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4E3 JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP PUSH3 0x618 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x329 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x359 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x359 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x359 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x33C JUMP JUMPDEST POP PUSH3 0x367 SWAP3 SWAP2 POP PUSH3 0x36B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x388 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x367 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x372 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5AF JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x399 DUP3 MLOAD PUSH3 0x5E0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3D7 PUSH3 0x3D1 DUP3 PUSH3 0x587 JUMP JUMPDEST PUSH3 0x560 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x3F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x401 DUP4 DUP3 DUP5 PUSH3 0x5E5 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x38B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x44C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x45A DUP9 DUP9 PUSH3 0x38B JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x46D DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x480 DUP9 DUP3 DUP10 ADD PUSH3 0x38B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4AB DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4D6 DUP9 DUP3 DUP10 ADD PUSH3 0x3AE JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x4F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x42B DUP5 DUP5 PUSH3 0x3A0 JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5AF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x5BB JUMP JUMPDEST PUSH3 0x50F DUP2 PUSH3 0x388 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x53B DUP3 DUP6 PUSH3 0x504 JUMP JUMPDEST PUSH3 0x399 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x520 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x55A DUP3 DUP5 PUSH3 0x515 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x602 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5E8 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x612 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x311E DUP1 PUSH3 0x628 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xb7 EXTCODECOPY CALLVALUE REVERT 0xd0 SMOD 0x4f PUSH22 0xC38120F3E5867A8AC00D0D638473186785135C77973C PUSH18 0xA26C6578706572696D656E74616CF5003700 ",
"sourceMap": "834:541:0:-;;;989:384;8:9:-1;5:2;;;30:1;27;20:12;5:2;989:384:0;;;;;;;;;;;;;;;;;;;;;;;;1444:20:4;894:31:1;;-1:-1:-1;;;;;894:31:1;;;-1:-1:-1;;;;;;894:31:1;;;;;;;935:38;;;;;;;;;;;983:9;:34;;;;;;;;;;;;1027:30;;1215:9:0;;1238:11;;1263:9;;1286:13;;1313:14;;1027:30:1;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1067:32:1;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1467:8:4;;1204:32;;;;;;;;;;;;;;;;1467:37;;;-1:-1:-1;;;;;1467:8:4;;;;-1:-1:-1;1467:22:4;;-1:-1:-1;1467:37:4;;-1:-1:-1;1204:32:4;;-1:-1:-1;1467:37:4;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1467:37:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1467:37:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1467:37:4;;;;;;;;;1444:60;-1:-1:-1;;;;;;1518:26:4;;;1514:155;;1560:11;;:43;;;;;-1:-1:-1;;;;;1560:11:4;;;;:19;;:43;;1580:12;;-1:-1:-1;;1383:10:4;1560:43;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1560:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1560:43:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1560:43:4;;;;;;;;;-1:-1:-1;1617:9:4;;:41;;;;;-1:-1:-1;;;;;1617:9:4;;;;:17;;:41;;1635:12;;-1:-1:-1;;1383:10:4;1617:41;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1617:41:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1617:41:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1617:41:4;;;;;;;;;;1514:155;1400:275;989:384:0;;;;;834:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;834:541:0;;;-1:-1:-1;834:541:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;258:442;;363:4;351:17;;347:27;-1:-1;337:2;;388:1;385;378:12;337:2;418:6;412:13;440:64;455:48;496:6;455:48;;;440:64;;;431:73;;524:6;517:5;510:21;560:4;552:6;548:17;593:4;586:5;582:16;628:3;619:6;614:3;610:16;607:25;604:2;;;645:1;642;635:12;604:2;655:39;687:6;682:3;677;655:39;;;330:370;;;;;;;;708:263;;823:2;811:9;802:7;798:23;794:32;791:2;;;839:1;836;829:12;791:2;874:1;891:64;947:7;927:9;891:64;;;881:74;785:186;-1:-1;;;;785:186;978:1003;;;;;;1179:3;1167:9;1158:7;1154:23;1150:33;1147:2;;;1196:1;1193;1186:12;1147:2;1231:1;1248:64;1304:7;1284:9;1248:64;;;1238:74;;1210:108;1349:2;1367:64;1423:7;1414:6;1403:9;1399:22;1367:64;;;1357:74;;1328:109;1468:2;1486:64;1542:7;1533:6;1522:9;1518:22;1486:64;;;1476:74;;1447:109;1608:2;1597:9;1593:18;1587:25;-1:-1;;;;;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1684:73;1749:7;1740:6;1729:9;1725:22;1684:73;;;1674:83;;1566:197;1815:3;1804:9;1800:19;1794:26;-1:-1;;;;;1832:6;1829:30;1826:2;;;1872:1;1869;1862:12;1826:2;1892:73;1957:7;1948:6;1937:9;1933:22;1892:73;;;1882:83;;1773:198;1141:840;;;;;;;;;1988:257;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:61;2221:7;2201:9;2168:61;;2252:110;2325:31;2350:5;2325:31;;;2320:3;2313:44;2307:55;;;2369:107;2440:30;2464:5;2440:30;;2483:110;2556:31;2581:5;2556:31;;2600:294;2736:2;2721:18;;2750:61;2725:9;2784:6;2750:61;;;2822:62;2880:2;2869:9;2865:18;2856:6;2822:62;;2901:189;3007:2;2992:18;;3021:59;2996:9;3053:6;3021:59;;;2978:112;;;;;3097:256;3159:2;3153:9;3185:17;;;-1:-1;;;;;3245:34;;3281:22;;;3242:62;3239:2;;;3317:1;3314;3307:12;3239:2;3333;3326:22;3137:216;;-1:-1;3137:216;3360:258;;-1:-1;;;;;3495:6;3492:30;3489:2;;;3535:1;3532;3525:12;3489:2;-1:-1;3608:4;3579;3556:17;;;;-1:-1;;3552:33;3598:15;;3426:192;3625:128;-1:-1;;;;;3694:54;;3677:76;3760:151;3839:66;3828:78;;3811:100;4139:92;4212:13;4205:21;;4188:43;4239:268;4304:1;4311:101;4325:6;4322:1;4319:13;4311:101;;;4392:11;;;4386:18;4373:11;;;4366:39;4347:2;4340:10;4311:101;;;4427:6;4424:1;4421:13;4418:2;;;4492:1;4483:6;4478:3;4474:16;4467:27;4418:2;4288:219;;;;;;834:541:0;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100a35763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663150b7a0281146100ff578063169645f2146101355780631c5b1ec41461015557806320472cf714610175578063725cef0614610197578063b3cd4254146101aa578063bc063e1a146101bf578063c5e6e6ac146101d4578063e58e9c16146101f4578063f0b9e5ba14610214575b60015473ffffffffffffffffffffffffffffffffffffffff1633146100fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e71565b60405180910390fd5b005b34801561010b57600080fd5b5061011f61011a36600461248a565b610234565b60405161012c9190612e63565b60405180910390f35b610148610143366004612568565b610294565b60405161012c9190612f31565b34801561016157600080fd5b50610148610170366004612749565b610560565b34801561018157600080fd5b5061018a610626565b60405161012c9190612f82565b6101486101a536600461264e565b61062c565b3480156101b657600080fd5b5061018a6109fa565b3480156101cb57600080fd5b5061018a610a00565b3480156101e057600080fd5b506101486101ef366004612749565b610a06565b34801561020057600080fd5b5061014861020f366004612749565b610a79565b34801561022057600080fd5b5061011f61022f366004612503565b610b76565b604080517f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152905190819003602f019020949350505050565b61029c6120ed565b34600080808084116102da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6102e5848888610bd6565b92506102f18484610ca4565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561037957600080fd5b505af115801561038d573d6000803e3d6000fd5b50505050506103ba8b60008151811015156103a457fe5b9060200190602002015161014001516010610ceb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529394508301828280156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b50505050508b600081518110151561047457fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff828116911614156104b8576104b18b8b84610d4c565b94506104c8565b6104c58b8b8b8b86610e66565b94505b6020850151841015610506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b60208501518214610543576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b61055281338760000151610fee565b505050509695505050505050565b6105686120ed565b60008060006105756120ed565b600093505b865184101561061c57610591868660000151610ca4565b92506105d487858151811015156105a457fe5b9060200190602002015160a0015188868151811015156105c057fe5b9060200190602002015160800151856111c8565b91506105f787858151811015156105e757fe5b90602001906020020151836111e5565b9050610603858261132e565b84518614156106115761061c565b60019093019261057a565b5050505092915050565b61251c81565b6106346120ed565b346000808211610670576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b600086116106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ea1565b6106d28a60008151811015156106bc57fe5b9060200190602002015161014001516000611390565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614806107b45750604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff000000000000000000000000000000000000000000000000000000008281169116145b15156107ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f11565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561087257600080fd5b505af1158015610886573d6000803e3d6000fd5b5050604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190207fffffffff000000000000000000000000000000000000000000000000000000008581169116141592506108ff915050576108f88a8a8a8a8a6113fd565b9250610992565b604080517f455243373231546f6b656e28616464726573732c75696e743235362c6279746581527f7329000000000000000000000000000000000000000000000000000000000000602082015290519081900360220190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156109925761098f8a8a8a8a611754565b92505b60208301518210156109d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e81565b6109ed6109e1838560200151610ca4565b84602001518787611a56565b5050979650505050505050565b61271081565b6103e881565b610a0e6120ed565b600080610a196120ed565b600092505b8551831015610a7057610a35858560200151610ca4565b9150610a4886848151811015156105e757fe5b9050610a54848261132e565b8484602001511415610a6557610a70565b600190920191610a1e565b50505092915050565b610a816120ed565b6000806000610a8e6120ed565b600093505b865184101561061c57610aaa868660000151610ca4565b9250610b118785815181101515610abd57fe5b9060200190602002015160a00151610b0b8987815181101515610adc57fe5b90602001906020020151608001518a88815181101515610af857fe5b9060200190602002015160e00151610ca4565b856111c8565b9150610b3e8785815181101515610b2457fe5b90602001906020020151610b39846001611b43565b6111e5565b9050610b5281600001518260600151610ca4565b8152610b5e858261132e565b84518611610b6b5761061c565b600190930192610a93565b604080517f6f6e455243373231526563656976656428616464726573732c75696e7432353681527f2c62797465732900000000000000000000000000000000000000000000000000602082015290519081900360270190205b9392505050565b6000808361ffff16118015610c00575073ffffffffffffffffffffffffffffffffffffffff821615155b15610bcf576103e861ffff84161115610c45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ed1565b610c5661ffff8416612710866111c8565b60405190915073ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610c9c573d6000803e3d6000fd5b509392505050565b600082821115610ce0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b508082035b92915050565b600081601401835110151515610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f01565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b610d546120ed565b600080546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610daf90889087908990600401612e31565b608060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e01919081019061279a565b9150610e1582600001518360600151610ca4565b9050610e25826000015182611b8d565b1515610e5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b81529392505050565b610e6e6120ed565b6000610e786120ed565b610e806120ed565b610e886120ed565b859350610e958a87610a06565b9250600083606001511115610f2957610eb388888560600151611baa565b9150610ecc86610ec7888560200151610ca4565b611b8d565b1515610f04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610f12848360200151610ca4565b606080840151908701526020808401519087015293505b6000546040517f7e1d980800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690637e1d980890610f83908d9088908e90600401612e31565b608060405180830381600087803b158015610f9d57600080fd5b505af1158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd5919081019061279a565b9050610fe1858261132e565b5050505095945050505050565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812060009173ffffffffffffffffffffffffffffffffffffffff8616919061104c9086908690602401612ddd565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156110f05781810151838201526020016110d8565b50505050905090810190601f16801561111d5780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af19250505080151561116c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b3d15611189575060003d602014156111895760206000803e506000515b8015156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ee1565b50505050565b60006111dd6111d78584611ee3565b84611f3e565b949350505050565b6111ed6120ed565b6111f5612116565b600080546040517fc75e0a81000000000000000000000000000000000000000000000000000000008152829173ffffffffffffffffffffffffffffffffffffffff169063c75e0a819061124c908990600401612f3f565b606060405180830381600087803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061129e91908101906127b8565b805190935060ff166003146112b257610a70565b6112c48660a001518460400151610ca4565b91506112d08583611f55565b9050808460200181815250506112ef818760a0015188608001516111c8565b845260a086015160c08701516113069183916111c8565b604085015260a086015160e08701516113209183916111c8565b606085015250505092915050565b8151815161133c9190611b43565b8252602080830151908201516113529190611b43565b60208301526040808301519082015161136b9190611b43565b6040830152606080830151908201516113849190611b43565b60609092019190915250565b6000816004018351101515156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612f21565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6114056120ed565b600061140f6120ed565b6114176120ed565b61141f6120ed565b6114318a60008151811015156103a457fe5b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281529397508301828280156114d75780601f106114ac576101008083540402835291602001916114d7565b820191906000526020600020905b8154815290600101906020018083116114ba57829003601f168201915b50505050508a60008151811015156114eb57fe5b60209081029091010151610160015260025473ffffffffffffffffffffffffffffffffffffffff858116911614156115c9576115288a8a88611baa565b8051909350861115611566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611570858461132e565b61158c61158586600001518760600151611b43565b8651611b8d565b15156115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b611745565b6115d38a87610560565b9150600082606001511115611608576115f188888460600151611baa565b602080820151908701526060808201519087015290505b6000546040517fe5fa431b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063e5fa431b90611662908d908a908e90600401612e31565b608060405180830381600087803b15801561167c57600080fd5b505af1158015611690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116b4919081019061279a565b805190935086146116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b6116fb858461132e565b61170d85602001518460200151611b8d565b1515611745576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b610fe184338560000151610fee565b61175c6120ed565b6000806060600061176b6120ed565b6117736120ed565b8a519450846040519080825280602002602001820160405280156117a1578160200160208202803883390190505b509350600092505b848310156118dd576117d6868c858151811015156117c357fe5b9060200190602002015160e00151611b43565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815293995083018282801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b50505050508b8481518110151561188f57fe5b6020908102909101015161016001528a518b90849081106118ac57fe5b9060200190602002015160a0015184848151811015156118c857fe5b602090810290910101526001909201916117a9565b6000861115611908576118f1898988611baa565b606080820151908901526020808201519089015291505b6000546040517f4d0ae54600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634d0ae54690611962908e9088908f90600401612df8565b608060405180830381600087803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119b4919081019061279a565b90506119c0878261132e565b6119d287602001518260200151611b8d565b1515611a0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ef1565b600092505b84831015611a4857611a3d8b84815181101515611a2857fe5b90602001906020020151610140015133611f6b565b600190920191611a0f565b505050505050949350505050565b6000806000861115611b3b576001546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611ab8908990600401612f90565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b50505050611af5858585610bd6565b9150611b018683610ca4565b90506000811115611b3b57604051339082156108fc029083906000818181858888f19350505050158015611b39573d6000803e3d6000fd5b505b505050505050565b600082820183811015611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b8091505b5092915050565b600080611b9f61251c612710866111c8565b909210159392505050565b611bb26120ed565b6000806000611bbf6120ed565b600093505b8751841015611ed8576003805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611c715780601f10611c4657610100808354040283529160200191611c71565b820191906000526020600020905b815481529060010190602001808311611c5457829003601f168201915b50505050508885815181101515611c8457fe5b602090810290910181015161014001919091526004805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169390930492830185900485028101850190915281815292830182828015611d395780601f10611d0e57610100808354040283529160200191611d39565b820191906000526020600020905b815481529060010190602001808311611d1c57829003601f168201915b50505050508885815181101515611d4c57fe5b6020908102909101015161016001528451611d68908790610ca4565b9250611db68885815181101515611d7b57fe5b9060200190602002015160a00151610b0b8a87815181101515611d9a57fe5b90602001906020020151608001518b88815181101515610af857fe5b600054895191935073ffffffffffffffffffffffffffffffffffffffff169063b4be83d5908a9087908110611de757fe5b90602001906020020151611dfc856001611b43565b8a88815181101515611e0a57fe5b906020019060200201516040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611e4e93929190612f50565b608060405180830381600087803b158015611e6857600080fd5b505af1158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ea0919081019061279a565b9050611eb481600001518260600151610ca4565b8152611ec0858261132e565b84518611611ecd57611ed8565b600190930192611bc4565b505050509392505050565b600080831515611ef65760009150611b86565b50828202828482811515611f0657fe5b0414611b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612ec1565b6000808284811515611f4c57fe5b04949350505050565b6000818310611f645781610bcf565b5090919050565b6000806060611f8185601063ffffffff610ceb16565b9250611f9485602463ffffffff61203b16565b9150611fa785606463ffffffff61204716565b6040517fb88d4fde00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff84169063b88d4fde90612002903090889087908790600401612d99565b600060405180830381600087803b15801561201c57600080fd5b505af1158015612030573d6000803e3d6000fd5b505050505050505050565b6000610bcf83836120a2565b60606000612055848461203b565b905060208301925080830184511015151561209c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612e91565b50500190565b6000816020018351101515156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100f490612eb1565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610bcf8235613036565b6000601f8201831361215357600080fd5b813561216661216182612fc5565b612f9e565b81815260209384019390925082018360005b8381101561061c578135860161218e888261220d565b8452506020928301929190910190600101612178565b6000601f820183136121b557600080fd5b81356121c361216182612fc5565b81815260209384019390925082018360005b8381101561061c57813586016121eb888261231d565b84525060209283019291909101906001016121d5565b6000610bcf825161307b565b6000601f8201831361221e57600080fd5b813561222c61216182612fe6565b9150808252602083016020830185838301111561224857600080fd5b610a70838284613084565b60006080828403121561226557600080fd5b61226f6080612f9e565b9050600061227d8484612201565b825250602061228e84848301612201565b60208301525060406122a284828501612201565b60408301525060606122b684828501612201565b60608301525092915050565b6000606082840312156122d457600080fd5b6122de6060612f9e565b905060006122ec848461247e565b82525060206122fd84848301612201565b602083015250604061231184828501612201565b60408301525092915050565b6000610180828403121561233057600080fd5b61233b610180612f9e565b905060006123498484612136565b825250602061235a84848301612136565b602083015250604061236e84828501612136565b604083015250606061238284828501612136565b606083015250608061239684828501612472565b60808301525060a06123aa84828501612472565b60a08301525060c06123be84828501612472565b60c08301525060e06123d284828501612472565b60e0830152506101006123e784828501612472565b610100830152506101206123fd84828501612472565b6101208301525061014082013567ffffffffffffffff81111561241f57600080fd5b61242b8482850161220d565b6101408301525061016082013567ffffffffffffffff81111561244d57600080fd5b6124598482850161220d565b6101608301525092915050565b6000610bcf8235613074565b6000610bcf823561307b565b6000610bcf825161307e565b600080600080608085870312156124a057600080fd5b60006124ac8787612136565b94505060206124bd87828801612136565b93505060406124ce87828801612472565b925050606085013567ffffffffffffffff8111156124eb57600080fd5b6124f78782880161220d565b91505092959194509250565b60008060006060848603121561251857600080fd5b60006125248686612136565b935050602061253586828701612472565b925050604084013567ffffffffffffffff81111561255257600080fd5b61255e8682870161220d565b9150509250925092565b60008060008060008060c0878903121561258157600080fd5b863567ffffffffffffffff81111561259857600080fd5b6125a489828a016121a4565b965050602087013567ffffffffffffffff8111156125c157600080fd5b6125cd89828a01612142565b955050604087013567ffffffffffffffff8111156125ea57600080fd5b6125f689828a016121a4565b945050606087013567ffffffffffffffff81111561261357600080fd5b61261f89828a01612142565b935050608061263089828a01612466565b92505060a061264189828a01612136565b9150509295509295509295565b600080600080600080600060e0888a03121561266957600080fd5b873567ffffffffffffffff81111561268057600080fd5b61268c8a828b016121a4565b975050602088013567ffffffffffffffff8111156126a957600080fd5b6126b58a828b01612142565b965050604088013567ffffffffffffffff8111156126d257600080fd5b6126de8a828b016121a4565b955050606088013567ffffffffffffffff8111156126fb57600080fd5b6127078a828b01612142565b94505060806127188a828b01612472565b93505060a06127298a828b01612466565b92505060c061273a8a828b01612136565b91505092959891949750929550565b6000806040838503121561275c57600080fd5b823567ffffffffffffffff81111561277357600080fd5b61277f858286016121a4565b925050602061279085828601612472565b9150509250929050565b6000608082840312156127ac57600080fd5b60006111dd8484612253565b6000606082840312156127ca57600080fd5b60006111dd84846122c2565b6127df81613036565b82525050565b60006127f082613032565b808452602084019350836020820285016128098561302c565b60005b84811015612840578383038852612824838351612907565b925061282f8261302c565b60209890980197915060010161280c565b50909695505050505050565b600061285782613032565b808452602084019350836020820285016128708561302c565b60005b8481101561284057838303885261288b838351612c84565b92506128968261302c565b602098909801979150600101612873565b60006128b282613032565b8084526020840193506128c48361302c565b60005b828110156128f4576128da868351612d90565b6128e38261302c565b6020969096019591506001016128c7565b5093949350505050565b6127df8161304f565b600061291282613032565b808452612926816020860160208601613090565b61292f816130bc565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b603081527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360208201527f5f4c454e4754485f524551554952454400000000000000000000000000000000604082015260600190565b601781527f56414c55455f475245415445525f5448414e5f5a45524f000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b601881527f4645455f50524f504f5254494f4e5f544f4f5f4c415247450000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601681527f554e41434345505441424c455f5448524553484f4c4400000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b80516080830190612c4b8482612d90565b506020820151612c5e6020850182612d90565b506040820151612c716040850182612d90565b5060608201516111c26060850182612d90565b8051600090610180840190612c9985826127d6565b506020830151612cac60208601826127d6565b506040830151612cbf60408601826127d6565b506060830151612cd260608601826127d6565b506080830151612ce56080860182612d90565b5060a0830151612cf860a0860182612d90565b5060c0830151612d0b60c0860182612d90565b5060e0830151612d1e60e0860182612d90565b50610100830151612d33610100860182612d90565b50610120830151612d48610120860182612d90565b50610140830151848203610140860152612d628282612907565b915050610160830151848203610160860152612d7e8282612907565b95945050505050565b6127df81613074565b6127df8161307b565b60808101612da782876127d6565b612db460208301866127d6565b612dc16040830185612d90565b8181036060830152612dd38184612907565b9695505050505050565b60408101612deb82856127d6565b610bcf6020830184612d90565b60608082528101612e09818661284c565b90508181036020830152612e1d81856128a7565b90508181036040830152612d7e81846127e5565b60608082528101612e42818661284c565b9050612e516020830185612d90565b8181036040830152612d7e81846127e5565b60208101610ce582846128fe565b60208082528101610ce58161293c565b60208082528101610ce581612992565b60208082528101610ce5816129c2565b60208082528101610ce581612a18565b60208082528101610ce581612a48565b60208082528101610ce581612a9e565b60208082528101610ce581612ace565b60208082528101610ce581612afe565b60208082528101610ce581612b2e565b60208082528101610ce581612b5e565b60208082528101610ce581612bb4565b60208082528101610ce581612be4565b60808101610ce58284612c3a565b60208082528101610bcf8184612c84565b60608082528101612f618186612c84565b9050612f706020830185612d90565b8181036040830152612d7e8184612907565b60208101610ce58284612d87565b60208101610ce58284612d90565b60405181810167ffffffffffffffff81118282101715612fbd57600080fd5b604052919050565b600067ffffffffffffffff821115612fdc57600080fd5b5060209081020190565b600067ffffffffffffffff821115612ffd57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61ffff1690565b90565b60ff1690565b82818337506000910152565b60005b838110156130ab578181015183820152602001613093565b838111156111c25750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820b73c34fdd0074f75c38120f3e5867a8ac00d0d638473186785135c77973c71a26c6578706572696d656e74616cf50037",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x150B7A02 DUP2 EQ PUSH2 0xFF JUMPI DUP1 PUSH4 0x169645F2 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x1C5B1EC4 EQ PUSH2 0x155 JUMPI DUP1 PUSH4 0x20472CF7 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x725CEF06 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xB3CD4254 EQ PUSH2 0x1AA JUMPI DUP1 PUSH4 0xBC063E1A EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0xC5E6E6AC EQ PUSH2 0x1D4 JUMPI DUP1 PUSH4 0xE58E9C16 EQ PUSH2 0x1F4 JUMPI DUP1 PUSH4 0xF0B9E5BA EQ PUSH2 0x214 JUMPI JUMPDEST PUSH1 0x1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x11A CALLDATASIZE PUSH1 0x4 PUSH2 0x248A JUMP JUMPDEST PUSH2 0x234 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2E63 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x148 PUSH2 0x143 CALLDATASIZE PUSH1 0x4 PUSH2 0x2568 JUMP JUMPDEST PUSH2 0x294 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x161 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x170 CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0x560 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x181 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x626 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12C SWAP2 SWAP1 PUSH2 0x2F82 JUMP JUMPDEST PUSH2 0x148 PUSH2 0x1A5 CALLDATASIZE PUSH1 0x4 PUSH2 0x264E JUMP JUMPDEST PUSH2 0x62C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0x9FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18A PUSH2 0xA00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x1EF CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x200 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x148 PUSH2 0x20F CALLDATASIZE PUSH1 0x4 PUSH2 0x2749 JUMP JUMPDEST PUSH2 0xA79 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11F PUSH2 0x22F CALLDATASIZE PUSH1 0x4 PUSH2 0x2503 JUMP JUMPDEST PUSH2 0xB76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C61646472657373 DUP2 MSTORE PUSH32 0x2C75696E743235362C6279746573290000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 KECCAK256 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x29C PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP1 DUP1 DUP5 GT PUSH2 0x2DA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x2E5 DUP5 DUP9 DUP9 PUSH2 0xBD6 JUMP JUMPDEST SWAP3 POP PUSH2 0x2F1 DUP5 DUP5 PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x379 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x38D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH2 0x3BA DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x10 PUSH2 0xCEB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP5 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x460 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x435 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x460 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x443 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x474 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x4B8 JUMPI PUSH2 0x4B1 DUP12 DUP12 DUP5 PUSH2 0xD4C JUMP JUMPDEST SWAP5 POP PUSH2 0x4C8 JUMP JUMPDEST PUSH2 0x4C5 DUP12 DUP12 DUP12 DUP12 DUP7 PUSH2 0xE66 JUMP JUMPDEST SWAP5 POP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP5 LT ISZERO PUSH2 0x506 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD DUP3 EQ PUSH2 0x543 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x552 DUP2 CALLER DUP8 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST POP POP POP POP SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x568 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x575 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0x591 DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x5D4 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5A4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5C0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0x5F7 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0x603 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 EQ ISZERO PUSH2 0x611 JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x57A JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x251C DUP2 JUMP JUMPDEST PUSH2 0x634 PUSH2 0x20ED JUMP JUMPDEST CALLVALUE PUSH1 0x0 DUP1 DUP3 GT PUSH2 0x670 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH1 0x0 DUP7 GT PUSH2 0x6AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EA1 JUMP JUMPDEST PUSH2 0x6D2 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6BC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x0 PUSH2 0x1390 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ DUP1 PUSH2 0x7B4 JUMPI POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x7EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F11 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 DUP4 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x872 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x886 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 DUP2 AND SWAP2 AND EQ ISZERO SWAP3 POP PUSH2 0x8FF SWAP2 POP POP JUMPI PUSH2 0x8F8 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH2 0x13FD JUMP JUMPDEST SWAP3 POP PUSH2 0x992 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362C62797465 DUP2 MSTORE PUSH32 0x7329000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x22 ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x992 JUMPI PUSH2 0x98F DUP11 DUP11 DUP11 DUP11 PUSH2 0x1754 JUMP JUMPDEST SWAP3 POP JUMPDEST PUSH1 0x20 DUP4 ADD MLOAD DUP3 LT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E81 JUMP JUMPDEST PUSH2 0x9ED PUSH2 0x9E1 DUP4 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP8 DUP8 PUSH2 0x1A56 JUMP JUMPDEST POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2710 DUP2 JUMP JUMPDEST PUSH2 0x3E8 DUP2 JUMP JUMPDEST PUSH2 0xA0E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xA19 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP6 MLOAD DUP4 LT ISZERO PUSH2 0xA70 JUMPI PUSH2 0xA35 DUP6 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0xA48 DUP7 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x5E7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xA54 DUP5 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 DUP5 PUSH1 0x20 ADD MLOAD EQ ISZERO PUSH2 0xA65 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xA1E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA81 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA8E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP7 MLOAD DUP5 LT ISZERO PUSH2 0x61C JUMPI PUSH2 0xAAA DUP7 DUP7 PUSH1 0x0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0xB11 DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xABD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP10 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP6 PUSH2 0x11C8 JUMP JUMPDEST SWAP2 POP PUSH2 0xB3E DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB24 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xB39 DUP5 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST PUSH2 0x11E5 JUMP JUMPDEST SWAP1 POP PUSH2 0xB52 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0xB5E DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0xB6B JUMPI PUSH2 0x61C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xA93 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F6E455243373231526563656976656428616464726573732C75696E74323536 DUP2 MSTORE PUSH32 0x2C62797465732900000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x27 ADD SWAP1 KECCAK256 JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH2 0xFFFF AND GT DUP1 ISZERO PUSH2 0xC00 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBCF JUMPI PUSH2 0x3E8 PUSH2 0xFFFF DUP5 AND GT ISZERO PUSH2 0xC45 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2ED1 JUMP JUMPDEST PUSH2 0xC56 PUSH2 0xFFFF DUP5 AND PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xC9C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xCE0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST POP DUP1 DUP3 SUB JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xD2D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F01 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0xD54 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xDAF SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDC9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xE01 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP2 POP PUSH2 0xE15 DUP3 PUSH1 0x0 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH2 0xE25 DUP3 PUSH1 0x0 ADD MLOAD DUP3 PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xE5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST DUP2 MSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE6E PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE78 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE80 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0xE88 PUSH2 0x20ED JUMP JUMPDEST DUP6 SWAP4 POP PUSH2 0xE95 DUP11 DUP8 PUSH2 0xA06 JUMP JUMPDEST SWAP3 POP PUSH1 0x0 DUP4 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0xF29 JUMPI PUSH2 0xEB3 DUP9 DUP9 DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST SWAP2 POP PUSH2 0xECC DUP7 PUSH2 0xEC7 DUP9 DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xF04 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xF12 DUP5 DUP4 PUSH1 0x20 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP4 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x7E1D980800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x7E1D9808 SWAP1 PUSH2 0xF83 SWAP1 DUP14 SWAP1 DUP9 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xFB1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFD5 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0xFE1 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST POP POP POP POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP2 SWAP1 PUSH2 0x104C SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x24 ADD PUSH2 0x2DDD JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10F0 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x10D8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x111D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x116C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x1189 JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x1189 JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x11C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EE1 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DD PUSH2 0x11D7 DUP6 DUP5 PUSH2 0x1EE3 JUMP JUMPDEST DUP5 PUSH2 0x1F3E JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x11ED PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x11F5 PUSH2 0x2116 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH32 0xC75E0A8100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP3 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xC75E0A81 SWAP1 PUSH2 0x124C SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1266 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x127A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x129E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x27B8 JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x12B2 JUMPI PUSH2 0xA70 JUMP JUMPDEST PUSH2 0x12C4 DUP7 PUSH1 0xA0 ADD MLOAD DUP5 PUSH1 0x40 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST SWAP2 POP PUSH2 0x12D0 DUP6 DUP4 PUSH2 0x1F55 JUMP JUMPDEST SWAP1 POP DUP1 DUP5 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH2 0x12EF DUP2 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x11C8 JUMP JUMPDEST DUP5 MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x1306 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0xA0 DUP7 ADD MLOAD PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x1320 SWAP2 DUP4 SWAP2 PUSH2 0x11C8 JUMP JUMPDEST PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x133C SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1352 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x136B SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1384 SWAP2 SWAP1 PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13D2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0x1405 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0x140F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1417 PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x141F PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1431 DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x3A4 JUMPI INVALID JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP8 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14D7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14EB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x15C9 JUMPI PUSH2 0x1528 DUP11 DUP11 DUP9 PUSH2 0x1BAA JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 GT ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1570 DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x158C PUSH2 0x1585 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST DUP7 MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x15C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x1745 JUMP JUMPDEST PUSH2 0x15D3 DUP11 DUP8 PUSH2 0x560 JUMP JUMPDEST SWAP2 POP PUSH1 0x0 DUP3 PUSH1 0x60 ADD MLOAD GT ISZERO PUSH2 0x1608 JUMPI PUSH2 0x15F1 DUP9 DUP9 DUP5 PUSH1 0x60 ADD MLOAD PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP8 ADD MSTORE SWAP1 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0xE5FA431B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xE5FA431B SWAP1 PUSH2 0x1662 SWAP1 DUP14 SWAP1 DUP11 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x2E31 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x167C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1690 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST DUP1 MLOAD SWAP1 SWAP4 POP DUP7 EQ PUSH2 0x16F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0x16FB DUP6 DUP5 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x170D DUP6 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1745 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH2 0xFE1 DUP5 CALLER DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0xFEE JUMP JUMPDEST PUSH2 0x175C PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH1 0x0 PUSH2 0x176B PUSH2 0x20ED JUMP JUMPDEST PUSH2 0x1773 PUSH2 0x20ED JUMP JUMPDEST DUP11 MLOAD SWAP5 POP DUP5 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17A1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x18DD JUMPI PUSH2 0x17D6 DUP7 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0x1B43 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP4 SWAP10 POP DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x187C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1851 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x187C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x185F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x188F JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP11 MLOAD DUP12 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x18AC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x17A9 JUMP JUMPDEST PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1908 JUMPI PUSH2 0x18F1 DUP10 DUP10 DUP9 PUSH2 0x1BAA JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE PUSH1 0x20 DUP1 DUP3 ADD MLOAD SWAP1 DUP10 ADD MSTORE SWAP2 POP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x4D0AE54600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x4D0AE546 SWAP1 PUSH2 0x1962 SWAP1 DUP15 SWAP1 DUP9 SWAP1 DUP16 SWAP1 PUSH1 0x4 ADD PUSH2 0x2DF8 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x197C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1990 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x19B4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x19C0 DUP8 DUP3 PUSH2 0x132E JUMP JUMPDEST PUSH2 0x19D2 DUP8 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x1B8D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A0A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EF1 JUMP JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 DUP4 LT ISZERO PUSH2 0x1A48 JUMPI PUSH2 0x1A3D DUP12 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1A28 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD CALLER PUSH2 0x1F6B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1A0F JUMP JUMPDEST POP POP POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP7 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1AB8 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F90 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1AD2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1AE6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x1AF5 DUP6 DUP6 DUP6 PUSH2 0xBD6 JUMP JUMPDEST SWAP2 POP PUSH2 0x1B01 DUP7 DUP4 PUSH2 0xCA4 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x1B3B JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x1B39 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B9F PUSH2 0x251C PUSH2 0x2710 DUP7 PUSH2 0x11C8 JUMP JUMPDEST SWAP1 SWAP3 LT ISZERO SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1BB2 PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1BBF PUSH2 0x20ED JUMP JUMPDEST PUSH1 0x0 SWAP4 POP JUMPDEST DUP8 MLOAD DUP5 LT ISZERO PUSH2 0x1ED8 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1C71 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1C46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1C71 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1C54 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C84 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1D39 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D0E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D39 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D1C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D4C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP5 MLOAD PUSH2 0x1D68 SWAP1 DUP8 SWAP1 PUSH2 0xCA4 JUMP JUMPDEST SWAP3 POP PUSH2 0x1DB6 DUP9 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xB0B DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D9A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP12 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAF8 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD DUP10 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH4 0xB4BE83D5 SWAP1 DUP11 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x1DE7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DFC DUP6 PUSH1 0x1 PUSH2 0x1B43 JUMP JUMPDEST DUP11 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1E0A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1E4E SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2F50 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1E68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E7C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1EA0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x279A JUMP JUMPDEST SWAP1 POP PUSH2 0x1EB4 DUP2 PUSH1 0x0 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD PUSH2 0xCA4 JUMP JUMPDEST DUP2 MSTORE PUSH2 0x1EC0 DUP6 DUP3 PUSH2 0x132E JUMP JUMPDEST DUP5 MLOAD DUP7 GT PUSH2 0x1ECD JUMPI PUSH2 0x1ED8 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x1BC4 JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1EF6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1B86 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1F06 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x1B82 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EC1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x1F4C JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x1F64 JUMPI DUP2 PUSH2 0xBCF JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x60 PUSH2 0x1F81 DUP6 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0xCEB AND JUMP JUMPDEST SWAP3 POP PUSH2 0x1F94 DUP6 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x203B AND JUMP JUMPDEST SWAP2 POP PUSH2 0x1FA7 DUP6 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x2047 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB88D4FDE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH4 0xB88D4FDE SWAP1 PUSH2 0x2002 SWAP1 ADDRESS SWAP1 DUP9 SWAP1 DUP8 SWAP1 DUP8 SWAP1 PUSH1 0x4 ADD PUSH2 0x2D99 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x201C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x2030 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP4 DUP4 PUSH2 0x20A2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x2055 DUP5 DUP5 PUSH2 0x203B JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x209C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2E91 JUMP JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x20E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xF4 SWAP1 PUSH2 0x2EB1 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3036 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x2153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x2166 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST PUSH2 0x2F9E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x218E DUP9 DUP3 PUSH2 0x220D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2178 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x21B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21C3 PUSH2 0x2161 DUP3 PUSH2 0x2FC5 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x61C JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x21EB DUP9 DUP3 PUSH2 0x231D JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x221E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x222C PUSH2 0x2161 DUP3 PUSH2 0x2FE6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x2248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA70 DUP4 DUP3 DUP5 PUSH2 0x3084 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2265 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x226F PUSH1 0x80 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x227D DUP5 DUP5 PUSH2 0x2201 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x228E DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x22A2 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x22B6 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x22D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x22DE PUSH1 0x60 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x22EC DUP5 DUP5 PUSH2 0x247E JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x22FD DUP5 DUP5 DUP4 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x2311 DUP5 DUP3 DUP6 ADD PUSH2 0x2201 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x233B PUSH2 0x180 PUSH2 0x2F9E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x2349 DUP5 DUP5 PUSH2 0x2136 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x235A DUP5 DUP5 DUP4 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x236E DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x2382 DUP5 DUP3 DUP6 ADD PUSH2 0x2136 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x2396 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x23AA DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x23BE DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x23D2 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x23E7 DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x23FD DUP5 DUP3 DUP6 ADD PUSH2 0x2472 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x241F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x242B DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2459 DUP5 DUP3 DUP6 ADD PUSH2 0x220D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x3074 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 CALLDATALOAD PUSH2 0x307B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBCF DUP3 MLOAD PUSH2 0x307E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x24A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x24AC DUP8 DUP8 PUSH2 0x2136 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x24BD DUP8 DUP3 DUP9 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x24CE DUP8 DUP3 DUP9 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x24EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x24F7 DUP8 DUP3 DUP9 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2518 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2524 DUP7 DUP7 PUSH2 0x2136 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x2535 DUP7 DUP3 DUP8 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2552 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x255E DUP7 DUP3 DUP8 ADD PUSH2 0x220D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x2581 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2598 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25A4 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25CD DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x25EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x25F6 DUP10 DUP3 DUP11 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2613 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x261F DUP10 DUP3 DUP11 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x2630 DUP10 DUP3 DUP11 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x2641 DUP10 DUP3 DUP11 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x2669 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x268C DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26B5 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x26DE DUP11 DUP3 DUP12 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x26FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2707 DUP11 DUP3 DUP12 ADD PUSH2 0x2142 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 PUSH2 0x2718 DUP11 DUP3 DUP12 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x2729 DUP11 DUP3 DUP12 ADD PUSH2 0x2466 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x273A DUP11 DUP3 DUP12 ADD PUSH2 0x2136 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x275C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x2773 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x277F DUP6 DUP3 DUP7 ADD PUSH2 0x21A4 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x2790 DUP6 DUP3 DUP7 ADD PUSH2 0x2472 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x2253 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x27CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x11DD DUP5 DUP5 PUSH2 0x22C2 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3036 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x27F0 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2809 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x2824 DUP4 DUP4 MLOAD PUSH2 0x2907 JUMP JUMPDEST SWAP3 POP PUSH2 0x282F DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x280C JUMP JUMPDEST POP SWAP1 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2857 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP DUP4 PUSH1 0x20 DUP3 MUL DUP6 ADD PUSH2 0x2870 DUP6 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x2840 JUMPI DUP4 DUP4 SUB DUP9 MSTORE PUSH2 0x288B DUP4 DUP4 MLOAD PUSH2 0x2C84 JUMP JUMPDEST SWAP3 POP PUSH2 0x2896 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP9 SWAP1 SWAP9 ADD SWAP8 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x2873 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x28B2 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x28C4 DUP4 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x28F4 JUMPI PUSH2 0x28DA DUP7 DUP4 MLOAD PUSH2 0x2D90 JUMP JUMPDEST PUSH2 0x28E3 DUP3 PUSH2 0x302C JUMP JUMPDEST PUSH1 0x20 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x28C7 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x304F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2912 DUP3 PUSH2 0x3032 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2926 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x3090 JUMP JUMPDEST PUSH2 0x292F DUP2 PUSH2 0x30BC JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x30 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x56414C55455F475245415445525F5448414E5F5A45524F000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50524F504F5254494F4E5F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x16 DUP2 MSTORE PUSH32 0x554E41434345505441424C455F5448524553484F4C4400000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x2C4B DUP5 DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x2C5E PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2C71 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x11C2 PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x2C99 DUP6 DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x2CAC PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x2CBF PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x2CD2 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x27D6 JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x2CE5 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x2CF8 PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x2D0B PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x2D1E PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x2D33 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x2D48 PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x2D90 JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x2D62 DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x2D7E DUP3 DUP3 PUSH2 0x2907 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x3074 JUMP JUMPDEST PUSH2 0x27DF DUP2 PUSH2 0x307B JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2DA7 DUP3 DUP8 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DB4 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0x2DC1 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x2DD3 DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2DEB DUP3 DUP6 PUSH2 0x27D6 JUMP JUMPDEST PUSH2 0xBCF PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E09 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E1D DUP2 DUP6 PUSH2 0x28A7 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2E42 DUP2 DUP7 PUSH2 0x284C JUMP JUMPDEST SWAP1 POP PUSH2 0x2E51 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x27E5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x28FE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x293C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2992 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x29C2 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A18 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A48 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2A9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2ACE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2AFE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B2E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2B5E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BB4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCE5 DUP2 PUSH2 0x2BE4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2C3A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBCF DUP2 DUP5 PUSH2 0x2C84 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2F61 DUP2 DUP7 PUSH2 0x2C84 JUMP JUMPDEST SWAP1 POP PUSH2 0x2F70 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x2D90 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x2D7E DUP2 DUP5 PUSH2 0x2907 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D87 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xCE5 DUP3 DUP5 PUSH2 0x2D90 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2FFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH2 0xFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x30AB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3093 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11C2 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xb7 EXTCODECOPY CALLVALUE REVERT 0xd0 SMOD 0x4f PUSH22 0xC38120F3E5867A8AC00D0D638473186785135C77973C PUSH18 0xA26C6578706572696D656E74616CF5003700 ",
"sourceMap": "834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1170:11:3;;;;1148:10;:34;1127:116;;;;;;;;;;;;;;;;;;;;;;834:541:0;1336:209:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1336:209:6;;;;;;;;;;;;;;;;;;;;;;;;;2954:2408:4;;;;;;;;;;;;;;;;;;1419:950:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1419:950:2;;;;;;;;;925:59:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;925:59:3;;;;;;;;;;;;6720:1894:4;;;;;;;;;;786:53:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;786:53:3;;;;875:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;875:37:3;;;;2778:732:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2778:732:2;;;;;;;;;3919:1414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3919:1414:2;;;;;;;;;1147:183:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1147:183:6;;;;;;;;;1336:209;1079:60;;;;;;;;;;;;;;;;;;;;;1336:209;;;;;;:::o;2954:2408:4:-;3256:35;;:::i;:::-;3332:9;3307:22;;;3372:18;;;3351:88;;;;;;;;;;;;;;3535:100;3558:14;3586:13;3613:12;3535:9;:100::i;:::-;3512:123;;3670:37;3678:14;3694:12;3670:7;:37::i;:::-;3645:62;;3774:11;;;;;;;;;;;:19;;;3800:14;3774:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3774:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3774:43:4;;;;;4011:50;4032:6;4039:1;4032:9;;;;;;;;;;;;;;;;;;:24;;;4058:2;4011:20;:50::i;:::-;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:78;;-1:-1:-1;4071:42:4;;4098:15;4071:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;4078:1;4071:9;;;;;;;;;;;;;;;;;;;:24;;:42;4156:9;;;4127:39;;;4156:9;;4127:39;4123:614;;;4366:125;4411:6;4435:10;4463:14;4366:27;:125::i;:::-;4347:144;;4123:614;;;4541:185;4588:6;4612:10;4640:9;4667:13;4698:14;4541:29;:185::i;:::-;4522:204;;4123:614;4862:39;;;;4844:57;;;4823:121;;;;;;;;;;;;;;5044:39;;;;5026:57;;5005:126;;;;;;;;;;;;;;5186:136;5218:17;5249:10;5273:16;:39;;;5186:18;:136::i;:::-;2954:2408;;;;;;;;;;;;:::o;1419:950:2:-;1583:35;;:::i;:::-;1639:9;1692:37;1816;2035:35;;:::i;:::-;1651:1;1639:13;;1634:696;1658:6;:13;1654:1;:17;1634:696;;;1732:70;1740:20;1762:16;:39;;;1732:7;:70::i;:::-;1692:110;;1856:165;1890:6;1897:1;1890:9;;;;;;;;;;;;;;;;;;:26;;;1934:6;1941:1;1934:9;;;;;;;;;;;;;;;;;;:26;;;1978:29;1856:16;:165::i;:::-;1816:205;;2073:62;2094:6;2101:1;2094:9;;;;;;;;;;;;;;;;;;2105:29;2073:20;:62::i;:::-;2035:100;;2149:50;2164:16;2182;2149:14;:50::i;:::-;2217:39;;:63;;2213:107;;;2300:5;;2213:107;1673:3;;;;;1634:696;;;1419:950;;;;;;;;:::o;925:59:3:-;980:4;925:59;:::o;6720:1894:4:-;7061:35;;:::i;:::-;7137:9;7112:22;7177:18;;;7156:88;;;;;;;;;;;;;;7298:1;7275:24;;7254:94;;;;;;;;;;;;;;7379:48;7399:6;7406:1;7399:9;;;;;;;;;;;;;;;;;;:24;;;7425:1;7379:19;:48::i;:::-;1204:32;;;;;;;;;;;;;;;;7358:69;;-1:-1:-1;7458:28:4;;;;;;;;:61;;-1:-1:-1;1292:47:4;;;;;;;;;;;;;;;;;;;;;7490:29;;;;;;;7458:61;7437:131;;;;;;;;;;;;;;;;7579:11;;;;;;;;;;;:19;;;7605:14;7579:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7579:43:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1204:32:4;;;;;;;;;;;;;;;;7636:28;;;;;;;7632:505;;-1:-1:-1;7632:505:4;;-1:-1:-1;;7632:505:4;7699:190;7745:6;7769:10;7797:9;7824:13;7855:20;7699:28;:190::i;:::-;7680:209;;7632:505;;;1292:47;;;;;;;;;;;;;;;;;;;;;7910:29;;;;;;;7906:231;;;7974:152;8020:6;8044:10;8072:9;8099:13;7974:28;:152::i;:::-;7955:171;;7906:231;8262:39;;;;8244:57;;;8223:121;;;;;;;;;;;;;;8354:220;8394:64;8402:14;8418:16;:39;;;8394:7;:64::i;:::-;8472:16;:39;;;8525:13;8552:12;8354:26;:220::i;:::-;6720:1894;;;;;;;;;;;:::o;786:53:3:-;834:5;786:53;:::o;875:37::-;908:4;875:37;:::o;2778:732:2:-;2943:35;;:::i;:::-;2999:9;3052:37;3176:35;;:::i;:::-;3011:1;2999:13;;2994:477;3018:6;:13;3014:1;:17;2994:477;;;3092:70;3100:20;3122:16;:39;;;3092:7;:70::i;:::-;3052:110;;3214:62;3235:6;3242:1;3235:9;;;;;;;;;3214:62;3176:100;;3290:50;3305:16;3323;3290:14;:50::i;:::-;3401:20;3358:16;:39;;;:63;3354:107;;;3441:5;;3354:107;3033:3;;;;;2994:477;;;2778:732;;;;;;;:::o;3919:1414::-;4079:35;;:::i;:::-;4135:9;4188:30;4479:31;4747:35;;:::i;:::-;4147:1;4135:13;;4130:1164;4154:6;:13;4150:1;:17;4130:1164;;;4221:63;4229:13;4244:16;:39;;;4221:7;:63::i;:::-;4188:96;;4513:220;4547:6;4554:1;4547:9;;;;;;;;;;;;;;;;;;:26;;;4591:55;4599:6;4606:1;4599:9;;;;;;;;;;;;;;;;;;:26;;;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:18;;;4591:7;:55::i;:::-;4697:22;4513:16;:220::i;:::-;4479:254;;4785:68;4806:6;4813:1;4806:9;;;;;;;;;;;;;;;;;;4817:35;4825:23;4850:1;4817:7;:35::i;:::-;4785:20;:68::i;:::-;4747:106;;4910:79;4918:16;:39;;;4959:16;:29;;;4910:7;:79::i;:::-;4868:121;;5003:50;5018:16;4868;5003:14;:50::i;:::-;5188:39;;:56;-1:-1:-1;5184:100:2;;5264:5;;5184:100;4169:3;;;;;4130:1164;;1147:183:6;961:52;;;;;;;;;;;;;;;;;;;;;1147:183;;;;;;:::o;1644:695:3:-;1795:20;1851:1;1835:13;:17;;;:47;;;;-1:-1:-1;1856:26:3;;;;;1835:47;1831:473;;;908:4;1923:24;;;;;1898:107;;;;;;;;;;;;;;2111:133;;;;834:5;2216:14;2111:16;:133::i;:::-;2258:35;;2096:148;;-1:-1:-1;2258:21:3;;;;:35;;;;;2096:148;;2258:35;;;;2096:148;2258:21;:35;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2258:35:3;1644:695;;;;;:::o;501:207:30:-;587:7;631:6;;;;610:69;;;;;;;;;;;;;;-1:-1:-1;696:5:30;;;501:207;;;;;:::o;10259:886:29:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:29;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;11418:994:4:-;11602:35;;:::i;:::-;12042:23;11759:8;;:107;;;;;:8;;;;;:25;;:107;;11798:6;;11818:14;;11846:10;;11759:107;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11759:107:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11759:107:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11759:107:4;;;;;;;;;11740:126;;12068:79;12076:16;:39;;;12117:16;:29;;;12068:7;:79::i;:::-;12042:105;;12178:79;12200:16;:39;;;12241:15;12178:21;:79::i;:::-;12157:148;;;;;;;;;;;;;;;;12315:57;;;11418:994;-1:-1:-1;;;11418:994:4:o;9162:1906::-;9429:35;;:::i;:::-;9480:31;9538:46;;:::i;:::-;9808:35;;:::i;:::-;10741:41;;:::i;:::-;9514:14;9480:48;;9587:50;9614:6;9622:14;9587:26;:50::i;:::-;9538:99;;9694:1;9651:27;:40;;;:44;9647:998;;;9846:150;9884:9;9911:13;9942:27;:40;;;9846:20;:150::i;:::-;9808:188;;10134:161;10177:14;10213:64;10221:14;10237:16;:39;;;10213:7;:64::i;:::-;10134:21;:161::i;:::-;10109:242;;;;;;;;;;;;;;;;10391:73;10399:23;10424:16;:39;;;10391:7;:73::i;:::-;10510:29;;;;;10478;;;:61;10595:39;;;;;10553;;;:81;10365:99;-1:-1:-1;9647:998:4;10785:8;;:116;;;;;:8;;;;;:25;;:116;;10824:6;;10844:23;;10881:10;;10785:116;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10785:116:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10785:116:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;10785:116:4;;;;;;;;;10741:160;;10972:56;10987:16;11005:22;10972:14;:56::i;:::-;9162:1906;;;;;;;;;;;:::o;1551:1224:6:-;866:38;;;;;;;;;;;;;;;;1809:12;;1824:10;;;;866:38;1835:105;;1908:2;;1924:6;;1835:105;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1835:105:6;;;49:4:-1;25:18;;61:17;;1835:105:6;182:15:-1;1835:105:6;;;;179:29:-1;;;;160:49;;1824:117:6;;;1835:105;;1824:117;;;;25:18:-1;1824:117:6;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1824:117:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1951:69:6;;;;;;;;;;;;;;;;;2399:14;2396:2;;;-1:-1:-1;2443:1:6;2467:14;2483:2;2464:22;2461:2;;;2605;2602:1;2599;2584:24;-1:-1:-1;2646:1:6;2640:8;2461:2;2720:7;2699:69;;;;;;;;;;;;;;;;1551:1224;;;;:::o;937:326:24:-;1091:21;1144:82;1165:26;1173:9;1184:6;1165:7;:26::i;:::-;1205:11;1144:7;:82::i;:::-;1128:98;937:326;-1:-1:-1;;;;937:326:24:o;5694:1215:2:-;5852:30;;:::i;:::-;5898:35;;:::i;:::-;6093:33;5936:8;;:28;;;;;6093:33;;5936:8;;;:21;;:28;;5958:5;;5936:28;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5936:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5936:28:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5936:28:2;;;;;;;;;5978:21;;5898:66;;-1:-1:-1;5978:61:2;;6009:29;5978:61;5974:110;;6055:18;;5974:110;6129:70;6137:5;:22;;;6161:9;:37;;;6129:7;:70::i;:::-;6093:106;;6242:55;6249:20;6271:25;6242:6;:55::i;:::-;6209:88;;6345:22;6308:11;:34;;:59;;;;;6414:134;6444:22;6480:5;:22;;;6516:5;:22;;;6414:16;:134::i;:::-;6377:171;;6651:22;;;;6687:14;;;;6585:126;;6615:22;;6585:16;:126::i;:::-;6558:24;;;:153;6814:22;;;;6850:14;;;;6748:126;;6778:22;;6748:16;:126::i;:::-;6721:24;;;:153;5694:1215;;;;;;;:::o;1772:648:23:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:23:o;15559:559:29:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:29;15862:10;15856:17;16012:66;16000:79;;15559:559::o;13021:3595:4:-;13293:50;;:::i;:::-;13454:25;14027:35;;:::i;:::-;14951:45;;:::i;:::-;15236:38;;:::i;:::-;13482:50;13503:6;13510:1;13503:9;;;;;;;;;13482:50;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13454:78;;-1:-1:-1;13747:42:4;;13774:15;13747:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;13754:1;13747:9;;;;;;;;;;;;;;;;;;;:24;;:42;14105:9;;;14076:39;;;14105:9;;14076:39;14072:2304;;;14150:124;14188:6;14212:10;14240:20;14150;:124::i;:::-;14398:39;;14131:143;;-1:-1:-1;14398:63:4;-1:-1:-1;14398:63:4;14373:144;;;;;;;;;;;;;;14531:50;14546:16;14564;14531:14;:50::i;:::-;14620:244;14663:79;14671:16;:39;;;14712:16;:29;;;14663:7;:79::i;:::-;14777:39;;14620:21;:244::i;:::-;14595:325;;;;;;;;;;;;;;;;14072:2304;;;14999:55;15025:6;15033:20;14999:25;:55::i;:::-;14951:103;;15114:1;15072:26;:39;;;:43;15068:573;;;15277:165;15319:9;15350:13;15385:26;:39;;;15277:20;:165::i;:::-;15502:42;;;;;15460:39;;;:84;15594:32;;;;;15562:29;;;:64;15236:206;-1:-1:-1;15068:573:4;15759:8;;:128;;;;;:8;;;;;:24;;:128;;15801:6;;15825:20;;15863:10;;15759:128;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15759:128:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15759:128:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15759:128:4;;;;;;;;;15926:39;;15740:147;;-1:-1:-1;15926:63:4;;15901:144;;;;;;;;;;;;;;16059:50;16074:16;16092;16059:14;:50::i;:::-;16148:161;16191:16;:39;;;16252:16;:39;;;16148:21;:161::i;:::-;16123:242;;;;;;;;;;;;;;;;16440:136;16472:17;16503:10;16527:16;:39;;;16440:18;:136::i;17161:2228::-;17395:50;;:::i;:::-;17461:25;17496:20;17542:38;17625:9;18304:38;;:::i;:::-;18668:35;;:::i;:::-;17519:6;:13;17496:36;;17597:12;17583:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;17583:27:4;;17542:68;;17637:1;17625:13;;17620:543;17644:12;17640:1;:16;17620:543;;;17730:46;17738:17;17757:6;17764:1;17757:9;;;;;;;;;;;;;;;;;;:18;;;17730:7;:46::i;:::-;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17710:66;;-1:-1:-1;17977:42:4;;18004:15;17977:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;17984:1;17977:9;;;;;;;;;;;;;;;;;;;:24;;:42;18126:9;;:6;;18133:1;;18126:9;;;;;;;;;;;;;;:26;;;18099:21;18121:1;18099:24;;;;;;;;;;;;;;;;;;:53;17658:3;;;;;17620:543;;;18196:1;18176:17;:21;18172:487;;;18345:127;18383:9;18410:13;18441:17;18345:20;:127::i;:::-;18518:32;;;;;18486:29;;;:64;18606:42;;;;;18564:39;;;:84;18304:168;-1:-1:-1;18172:487:4;18706:8;;:119;;;;;:8;;;;;:30;;:119;;18750:6;;18770:21;;18805:10;;18706:119;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18706:119:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18706:119:4;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18706:119:4;;;;;;;;;18668:157;;18835:50;18850:16;18868;18835:14;:50::i;:::-;18916:149;18955:16;:39;;;19012:16;:39;;;18916:21;:149::i;:::-;18895:218;;;;;;;;;;;;;;;;19196:1;19192:5;;19187:163;19203:12;19199:1;:16;19187:163;;;19236:103;19273:6;19280:1;19273:9;;;;;;;;;;;;;;;;;;:24;;;19315:10;19236:19;:103::i;:::-;19217:3;;;;;19187:163;;;17161:2228;;;;;;;;;;;;:::o;2960:777:3:-;3391:20;3544:24;3267:1;3247:17;:21;3243:488;;;3284:11;;:39;;;;;:11;;;;;:20;;:39;;3305:17;;3284:39;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3284:39:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3284:39:3;;;;3414:116;3441:14;3473:13;3504:12;3414:9;:116::i;:::-;3391:139;;3571:40;3579:17;3598:12;3571:7;:40::i;:::-;3544:67;;3648:1;3629:16;:20;3625:96;;;3669:37;;:10;;:37;;;;;3689:16;;3669:37;;;;3689:16;3669:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3669:37:3;3625:96;2960:777;;;;;;:::o;714:230:30:-;800:7;835:5;;;871:6;;;;850:69;;;;;;;;;;;;;;936:1;929:8;;714:230;;;;;;:::o;4350:384:3:-;4482:4;;4533:138;980:4;834:5;4642:19;4533:16;:138::i;:::-;4688:39;;;;;4350:384;-1:-1:-1;;;4350:384:3:o;1831:2046:5:-;2006:35;;:::i;:::-;2062:9;2386:29;2675:31;3095:35;;:::i;:::-;2074:1;2062:13;;2057:1781;2081:6;:13;2077:1;:17;2057:1781;;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2235:14;2208:41;;2235:14;2208:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2215:1;2208:9;;;;;;;;;;;;;;;;;;;;:24;;:41;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2290:15;2263:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;2270:1;2263:9;;;;;;;;;;;;;;;;;;;:24;;:42;2440:39;;2418:62;;2426:12;;2418:7;:62::i;:::-;2386:94;;2709:219;2743:6;2750:1;2743:9;;;;;;;;;;;;;;;;;;:26;;;2787:55;2795:6;2802:1;2795:9;;;;;;;;;;;;;;;;;;:26;;;2823:6;2830:1;2823:9;;;;;;;;;2709:219;3133:8;;3169:9;;2675:253;;-1:-1:-1;3133:8:5;;;:18;;3169:6;;3176:1;;3169:9;;;;;;;;;;;;;;3196:35;3204:23;3229:1;3196:7;:35::i;:::-;3249:10;3260:1;3249:13;;;;;;;;;;;;;;;;;;3133:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3133:143:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3133:143:5;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3133:143:5;;;;;;;;;3095:181;;3421:79;3429:16;:39;;;3470:16;:29;;;3421:7;:79::i;:::-;3379:121;;3584:50;3599:16;3379;3584:14;:50::i;:::-;3733:39;;:55;-1:-1:-1;3729:99:5;;3808:5;;3729:99;2096:3;;;;;2057:1781;;;1831:2046;;;;;;;;;:::o;50:288:30:-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;1369:135::-;1454:7;1488:1;1484;:5;:13;;1496:1;1484:13;;;-1:-1:-1;1492:1:30;;1477:20;-1:-1:-1;1369:135:30:o;2781:467:6:-;2929:13;;3033:25;2945;:9;2967:2;2945:25;:21;:25;:::i;:::-;2929:41;-1:-1:-1;2998:25:6;:9;3020:2;2998:25;:21;:25;:::i;:::-;2980:43;-1:-1:-1;3061:34:6;:9;3091:3;3061:34;:29;:34;:::i;:::-;3105:136;;;;;3033:62;;-1:-1:-1;3105:36:6;;;;;;:136;;3163:4;;3182:2;;3198:7;;3033:62;;3105:136;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3105:136:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3105:136:6;;;;2781:467;;;;;:::o;14699:195:29:-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;16441:672::-;16570:19;16644:25;16672:21;16684:1;16687:5;16672:11;:21::i;:::-;16644:49;;16712:2;16703:11;;;;16848:17;16840:5;:25;16828:1;:8;:37;;16807:132;;;;;;;;;;;;;;;;-1:-1:-1;;17061:13:29;;16441:672::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:29;13620:2;13718:13;13712:20;;13281:490::o;834:541:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;834:541:0;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1622:122;;1700:39;1731:6;1725:13;1700:39;;1752:432;;1842:4;1830:17;;1826:27;-1:-1;1816:2;;1867:1;1864;1857:12;1816:2;1904:6;1891:20;1926:60;1941:44;1978:6;1941:44;;1926:60;1917:69;;2006:6;1999:5;1992:21;2042:4;2034:6;2030:17;2075:4;2068:5;2064:16;2110:3;2101:6;2096:3;2092:16;2089:25;2086:2;;;2127:1;2124;2117:12;2086:2;2137:41;2171:6;2166:3;2161;2137:41;;2681:865;;2810:4;2798:9;2793:3;2789:19;2785:30;2782:2;;;2828:1;2825;2818:12;2782:2;2846:20;2861:4;2846:20;;;2837:29;-1:-1;2934:1;2965:60;3021:3;3001:9;2965:60;;;2941:85;;-1:-1;3105:2;3138:60;3194:3;3170:22;;;3138:60;;;3131:4;3124:5;3120:16;3113:86;3047:163;3268:2;3301:60;3357:3;3348:6;3337:9;3333:22;3301:60;;;3294:4;3287:5;3283:16;3276:86;3220:153;3431:2;3464:60;3520:3;3511:6;3500:9;3496:22;3464:60;;;3457:4;3450:5;3446:16;3439:86;3383:153;2776:770;;;;;3585:689;;3712:4;3700:9;3695:3;3691:19;3687:30;3684:2;;;3730:1;3727;3720:12;3684:2;3748:20;3763:4;3748:20;;;3739:29;-1:-1;3825:1;3856:58;3910:3;3890:9;3856:58;;;3832:83;;-1:-1;3981:2;4014:60;4070:3;4046:22;;;4014:60;;;4007:4;4000:5;3996:16;3989:86;3936:150;4159:2;4192:60;4248:3;4239:6;4228:9;4224:22;4192:60;;;4185:4;4178:5;4174:16;4167:86;4096:168;3678:596;;;;;4309:2205;;4417:5;4405:9;4400:3;4396:19;4392:31;4389:2;;;4436:1;4433;4426:12;4389:2;4454:21;4469:5;4454:21;;;4445:30;-1:-1;4533:1;4564:49;4609:3;4589:9;4564:49;;;4540:74;;-1:-1;4683:2;4716:49;4761:3;4737:22;;;4716:49;;;4709:4;4702:5;4698:16;4691:75;4635:142;4842:2;4875:49;4920:3;4911:6;4900:9;4896:22;4875:49;;;4868:4;4861:5;4857:16;4850:75;4787:149;4995:2;5028:49;5073:3;5064:6;5053:9;5049:22;5028:49;;;5021:4;5014:5;5010:16;5003:75;4946:143;5151:3;5185:49;5230:3;5221:6;5210:9;5206:22;5185:49;;;5178:4;5171:5;5167:16;5160:75;5099:147;5308:3;5342:49;5387:3;5378:6;5367:9;5363:22;5342:49;;;5335:4;5328:5;5324:16;5317:75;5256:147;5457:3;5491:49;5536:3;5527:6;5516:9;5512:22;5491:49;;;5484:4;5477:5;5473:16;5466:75;5413:139;5606:3;5640:49;5685:3;5676:6;5665:9;5661:22;5640:49;;;5633:4;5626:5;5622:16;5615:75;5562:139;5768:3;5803:49;5848:3;5839:6;5828:9;5824:22;5803:49;;;5795:5;5788;5784:17;5777:76;5711:153;5914:3;5949:49;5994:3;5985:6;5974:9;5970:22;5949:49;;;5941:5;5934;5930:17;5923:76;5874:136;6098:3;6087:9;6083:19;6070:33;6123:18;6115:6;6112:30;6109:2;;;6155:1;6152;6145:12;6109:2;6191:54;6241:3;6232:6;6221:9;6217:22;6191:54;;;6183:5;6176;6172:17;6165:81;6020:237;6345:3;6334:9;6330:19;6317:33;6370:18;6362:6;6359:30;6356:2;;;6402:1;6399;6392:12;6356:2;6438:54;6488:3;6479:6;6468:9;6464:22;6438:54;;;6430:5;6423;6419:17;6412:81;6267:237;4383:2131;;;;;6521:116;;6587:45;6624:6;6611:20;6587:45;;6644:118;;6711:46;6749:6;6736:20;6711:46;;6898:118;;6974:37;7003:6;6997:13;6974:37;;7023:721;;;;;7187:3;7175:9;7166:7;7162:23;7158:33;7155:2;;;7204:1;7201;7194:12;7155:2;7239:1;7256:53;7301:7;7281:9;7256:53;;;7246:63;;7218:97;7346:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;;;7354:63;;7325:98;7454:2;7472:53;7517:7;7508:6;7497:9;7493:22;7472:53;;;7462:63;;7433:98;7590:2;7579:9;7575:18;7562:32;7614:18;7606:6;7603:30;7600:2;;;7646:1;7643;7636:12;7600:2;7666:62;7720:7;7711:6;7700:9;7696:22;7666:62;;;7656:72;;7541:193;7149:595;;;;;;;;7751;;;;7898:2;7886:9;7877:7;7873:23;7869:32;7866:2;;;7914:1;7911;7904:12;7866:2;7949:1;7966:53;8011:7;7991:9;7966:53;;;7956:63;;7928:97;8056:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;;;8064:63;;8035:98;8192:2;8181:9;8177:18;8164:32;8216:18;8208:6;8205:30;8202:2;;;8248:1;8245;8238:12;8202:2;8268:62;8322:7;8313:6;8302:9;8298:22;8268:62;;;8258:72;;8143:193;7860:486;;;;;;8353:1507;;;;;;;8689:3;8677:9;8668:7;8664:23;8660:33;8657:2;;;8706:1;8703;8696:12;8657:2;8741:31;;8792:18;8781:30;;8778:2;;;8824:1;8821;8814:12;8778:2;8844:97;8933:7;8924:6;8913:9;8909:22;8844:97;;;8834:107;;8720:227;9006:2;8995:9;8991:18;8978:32;9030:18;9022:6;9019:30;9016:2;;;9062:1;9059;9052:12;9016:2;9082:83;9157:7;9148:6;9137:9;9133:22;9082:83;;;9072:93;;8957:214;9230:2;9219:9;9215:18;9202:32;9254:18;9246:6;9243:30;9240:2;;;9286:1;9283;9276:12;9240:2;9306:97;9395:7;9386:6;9375:9;9371:22;9306:97;;;9296:107;;9181:228;9468:2;9457:9;9453:18;9440:32;9492:18;9484:6;9481:30;9478:2;;;9524:1;9521;9514:12;9478:2;9544:83;9619:7;9610:6;9599:9;9595:22;9544:83;;;9534:93;;9419:214;9664:3;9683:52;9727:7;9718:6;9707:9;9703:22;9683:52;;;9673:62;;9643:98;9772:3;9791:53;9836:7;9827:6;9816:9;9812:22;9791:53;;;9781:63;;9751:99;8651:1209;;;;;;;;;9867:1633;;;;;;;;10220:3;10208:9;10199:7;10195:23;10191:33;10188:2;;;10237:1;10234;10227:12;10188:2;10272:31;;10323:18;10312:30;;10309:2;;;10355:1;10352;10345:12;10309:2;10375:97;10464:7;10455:6;10444:9;10440:22;10375:97;;;10365:107;;10251:227;10537:2;10526:9;10522:18;10509:32;10561:18;10553:6;10550:30;10547:2;;;10593:1;10590;10583:12;10547:2;10613:83;10688:7;10679:6;10668:9;10664:22;10613:83;;;10603:93;;10488:214;10761:2;10750:9;10746:18;10733:32;10785:18;10777:6;10774:30;10771:2;;;10817:1;10814;10807:12;10771:2;10837:97;10926:7;10917:6;10906:9;10902:22;10837:97;;;10827:107;;10712:228;10999:2;10988:9;10984:18;10971:32;11023:18;11015:6;11012:30;11009:2;;;11055:1;11052;11045:12;11009:2;11075:83;11150:7;11141:6;11130:9;11126:22;11075:83;;;11065:93;;10950:214;11195:3;11214:53;11259:7;11250:6;11239:9;11235:22;11214:53;;;11204:63;;11174:99;11304:3;11323:52;11367:7;11358:6;11347:9;11343:22;11323:52;;;11313:62;;11283:98;11412:3;11431:53;11476:7;11467:6;11456:9;11452:22;11431:53;;;11421:63;;11391:99;10182:1318;;;;;;;;;;;11507:540;;;11672:2;11660:9;11651:7;11647:23;11643:32;11640:2;;;11688:1;11685;11678:12;11640:2;11723:31;;11774:18;11763:30;;11760:2;;;11806:1;11803;11796:12;11760:2;11826:97;11915:7;11906:6;11895:9;11891:22;11826:97;;;11816:107;;11702:227;11960:2;11978:53;12023:7;12014:6;12003:9;11999:22;11978:53;;;11968:63;;11939:98;11634:413;;;;;;12054:322;;12198:3;12186:9;12177:7;12173:23;12169:33;12166:2;;;12215:1;12212;12205:12;12166:2;12250:1;12267:93;12352:7;12332:9;12267:93;;12383:317;;12525:2;12513:9;12504:7;12500:23;12496:32;12493:2;;;12541:1;12538;12531:12;12493:2;12576:1;12593:91;12676:7;12656:9;12593:91;;12707:110;12780:31;12805:5;12780:31;;;12775:3;12768:44;12762:55;;;12851:766;;12996:59;13049:5;12996:59;;;13073:6;13068:3;13061:19;13097:4;13092:3;13088:14;13081:21;;13145:3;13187:4;13179:6;13175:17;13170:3;13166:27;13213:61;13268:5;13213:61;;;13295:1;13280:298;13305:6;13302:1;13299:13;13280:298;;;13367:9;13361:4;13357:20;13352:3;13345:33;13393:68;13456:4;13447:6;13441:13;13393:68;;;13385:76;;13478:65;13536:6;13478:65;;;13566:4;13557:14;;;;;13468:75;-1:-1;13327:1;13320:9;13280:298;;;-1:-1;13591:4;;12975:642;-1:-1;;;;;;12975:642;13684:864;;13857:73;13924:5;13857:73;;;13948:6;13943:3;13936:19;13972:4;13967:3;13963:14;13956:21;;14020:3;14062:4;14054:6;14050:17;14045:3;14041:27;14088:75;14157:5;14088:75;;;14184:1;14169:340;14194:6;14191:1;14188:13;14169:340;;;14256:9;14250:4;14246:20;14241:3;14234:33;14282:96;14373:4;14364:6;14358:13;14282:96;;;14274:104;;14395:79;14467:6;14395:79;;;14497:4;14488:14;;;;;14385:89;-1:-1;14216:1;14209:9;14169:340;;14587:590;;14722:54;14770:5;14722:54;;;14794:6;14789:3;14782:19;14818:4;14813:3;14809:14;14802:21;;14863:56;14913:5;14863:56;;;14940:1;14925:230;14950:6;14947:1;14944:13;14925:230;;;14990:53;15039:3;15030:6;15024:13;14990:53;;;15060:60;15113:6;15060:60;;;15143:4;15134:14;;;;;15050:70;-1:-1;14972:1;14965:9;14925:230;;;-1:-1;15168:3;;14701:476;-1:-1;;;;14701:476;15185:107;15256:30;15280:5;15256:30;;15299:297;;15399:38;15431:5;15399:38;;;15454:6;15449:3;15442:19;15466:63;15522:6;15515:4;15510:3;15506:14;15499:4;15492:5;15488:16;15466:63;;;15561:29;15583:6;15561:29;;;15541:50;;;15554:4;15541:50;;15379:217;-1:-1;;;15379:217;15900:397;16055:2;16043:15;;16092:66;16087:2;16078:12;;16071:88;16193:66;16188:2;16179:12;;16172:88;16288:2;16279:12;;16036:261;16306:296;16461:2;16449:15;;16498:66;16493:2;16484:12;;16477:88;16593:2;16584:12;;16442:160;16611:397;16766:2;16754:15;;16803:66;16798:2;16789:12;;16782:88;16904:66;16899:2;16890:12;;16883:88;16999:2;16990:12;;16747:261;17017:296;17172:2;17160:15;;17209:66;17204:2;17195:12;;17188:88;17304:2;17295:12;;17153:160;17322:397;17477:2;17465:15;;17514:66;17509:2;17500:12;;17493:88;17615:66;17610:2;17601:12;;17594:88;17710:2;17701:12;;17458:261;17728:296;17883:2;17871:15;;17920:66;17915:2;17906:12;;17899:88;18015:2;18006:12;;17864:160;18033:296;18188:2;18176:15;;18225:66;18220:2;18211:12;;18204:88;18320:2;18311:12;;18169:160;18338:296;18493:2;18481:15;;18530:66;18525:2;18516:12;;18509:88;18625:2;18616:12;;18474:160;18643:296;18798:2;18786:15;;18835:66;18830:2;18821:12;;18814:88;18930:2;18921:12;;18779:160;18948:397;19103:2;19091:15;;19140:66;19135:2;19126:12;;19119:88;19241:66;19236:2;19227:12;;19220:88;19336:2;19327:12;;19084:261;19354:296;19509:2;19497:15;;19546:66;19541:2;19532:12;;19525:88;19641:2;19632:12;;19490:160;19659:397;19814:2;19802:15;;19851:66;19846:2;19837:12;;19830:88;19952:66;19947:2;19938:12;;19931:88;20047:2;20038:12;;19795:261;20141:888;20369:22;;20282:4;20273:14;;;20403:61;20277:3;20369:22;20403:61;;;20302:174;20570:4;20563:5;20559:16;20553:23;20588:62;20644:4;20639:3;20635:14;20622:11;20588:62;;;20486:176;20746:4;20739:5;20735:16;20729:23;20764:62;20820:4;20815:3;20811:14;20798:11;20764:62;;;20672:166;20922:4;20915:5;20911:16;20905:23;20940:62;20996:4;20991:3;20987:14;20974:11;20940:62;;21089:2419;21304:22;;21089:2419;;21226:5;21217:15;;;21338:61;21221:3;21304:22;21338:61;;;21247:164;21495:4;21488:5;21484:16;21478:23;21513:62;21569:4;21564:3;21560:14;21547:11;21513:62;;;21421:166;21678:4;21671:5;21667:16;21661:23;21696:62;21752:4;21747:3;21743:14;21730:11;21696:62;;;21597:173;21855:4;21848:5;21844:16;21838:23;21873:62;21929:4;21924:3;21920:14;21907:11;21873:62;;;21780:167;22035:4;22028:5;22024:16;22018:23;22053:62;22109:4;22104:3;22100:14;22087:11;22053:62;;;21957:170;22215:4;22208:5;22204:16;22198:23;22233:62;22289:4;22284:3;22280:14;22267:11;22233:62;;;22137:170;22387:4;22380:5;22376:16;22370:23;22405:62;22461:4;22456:3;22452:14;22439:11;22405:62;;;22317:162;22559:4;22552:5;22548:16;22542:23;22577:62;22633:4;22628:3;22624:14;22611:11;22577:62;;;22489:162;22744:5;22737;22733:17;22727:24;22763:63;22819:5;22814:3;22810:15;22797:11;22763:63;;;22661:177;22914:5;22907;22903:17;22897:24;22933:63;22989:5;22984:3;22980:15;22967:11;22933:63;;;22848:160;23094:5;23087;23083:17;23077:24;23147:3;23141:4;23137:14;23129:5;23124:3;23120:15;23113:39;23167:66;23228:4;23215:11;23167:66;;;23159:74;;23018:227;23331:5;23324;23320:17;23314:24;23384:3;23378:4;23374:14;23366:5;23361:3;23357:15;23350:39;23404:66;23465:4;23452:11;23404:66;;;23396:74;21199:2309;-1:-1;;;;;21199:2309;25990:107;26061:30;26085:5;26061:30;;26104:110;26177:31;26202:5;26177:31;;26221:581;26431:3;26416:19;;26446:61;26420:9;26480:6;26446:61;;;26518:62;26576:2;26565:9;26561:18;26552:6;26518:62;;;26591;26649:2;26638:9;26634:18;26625:6;26591:62;;;26701:9;26695:4;26691:20;26686:2;26675:9;26671:18;26664:48;26726:66;26787:4;26778:6;26726:66;;;26718:74;26402:400;-1:-1;;;;;;26402:400;26809:294;26945:2;26930:18;;26959:61;26934:9;26993:6;26959:61;;;27031:62;27089:2;27078:9;27074:18;27065:6;27031:62;;27110:935;27472:2;27486:47;;;27457:18;;27547:136;27457:18;27669:6;27547:136;;;27539:144;;27731:9;27725:4;27721:20;27716:2;27705:9;27701:18;27694:48;27756:98;27849:4;27840:6;27756:98;;;27748:106;;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27927:108;28030:4;28021:6;27927:108;;28052:787;28364:2;28378:47;;;28349:18;;28439:136;28349:18;28561:6;28439:136;;;28431:144;;28586:62;28644:2;28633:9;28629:18;28620:6;28586:62;;;28696:9;28690:4;28686:20;28681:2;28670:9;28666:18;28659:48;28721:108;28824:4;28815:6;28721:108;;28846:189;28952:2;28937:18;;28966:59;28941:9;28998:6;28966:59;;29042:387;29223:2;29237:47;;;29208:18;;29298:121;29208:18;29298:121;;29436:387;29617:2;29631:47;;;29602:18;;29692:121;29602:18;29692:121;;29830:387;30011:2;30025:47;;;29996:18;;30086:121;29996:18;30086:121;;30224:387;30405:2;30419:47;;;30390:18;;30480:121;30390:18;30480:121;;30618:387;30799:2;30813:47;;;30784:18;;30874:121;30784:18;30874:121;;31012:387;31193:2;31207:47;;;31178:18;;31268:121;31178:18;31268:121;;31406:387;31587:2;31601:47;;;31572:18;;31662:121;31572:18;31662:121;;31800:387;31981:2;31995:47;;;31966:18;;32056:121;31966:18;32056:121;;32194:387;32375:2;32389:47;;;32360:18;;32450:121;32360:18;32450:121;;32588:387;32769:2;32783:47;;;32754:18;;32844:121;32754:18;32844:121;;32982:387;33163:2;33177:47;;;33148:18;;33238:121;33148:18;33238:121;;33376:387;33557:2;33571:47;;;33542:18;;33632:121;33542:18;33632:121;;33770:310;33936:3;33921:19;;33951:119;33925:9;34043:6;33951:119;;34087:333;34241:2;34255:47;;;34226:18;;34316:94;34226:18;34396:6;34316:94;;34427:603;34647:2;34661:47;;;34632:18;;34722:90;34632:18;34798:6;34722:90;;;34714:98;;34823:62;34881:2;34870:9;34866:18;34857:6;34823:62;;;34933:9;34927:4;34923:20;34918:2;34907:9;34903:18;34896:48;34958:62;35015:4;35006:6;34958:62;;35037:189;35143:2;35128:18;;35157:59;35132:9;35189:6;35157:59;;35233:193;35341:2;35326:18;;35355:61;35330:9;35389:6;35355:61;;35433:256;35495:2;35489:9;35521:17;;;35596:18;35581:34;;35617:22;;;35578:62;35575:2;;;35653:1;35650;35643:12;35575:2;35669;35662:22;35473:216;;-1:-1;35473:216;35696:263;;35860:18;35852:6;35849:30;35846:2;;;35892:1;35889;35882:12;35846:2;-1:-1;35921:4;35909:17;;;35939:15;;35783:176;36250:254;;36389:18;36381:6;36378:30;36375:2;;;36421:1;36418;36411:12;36375:2;-1:-1;36494:4;36465;36442:17;;;;36461:9;36438:33;36484:15;;36312:192;36778:126;36892:4;36880:17;;36861:43;37196:112;37291:12;;37275:33;38171:128;38251:42;38240:54;;38223:76;38306:151;38385:66;38374:78;;38357:100;38464:91;38543:6;38532:18;;38515:40;38562:79;38631:5;38614:27;39053:88;39131:4;39120:16;;39103:38;39149:145;39230:6;39225:3;39220;39207:30;-1:-1;39286:1;39268:16;;39261:27;39200:94;39303:268;39368:1;39375:101;39389:6;39386:1;39383:13;39375:101;;;39456:11;;;39450:18;39437:11;;;39430:39;39411:2;39404:10;39375:101;;;39491:6;39488:1;39485:13;39482:2;;;-1:-1;;39556:1;39538:16;;39531:27;39352:219;39579:97;39667:2;39647:14;39663:7;39643:28;;39627:49"
}
}
},
"sources": {
"2.0.0/forwarder/Forwarder.sol": {
"id": 0
},
"2.0.0/forwarder/MixinConstants.sol": {
"id": 1
},
"2.0.0/forwarder/MixinExpectedResults.sol": {
"id": 2
},
"2.0.0/forwarder/MixinFees.sol": {
"id": 3
},
"2.0.0/forwarder/MixinForwarderCore.sol": {
"id": 4
},
"2.0.0/forwarder/MixinMarketBuyZrx.sol": {
"id": 5
},
"2.0.0/forwarder/MixinTransfer.sol": {
"id": 6
},
"2.0.0/forwarder/interfaces/IExpectedResults.sol": {
"id": 7
},
"2.0.0/forwarder/interfaces/IForwarderCore.sol": {
"id": 8
},
"2.0.0/forwarder/mixins/MConstants.sol": {
"id": 9
},
"2.0.0/forwarder/mixins/MExpectedResults.sol": {
"id": 10
},
"2.0.0/forwarder/mixins/MFees.sol": {
"id": 11
},
"2.0.0/forwarder/mixins/MForwarderCore.sol": {
"id": 12
},
"2.0.0/forwarder/mixins/MMarketBuyZrx.sol": {
"id": 13
},
"2.0.0/forwarder/mixins/MTransfer.sol": {
"id": 14
},
"2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
"id": 15
},
"2.0.0/protocol/Exchange/interfaces/IExchange.sol": {
"id": 16
},
"2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
"id": 17
},
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
"id": 18
},
"2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
"id": 19
},
"2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
"id": 20
},
"2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": {
"id": 21
},
"2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
"id": 22
},
"2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
"id": 23
},
"2.0.0/protocol/Exchange/libs/LibMath.sol": {
"id": 24
},
"2.0.0/protocol/Exchange/libs/LibOrder.sol": {
"id": 25
},
"2.0.0/tokens/ERC20Token/IERC20Token.sol": {
"id": 26
},
"2.0.0/tokens/ERC721Token/IERC721Token.sol": {
"id": 27
},
"2.0.0/tokens/EtherToken/IEtherToken.sol": {
"id": 28
},
"2.0.0/utils/LibBytes/LibBytes.sol": {
"id": 29
},
"2.0.0/utils/SafeMath/SafeMath.sol": {
"id": 30
}
},
"sourceCodes": {
"2.0.0/forwarder/Forwarder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinFees.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./MixinConstants.sol\";\nimport \"./MixinMarketBuyZrx.sol\";\nimport \"./MixinExpectedResults.sol\";\nimport \"./MixinTransfer.sol\";\n\n\ncontract Forwarder is\n MixinConstants,\n MixinExpectedResults,\n MixinFees,\n MixinMarketBuyZrx,\n MixinTransfer,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n MixinConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n",
"2.0.0/forwarder/MixinConstants.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./mixins/MConstants.sol\";\n\n\ncontract MixinConstants is\n MConstants\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = IExchange(_exchange);\n ETHER_TOKEN = IEtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n}\n",
"2.0.0/forwarder/MixinExpectedResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MExpectedResults.sol\";\n\n\ncontract MixinExpectedResults is\n LibMath,\n LibFillResults,\n MConstants,\n MExpectedResults\n{\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.makerAssetFilledAmount == makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n FillResults memory singleFillResult = calculateFillResults(orders[i], remainingTakerAssetFillAmount);\n addFillResults(totalFillResults, singleFillResult);\n if (totalFillResults.takerAssetFilledAmount == takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n uint256 remainingZrxFillAmount = safeSub(zrxFillAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxFillAmount\n );\n FillResults memory singleFillResult = calculateFillResults(orders[i], safeAdd(remainingWethSellAmount, 1));\n\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n addFillResults(totalFillResults, singleFillResult);\n // As we compensate for the rounding issue above have slightly more ZRX than the requested zrxFillAmount\n if (totalFillResults.makerAssetFilledAmount >= zrxFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (FillResults memory fillResults)\n {\n LibOrder.OrderInfo memory orderInfo = EXCHANGE.getOrderInfo(order);\n if (orderInfo.orderStatus != uint8(LibOrder.OrderStatus.FILLABLE)) {\n return fillResults;\n }\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n return fillResults;\n }\n}\n",
"2.0.0/forwarder/MixinFees.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MFees.sol\";\n\n\ncontract MixinFees is\n LibMath,\n MConstants,\n MFees\n{\n\n uint16 constant public PERCENTAGE_DENOMINATOR = 10000; // 9800 == 98%, 10000 == 100%\n uint16 constant public MAX_FEE = 1000; // 10%\n uint16 constant public ALLOWABLE_EXCHANGE_PERCENTAGE = 9500; // 95%\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount)\n {\n if (feeProportion > 0 && feeRecipient != address(0)) {\n require(\n feeProportion <= MAX_FEE,\n \"FEE_PROPORTION_TOO_LARGE\"\n );\n // 1.5% is 150, allowing for 2 decimal precision, i.e 0.05% is 5\n ethFeeAmount = getPartialAmount(\n feeProportion,\n PERCENTAGE_DENOMINATOR,\n takerEthAmount\n );\n feeRecipient.transfer(ethFeeAmount);\n }\n return ethFeeAmount;\n }\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n {\n // Return all of the excess WETH if any after deducting fees on the amount\n if (ethWithdrawAmount > 0) {\n ETHER_TOKEN.withdraw(ethWithdrawAmount);\n // Fees proportional to the amount traded\n uint256 ethFeeAmount = payEthFee(\n wethAmountSold,\n feeProportion,\n feeRecipient\n );\n uint256 unspentEthAmount = safeSub(ethWithdrawAmount, ethFeeAmount);\n if (unspentEthAmount > 0) {\n msg.sender.transfer(unspentEthAmount);\n }\n }\n }\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool)\n {\n uint256 acceptableSellAmount = getPartialAmount(\n ALLOWABLE_EXCHANGE_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n requestedSellAmount\n );\n return tokenAmountSold >= acceptableSellAmount;\n }\n}\n",
"2.0.0/forwarder/MixinForwarderCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MFees.sol\";\nimport \"./mixins/MMarketBuyZrx.sol\";\nimport \"./mixins/MExpectedResults.sol\";\nimport \"./mixins/MTransfer.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MForwarderCore.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract MixinForwarderCore is\n LibFillResults,\n MConstants,\n MExpectedResults,\n MFees,\n MMarketBuyZrx,\n MTransfer,\n MForwarderCore\n{\n bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256,bytes)\"));\n uint256 constant internal MAX_UINT = 2**256 - 1;\n\n constructor ()\n public\n {\n address proxyAddress = EXCHANGE.getAssetProxy(ERC20_DATA_ID);\n if (proxyAddress != address(0)) {\n ETHER_TOKEN.approve(proxyAddress, MAX_UINT);\n ZRX_TOKEN.approve(proxyAddress, MAX_UINT);\n }\n }\n\n /// @dev Market sells ETH for ERC20 tokens, performing fee abstraction if required. This does not support ERC721 tokens. This function is payable\n /// and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// This function allows for a deduction of a proportion of incoming ETH sent to the feeRecipient.\n /// The caller is sent all tokens from the operation.\n /// If the purchased token amount does not meet an acceptable threshold then this function reverts.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the incoming ETH and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n // Deduct the fee from the total amount of ETH sent in\n uint256 ethFeeAmount = payEthFee(\n takerEthAmount,\n feeProportion,\n feeRecipient\n );\n uint256 wethSellAmount = safeSub(takerEthAmount, ethFeeAmount);\n\n // Deposit the remaining to be used for trading\n ETHER_TOKEN.deposit.value(wethSellAmount)();\n // Populate the known assetData, as it is always WETH the caller can provide null bytes to save gas\n // marketSellOrders fills the remaining\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n orders[0].takerAssetData = WETH_ASSET_DATA;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n // If this is ZRX then we market sell from the orders, rather than a 2 step of buying ZRX fees from feeOrders\n // then buying ZRX from orders\n totalFillResults = marketSellEthForZRXInternal(\n orders,\n signatures,\n wethSellAmount\n );\n } else {\n totalFillResults = marketSellEthForERC20Internal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n wethSellAmount\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n // Ensure no WETH is left in this contract\n require(\n wethSellAmount == totalFillResults.takerAssetFilledAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all tokens to msg.sender\n transferERC20Token(\n makerTokenAddress,\n msg.sender,\n totalFillResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Buys the exact amount of assets (ERC20 and ERC721), performing fee abstraction if required.\n /// All order assets must be of the same type. Deducts a proportional fee to fee recipient.\n /// This function is payable and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// The caller is sent all assets from the fill of orders. This function will revert unless the requested amount of assets are purchased.\n /// Any excess ETH sent will be returned to the caller\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param makerTokenFillAmount The amount of maker asset to buy.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the ETH spent and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketBuyTokensWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (FillResults memory totalFillResults)\n {\n uint256 takerEthAmount = msg.value;\n require(\n takerEthAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n require(\n makerTokenFillAmount > 0,\n \"VALUE_GREATER_THAN_ZERO\"\n );\n bytes4 assetDataId = LibBytes.readBytes4(orders[0].makerAssetData, 0);\n require(\n assetDataId == ERC20_DATA_ID || assetDataId == ERC721_DATA_ID,\n \"UNSUPPORTED_TOKEN_PROXY\"\n );\n\n ETHER_TOKEN.deposit.value(takerEthAmount)();\n if (assetDataId == ERC20_DATA_ID) {\n totalFillResults = marketBuyERC20TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures,\n makerTokenFillAmount\n );\n } else if (assetDataId == ERC721_DATA_ID) {\n totalFillResults = batchBuyERC721TokensInternal(\n orders,\n signatures,\n feeOrders,\n feeSignatures\n );\n }\n // Prevent accidental WETH owned by this contract and it being spent\n require(\n takerEthAmount >= totalFillResults.takerAssetFilledAmount,\n \"INVALID_MSG_VALUE\"\n );\n withdrawPayAndDeductEthFee(\n safeSub(takerEthAmount, totalFillResults.takerAssetFilledAmount),\n totalFillResults.takerAssetFilledAmount,\n feeProportion,\n feeRecipient\n );\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ERC20 tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20Internal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n uint256 remainingWethSellAmount = wethSellAmount;\n FillResults memory calculatedMarketSellResults = calculateMarketSellResults(orders, wethSellAmount);\n if (calculatedMarketSellResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory feeTokensResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketSellResults.takerFeePaid\n );\n // Ensure the token abstraction was fair if fees were proportionally too high, we fail\n require(\n isAcceptableThreshold(\n wethSellAmount,\n safeSub(wethSellAmount, feeTokensResults.takerAssetFilledAmount)\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n remainingWethSellAmount = safeSub(remainingWethSellAmount, feeTokensResults.takerAssetFilledAmount);\n totalFillResults.takerFeePaid = feeTokensResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = feeTokensResults.takerAssetFilledAmount;\n }\n // Make our market sell to buy the requested tokens with the remaining balance\n FillResults memory requestedTokensResults = EXCHANGE.marketSellOrders(\n orders,\n remainingWethSellAmount,\n signatures\n );\n // Update our return FillResult with the market sell\n addFillResults(totalFillResults, requestedTokensResults);\n return totalFillResults;\n }\n\n /// @dev Market sells WETH for ZRX tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForZRXInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 wethSellAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n // Make our market sell to buy the requested tokens with the remaining balance\n totalFillResults = EXCHANGE.marketSellOrders(\n orders,\n wethSellAmount,\n signatures\n );\n // Exchange does not special case ZRX in the makerAssetFilledAmount, if fees were deducted then using this amount\n // for future transfers is invalid.\n uint256 zrxAmountBought = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);\n require(\n isAcceptableThreshold(totalFillResults.makerAssetFilledAmount, zrxAmountBought),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n totalFillResults.makerAssetFilledAmount = zrxAmountBought;\n return totalFillResults;\n }\n\n /// @dev Buys an exact amount of an ERC20 token using WETH.\n /// @param orders Orders to fill. The maker asset is the ERC20 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @param makerTokenFillAmount Amount of the ERC20 token to buy.\n /// @return totalFillResults Aggregated fill results of buying the ERC20 and ZRX tokens.\n function marketBuyERC20TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults)\n {\n // We read the maker token address to check if it is ZRX and later use it for transfer\n address makerTokenAddress = LibBytes.readAddress(orders[0].makerAssetData, 16);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[0].takerAssetData = WETH_ASSET_DATA;\n // We can short cut here for effeciency and use buyFeeTokensInternal if maker asset token is ZRX\n // this buys us exactly that amount taking into account the fees. This saves gas and calculates the rate correctly\n FillResults memory marketBuyResults;\n if (makerTokenAddress == address(ZRX_TOKEN)) {\n marketBuyResults = marketBuyZrxInternal(\n orders,\n signatures,\n makerTokenFillAmount\n );\n // When buying ZRX we round up which can result in a small margin excess\n require(\n marketBuyResults.makerAssetFilledAmount >= makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n safeAdd(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid), // Total ZRX\n totalFillResults.makerAssetFilledAmount // amount going to msg.sender\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n } else {\n FillResults memory calculatedMarketBuyResults = calculateMarketBuyResults(orders, makerTokenFillAmount);\n if (calculatedMarketBuyResults.takerFeePaid > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future market buy\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n calculatedMarketBuyResults.takerFeePaid\n );\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n }\n // Make our market buy of the requested tokens with the remaining balance\n marketBuyResults = EXCHANGE.marketBuyOrders(\n orders,\n makerTokenFillAmount,\n signatures\n );\n require(\n marketBuyResults.makerAssetFilledAmount == makerTokenFillAmount,\n \"UNACCEPTABLE_THRESHOLD\"\n );\n addFillResults(totalFillResults, marketBuyResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n marketBuyResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n }\n // Transfer all purchased tokens to msg.sender\n transferERC20Token(\n makerTokenAddress,\n msg.sender,\n marketBuyResults.makerAssetFilledAmount\n );\n return totalFillResults;\n }\n\n /// @dev Buys an all of the ERC721 tokens in the orders.\n /// @param orders Orders to fill. The maker asset is the ERC721 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @return totalFillResults Aggregated fill results of buying the ERC721 tokens and ZRX tokens.\n function batchBuyERC721TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults)\n {\n uint256 totalZrxFeeAmount;\n uint256 ordersLength = orders.length;\n uint256[] memory takerAssetFillAmounts = new uint256[](ordersLength);\n for (uint256 i = 0; i < ordersLength; i++) {\n // Total up the fees\n totalZrxFeeAmount = safeAdd(totalZrxFeeAmount, orders[i].takerFee);\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we set the takerAssetData as WETH asset data\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Populate takerAssetFillAmounts for later batchFill\n takerAssetFillAmounts[i] = orders[i].takerAssetAmount;\n }\n if (totalZrxFeeAmount > 0) {\n // Fees are required for these orders. Buy enough ZRX to cover the future fill\n FillResults memory zrxMarketBuyResults = marketBuyZrxInternal(\n feeOrders,\n feeSignatures,\n totalZrxFeeAmount\n );\n totalFillResults.takerFeePaid = zrxMarketBuyResults.takerFeePaid;\n totalFillResults.takerAssetFilledAmount = zrxMarketBuyResults.takerAssetFilledAmount;\n }\n FillResults memory batchFillResults = EXCHANGE.batchFillOrKillOrders(\n orders,\n takerAssetFillAmounts,\n signatures\n );\n addFillResults(totalFillResults, batchFillResults);\n require(\n isAcceptableThreshold(\n totalFillResults.takerAssetFilledAmount,\n batchFillResults.takerAssetFilledAmount\n ),\n \"UNACCEPTABLE_THRESHOLD\"\n );\n // Transfer all of the tokens filled from the batchFill\n for (i = 0; i < ordersLength; i++) {\n transferERC721Token(\n orders[i].makerAssetData,\n msg.sender\n );\n }\n return totalFillResults;\n }\n}\n",
"2.0.0/forwarder/MixinMarketBuyZrx.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./mixins/MConstants.sol\";\nimport \"./mixins/MMarketBuyZrx.sol\";\n\n\ncontract MixinMarketBuyZrx is\n LibMath,\n LibFillResults,\n MConstants,\n MMarketBuyZrx\n{\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account the fees on buying fee tokens. This will guarantee\n /// At least zrxBuyAmount of ZRX fee tokens are purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX fee tokens will require purchasing 202 ZRX tokens\n /// As 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// @param orders An array of Order struct containing order specifications for fees.\n /// @param signatures An array of Proof that order has been created by maker for the fee orders.\n /// @param zrxBuyAmount The number of requested ZRX fee tokens.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker. makerTokenAmount is the zrx amount deducted of fees\n function marketBuyZrxInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 zrxBuyAmount\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n for (uint256 i = 0; i < orders.length; i++) {\n // All of these are ZRX/WETH, we can drop the respective assetData from callData\n orders[i].makerAssetData = ZRX_ASSET_DATA;\n orders[i].takerAssetData = WETH_ASSET_DATA;\n // Calculate the remaining amount of makerToken to buy\n uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, totalFillResults.makerAssetFilledAmount);\n // Convert the remaining amount of makerToken to buy into remaining amount\n // of takerToken to sell, assuming entire amount can be sold in the current order\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxBuyAmount\n );\n // Attempt to sell the remaining amount of takerToken\n // Round up the amount to ensure we don't under buy by a fractional amount\n FillResults memory singleFillResult = EXCHANGE.fillOrder(\n orders[i],\n safeAdd(remainingWethSellAmount, 1),\n signatures[i]\n );\n // We didn't buy the full amount when buying ZRX as some were taken for fees\n singleFillResult.makerAssetFilledAmount = safeSub(singleFillResult.makerAssetFilledAmount, singleFillResult.takerFeePaid);\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResult);\n // Stop execution if the entire amount of makerToken has been bought\n if (totalFillResults.makerAssetFilledAmount >= zrxBuyAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n}\n",
"2.0.0/forwarder/MixinTransfer.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../tokens/ERC721Token/IERC721Token.sol\";\nimport \"./mixins/MTransfer.sol\";\n\n\ncontract MixinTransfer is\n MTransfer\n{\n\n using LibBytes for bytes;\n\n bytes4 constant internal ERC20_TRANSFER_SELECTOR = bytes4(keccak256(\"transfer(address,uint256)\"));\n bytes4 constant internal ERC721_RECEIVED = bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"));\n bytes4 constant internal ERC721_RECEIVED_OPERATOR = bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"));\n\n function onERC721Received(\n address,\n uint256,\n bytes memory\n )\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED;\n }\n\n function onERC721Received(\n address,\n address,\n uint256,\n bytes memory\n )\n public\n pure\n returns(bytes4)\n {\n return ERC721_RECEIVED_OPERATOR;\n }\n\n function transferERC20Token(\n address token,\n address to,\n uint256 amount\n )\n internal\n {\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n ERC20_TRANSFER_SELECTOR,\n to,\n amount\n ));\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n }\n\n function transferERC721Token(\n bytes memory assetData,\n address to\n )\n internal\n {\n // Decode asset data.\n address token = assetData.readAddress(16);\n uint256 tokenId = assetData.readUint256(36);\n bytes memory receiverData = assetData.readBytesWithLength(100);\n IERC721Token(token).safeTransferFrom(\n address(this),\n to,\n tokenId,\n receiverData\n );\n }\n}\n",
"2.0.0/forwarder/interfaces/IExpectedResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract IExpectedResults {\n\n /// @dev Calculates a total FillResults for buying makerAssetFillAmount over all orders.\n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param makerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketBuyResults(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Calculates a FillResults total for selling takerAssetFillAmount over all orders. \n /// Including the fees required to be paid. \n /// @param orders An array of Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function calculateMarketSellResults(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Calculates fill results for buyFeeTokens. This handles fees on buying ZRX\n /// so the end result is the expected amount of ZRX (not less after fees).\n /// @param orders An array of Order struct containing order specifications.\n /// @param zrxFillAmount A number representing the amount zrx to buy\n /// @return totalFillResults Expected fill result amounts from buying fees\n function calculateMarketBuyZrxResults(\n LibOrder.Order[] memory orders,\n uint256 zrxFillAmount\n )\n public\n view\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
"2.0.0/forwarder/interfaces/IForwarderCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract IForwarderCore {\n\n /// @dev Market sells ETH for ERC20 tokens, performing fee abstraction if required. This does not support ERC721 tokens. This function is payable\n /// and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// This function allows for a deduction of a proportion of incoming ETH sent to the feeRecipient.\n /// The caller is sent all tokens from the operation.\n /// If the purchased token amount does not meet an acceptable threshold then this function reverts.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the incoming ETH and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys the exact amount of assets (ERC20 and ERC721), performing fee abstraction if required.\n /// All order assets must be of the same type. Deducts a proportional fee to fee recipient.\n /// This function is payable and will convert all incoming ETH into WETH and perform the trade on behalf of the caller.\n /// The caller is sent all assets from the fill of orders. This function will revert unless the requested amount of assets are purchased.\n /// Any excess ETH sent will be returned to the caller\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param makerTokenFillAmount The amount of maker asset to buy.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param feeProportion A proportion deducted off the ETH spent and sent to feeRecipient. The maximum value for this\n /// is 1000, aka 10%. Supports up to 2 decimal places. I.e 0.59% is 59.\n /// @param feeRecipient An address of the fee recipient whom receives feeProportion of ETH.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketBuyTokensWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n public\n payable\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
"2.0.0/forwarder/mixins/MConstants.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../tokens/EtherToken/IEtherToken.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\n\ncontract MConstants {\n\n // solhint-disable var-name-mixedcase\n IExchange internal EXCHANGE;\n IEtherToken internal ETHER_TOKEN;\n IERC20Token internal ZRX_TOKEN;\n bytes internal ZRX_ASSET_DATA;\n bytes internal WETH_ASSET_DATA;\n // solhint-enable var-name-mixedcase\n}\n",
"2.0.0/forwarder/mixins/MExpectedResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../interfaces/IExpectedResults.sol\";\n\n\ncontract MExpectedResults is\n IExpectedResults\n{\n\n /// @dev Simulates the 0x Exchange fillOrder validation and calculations, without performing any state changes.\n /// @param order An Order struct containing order specifications.\n /// @param takerAssetFillAmount A number representing the amount of this order to fill.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount\n )\n internal\n view\n returns (LibFillResults.FillResults memory fillResults);\n}\n",
"2.0.0/forwarder/mixins/MFees.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract MFees {\n\n /// @dev Pays the feeRecipient feeProportion of the total takerEthAmount, denominated in ETH\n /// @param takerEthAmount The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n /// @return ethFeeAmount Amount of ETH paid to feeRecipient as fee.\n function payEthFee(\n uint256 takerEthAmount,\n uint16 feeProportion,\n address feeRecipient\n )\n internal\n returns (uint256 ethFeeAmount);\n\n /// @dev Withdraws the remaining WETH, deduct and pay fees from this amount based on the takerTokenAmount to the feeRecipient.\n /// If a user overpaid ETH initially, the fees are calculated from the amount traded and deducted from withdrawAmount.\n /// Any remaining ETH is sent back to the user.\n /// @param ethWithdrawAmount The amount to withdraw from the WETH contract.\n /// @param wethAmountSold The total amount that was transacted in WETH, fees are calculated from this value.\n /// @param feeProportion The proportion of fees\n /// @param feeRecipient The recipient of the fees\n function withdrawPayAndDeductEthFee(\n uint256 ethWithdrawAmount,\n uint256 wethAmountSold,\n uint16 feeProportion,\n address feeRecipient\n )\n internal;\n\n /// @dev Checks whether the amount of tokens sold against the amount of tokens requested\n /// is within a certain threshold. This ensures the caller gets a fair deal when\n /// performing any token fee abstraction. Threshold is 95%. If fee abstraction costs more than\n /// 5% of the total transaction, we return false.\n /// @param requestedSellAmount The amount the user requested, or sent in to a payable function\n /// @param tokenAmountSold The amount of the token that was sold after fee abstraction\n /// @return bool of whether this is within an acceptable threshold\n function isAcceptableThreshold(uint256 requestedSellAmount, uint256 tokenAmountSold)\n internal\n pure\n returns (bool);\n}\n",
"2.0.0/forwarder/mixins/MForwarderCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../interfaces/IForwarderCore.sol\";\n\n\ncontract MForwarderCore is\n IForwarderCore\n{\n\n /// @dev Market sells WETH for ERC20 tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param feeOrders An array of Order struct containing order specifications for fees.\n /// @param feeSignatures An array of Proof that order has been created by maker for the fee orders.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForERC20Internal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 wethSellAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Market sells WETH for ZRX tokens.\n /// @param orders An array of Order struct containing order specifications.\n /// @param signatures An array of Proof that order has been created by maker.\n /// @param wethSellAmount The amount of WETH to sell.\n /// @return FillResults amounts filled and fees paid by maker and taker.\n function marketSellEthForZRXInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 wethSellAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys an exact amount of an ERC20 token using WETH.\n /// @param orders Orders to fill. The maker asset is the ERC20 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @param makerTokenFillAmount Amount of the ERC20 token to buy.\n /// @return totalFillResults Aggregated fill results of buying the ERC20 and ZRX tokens.\n function marketBuyERC20TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 makerTokenFillAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys an all of the ERC721 tokens in the orders.\n /// @param orders Orders to fill. The maker asset is the ERC721 token to buy. The taker asset is WETH.\n /// @param signatures Proof that the orders were created by their respective makers.\n /// @param feeOrders to fill. The maker asset is ZRX and the taker asset is WETH.\n /// @param feeSignatures Proof that the feeOrders were created by their respective makers.\n /// @return totalFillResults Aggregated fill results of buying the ERC721 tokens and ZRX tokens.\n function batchBuyERC721TokensInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
"2.0.0/forwarder/mixins/MMarketBuyZrx.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract MMarketBuyZrx {\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account the fees on buying fee tokens. This will guarantee\n /// At least zrxBuyAmount of ZRX fee tokens are purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX fee tokens will require purchasing 202 ZRX tokens\n /// As 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// @param orders An array of Order struct containing order specifications for fees.\n /// @param signatures An array of Proof that order has been created by maker for the fee orders.\n /// @param zrxBuyAmount The number of requested ZRX fee tokens.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker. makerTokenAmount is the zrx amount deducted of fees\n function marketBuyZrxInternal(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n uint256 zrxBuyAmount\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
"2.0.0/forwarder/mixins/MTransfer.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract MTransfer {\n\n function onERC721Received(address, uint256, bytes memory)\n public\n pure\n returns(bytes4);\n\n function onERC721Received(address, address, uint256, bytes memory)\n public\n pure\n returns(bytes4);\n \n function transferERC20Token(\n address token,\n address to,\n uint256 amount\n )\n internal;\n\n function transferERC721Token(\n bytes memory assetData,\n address to\n )\n internal;\n}\n",
"2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
"2.0.0/protocol/Exchange/interfaces/IExchange.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n",
"2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
"2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
"2.0.0/protocol/Exchange/interfaces/ITransactions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
"2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n}\n",
"2.0.0/protocol/Exchange/libs/LibEIP712.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibFillResults.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibMath.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target)\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
"2.0.0/protocol/Exchange/libs/LibOrder.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // order.senderAddress,\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n",
"2.0.0/tokens/ERC20Token/IERC20Token.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
"2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
"2.0.0/tokens/EtherToken/IEtherToken.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\nimport \"../ERC20Token/IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\n}\n",
"2.0.0/utils/LibBytes/LibBytes.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert into.\n /// @param index Index in byte array of .\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy into \n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of \n input.length + 32 // +32 bytes to store length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
"2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_OVERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
},
"sourceTreeHashHex": "0x6581f9c1daea5ed0f52d474b02e8390cea97714e97c2ef4fead2fee4aeb4db61",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"enabled": true,
"runs": 1000000
},
"outputSelection": {
"*": {
"*": [
"abi",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
}
}
},
"networks": {
"50": {
"address": "0xb69e673309512a9d726f87304c6984054f87a93b",
"links": {},
"constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]"
}
}
}