Commit b3c3a7e4 authored by XFT-dev's avatar XFT-dev
Browse files

added hardhat support

parent 6edd2b9c

Too many changes to show.

To preserve performance only 126 of 126+ files are displayed.
{
"schemaVersion": "2.0.0",
"contractName": "SafeMathChainlink",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {},
"title": "SafeMath"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a7230582045e00490e4c3ced3c7a0a2da359d1c1134edf531cfbdefe49188ca4f7c61c5400029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN STOP PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 GASLIMIT 0xe0 DIV SWAP1 0xe4 0xc3 0xce 0xd3 0xc7 LOG0 LOG2 0xda CALLDATALOAD SWAP14 SHR GT CALLVALUE 0xed 0xf5 BALANCE 0xcf 0xbd 0xef 0xe4 SWAP2 DUP9 0xca 0x4f PUSH29 0x61C5400029000000000000000000000000000000000000000000000000 ",
"sourceMap": "117:1260:40:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a7230582045e00490e4c3ced3c7a0a2da359d1c1134edf531cfbdefe49188ca4f7c61c5400029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 GASLIMIT 0xe0 DIV SWAP1 0xe4 0xc3 0xce 0xd3 0xc7 LOG0 LOG2 0xda CALLDATALOAD SWAP14 SHR GT CALLVALUE 0xed 0xf5 BALANCE 0xcf 0xbd 0xef 0xe4 SWAP2 DUP9 0xca 0x4f PUSH29 0x61C5400029000000000000000000000000000000000000000000000000 ",
"sourceMap": "117:1260:40:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{},\"title\":\"SafeMath\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":\"SafeMathChainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074\",\"urls\":[\"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/SafeMathChainlink.sol": {
"id": 40
}
},
"sourceCodes": {
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMathChainlink {\n\n /**\n * @dev Multiplies two numbers, throws on overflow.\n */\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (_a == 0) {\n return 0;\n }\n\n c = _a * _b;\n assert(c / _a == _b);\n return c;\n }\n\n /**\n * @dev Integer division of two numbers, truncating the quotient.\n */\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\n // uint256 c = _a / _b;\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n return _a / _b;\n }\n\n /**\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n assert(_b <= _a);\n return _a - _b;\n }\n\n /**\n * @dev Adds two numbers, throws on overflow.\n */\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n c = _a + _b;\n assert(c >= _a);\n return c;\n }\n}\n"
},
"sourceTreeHashHex": "0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "SignedSafeMath",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {},
"title": "SignedSafeMath"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f30073000000000000000000000000000000000000000030146080604052600080fd00a165627a7a7230582052bb15bb4169791d00b4e10ee0a1bdd38942dd7e2ef56822e041bcea23943a580029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN STOP PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 MSTORE 0xbb ISZERO 0xbb COINBASE PUSH10 0x791D00B4E10EE0A1BDD3 DUP10 TIMESTAMP 0xdd PUSH31 0x2EF56822E041BCEA23943A5800290000000000000000000000000000000000 ",
"sourceMap": "130:1576:41:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fd00a165627a7a7230582052bb15bb4169791d00b4e10ee0a1bdd38942dd7e2ef56822e041bcea23943a580029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 MSTORE 0xbb ISZERO 0xbb COINBASE PUSH10 0x791D00B4E10EE0A1BDD3 DUP10 TIMESTAMP 0xdd PUSH31 0x2EF56822E041BCEA23943A5800290000000000000000000000000000000000 ",
"sourceMap": "130:1576:41:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{},\"title\":\"SignedSafeMath\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SignedSafeMath.sol\":\"SignedSafeMath\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SignedSafeMath.sol\":{\"keccak256\":\"0xc4d1131c258388162b46ce765e2ceeb68122dbf586447c47f99101d65d5f75af\",\"urls\":[\"bzzr://305e6947adba7e8d4eb6b8e4bc989d874780507df4a2c1fb5cc29d139f2f4efa\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/SignedSafeMath.sol": {
"id": 41
}
},
"sourceCodes": {
"vendor/SignedSafeMath.sol": "pragma solidity 0.4.24;\n\n/**\n * @title SignedSafeMath\n * @dev Signed math operations with safety checks that revert on error.\n */\nlibrary SignedSafeMath {\n int256 constant private _INT256_MIN = -2**255;\n\n /**\n * @dev Multiplies two signed integers, reverts on overflow.\n */\n function mul(int256 a, int256 b) internal pure returns (int256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n require(!(a == -1 && b == _INT256_MIN), \"SignedSafeMath: multiplication overflow\");\n\n int256 c = a * b;\n require(c / a == b, \"SignedSafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.\n */\n function div(int256 a, int256 b) internal pure returns (int256) {\n require(b != 0, \"SignedSafeMath: division by zero\");\n require(!(b == -1 && a == _INT256_MIN), \"SignedSafeMath: division overflow\");\n\n int256 c = a / b;\n\n return c;\n }\n\n /**\n * @dev Subtracts two signed integers, reverts on overflow.\n */\n function sub(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a - b;\n require((b >= 0 && c <= a) || (b < 0 && c > a), \"SignedSafeMath: subtraction overflow\");\n\n return c;\n }\n\n /**\n * @dev Adds two signed integers, reverts on overflow.\n */\n function add(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a + b;\n require((b >= 0 && c >= a) || (b < 0 && c < a), \"SignedSafeMath: addition overflow\");\n\n return c;\n }\n}\n"
},
"sourceTreeHashHex": "0xc4d1131c258388162b46ce765e2ceeb68122dbf586447c47f99101d65d5f75af",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "StandardToken",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_from",
"type": "address"
},
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_subtractedValue",
"type": "uint256"
}
],
"name": "decreaseApproval",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"name": "balance",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address"
},
{
"name": "_addedValue",
"type": "uint256"
}
],
"name": "increaseApproval",
"outputs": [
{
"name": "success",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_owner",
"type": "address"
},
{
"name": "_spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"name": "remaining",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "owner",
"type": "address"
},
{
"indexed": true,
"name": "spender",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "from",
"type": "address"
},
{
"indexed": true,
"name": "to",
"type": "address"
},
{
"indexed": false,
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
}
],
"devdoc": {
"methods": {
"allowance(address,address)": {
"details": "Function to check the amount of tokens that an owner allowed to a spender.",
"params": {
"_owner": "address The address which owns the funds.",
"_spender": "address The address which will spend the funds."
},
"return": "A uint256 specifying the amount of tokens still available for the spender."
},
"approve(address,uint256)": {
"details": "Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.",
"params": {
"_spender": "The address which will spend the funds.",
"_value": "The amount of tokens to be spent."
}
},
"balanceOf(address)": {
"details": "Gets the balance of the specified address.",
"params": {
"_owner": "The address to query the the balance of. "
},
"return": "An uint256 representing the amount owned by the passed address."
},
"transfer(address,uint256)": {
"details": "transfer token for a specified address",
"params": {
"_to": "The address to transfer to.",
"_value": "The amount to be transferred."
}
},
"transferFrom(address,address,uint256)": {
"details": "Transfer tokens from one address to another",
"params": {
"_from": "address The address which you want to send tokens from",
"_to": "address The address which you want to transfer to",
"_value": "uint256 the amount of tokens to be transferred"
}
}
},
"title": "Standard ERC20 token"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610735806100206000396000f30060806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461009257806318160ddd146100d757806323b872dd146100fe578063661884631461013557806370a0823114610166578063a9059cbb14610194578063d73dd623146101c5578063dd62ed3e146101f6575b600080fd5b34801561009e57600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff6004351660243561022a565b604080519115158252519081900360200190f35b3480156100e357600080fd5b506100ec61029d565b60408051918252519081900360200190f35b34801561010a57600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356102a3565b34801561014157600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435166024356103e3565b34801561017257600080fd5b506100ec73ffffffffffffffffffffffffffffffffffffffff60043516610507565b3480156101a057600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff6004351660243561052f565b3480156101d157600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435166024356105f9565b34801561020257600080fd5b506100ec73ffffffffffffffffffffffffffffffffffffffff600435811690602435166106ac565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60005481565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260026020908152604080832033845282528083205493835260019091528120549091906102f2908463ffffffff6106e416565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260408082209390935590861681522054610334908463ffffffff6106f616565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205561036a818463ffffffff6106e416565b73ffffffffffffffffffffffffffffffffffffffff808716600081815260026020908152604080832033845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506001949350505050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054808311156104525733600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152812055610494565b610462818463ffffffff6106e416565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529020555b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b3360009081526001602052604081205461054f908363ffffffff6106e416565b336000908152600160205260408082209290925573ffffffffffffffffffffffffffffffffffffffff85168152205461058e908363ffffffff6106f616565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205461063a908363ffffffff6106f616565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6000828211156106f057fe5b50900390565b8181018281101561070357fe5b929150505600a165627a7a7230582051a31eb722ac76e46fa7a059cc5c819797a9212be6c8f8762bf9ee4e4b1d05f20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x735 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0x66188463 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x166 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xD73DD623 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1F6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x22A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH2 0x29D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x2A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x507 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x52F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x5F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x6AC JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x2F2 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP7 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x334 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x36A DUP2 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP8 DUP2 MSTORE SWAP1 MLOAD SWAP3 DUP9 AND SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD DUP1 DUP4 GT ISZERO PUSH2 0x452 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SSTORE PUSH2 0x494 JUMP JUMPDEST PUSH2 0x462 DUP2 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SSTORE JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x54F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x58E SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP3 CALLER SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD PUSH2 0x63A SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE MLOAD SWAP2 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x6F0 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x703 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 MLOAD LOG3 0x1e 0xb7 0x22 0xac PUSH23 0xE46FA7A059CC5C819797A9212BE6C8F8762BF9EE4E4B1D SDIV CALLCODE STOP 0x29 ",
"sourceMap": "423:2660:42:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;423:2660:42;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461009257806318160ddd146100d757806323b872dd146100fe578063661884631461013557806370a0823114610166578063a9059cbb14610194578063d73dd623146101c5578063dd62ed3e146101f6575b600080fd5b34801561009e57600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff6004351660243561022a565b604080519115158252519081900360200190f35b3480156100e357600080fd5b506100ec61029d565b60408051918252519081900360200190f35b34801561010a57600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356102a3565b34801561014157600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435166024356103e3565b34801561017257600080fd5b506100ec73ffffffffffffffffffffffffffffffffffffffff60043516610507565b3480156101a057600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff6004351660243561052f565b3480156101d157600080fd5b506100c373ffffffffffffffffffffffffffffffffffffffff600435166024356105f9565b34801561020257600080fd5b506100ec73ffffffffffffffffffffffffffffffffffffffff600435811690602435166106ac565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60005481565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260026020908152604080832033845282528083205493835260019091528120549091906102f2908463ffffffff6106e416565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260408082209390935590861681522054610334908463ffffffff6106f616565b73ffffffffffffffffffffffffffffffffffffffff851660009081526001602052604090205561036a818463ffffffff6106e416565b73ffffffffffffffffffffffffffffffffffffffff808716600081815260026020908152604080832033845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506001949350505050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812054808311156104525733600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff88168452909152812055610494565b610462818463ffffffff6106e416565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529020555b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205490565b3360009081526001602052604081205461054f908363ffffffff6106e416565b336000908152600160205260408082209290925573ffffffffffffffffffffffffffffffffffffffff85168152205461058e908363ffffffff6106f616565b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205461063a908363ffffffff6106f616565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b6000828211156106f057fe5b50900390565b8181018281101561070357fe5b929150505600a165627a7a7230582051a31eb722ac76e46fa7a059cc5c819797a9212be6c8f8762bf9ee4e4b1d05f20029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xD7 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xFE JUMPI DUP1 PUSH4 0x66188463 EQ PUSH2 0x135 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x166 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x194 JUMPI DUP1 PUSH4 0xD73DD623 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x1F6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x22A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH2 0x29D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x2A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x141 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x172 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x507 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x52F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x5F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEC PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x6AC JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 DUP4 MSTORE PUSH1 0x1 SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x2F2 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP7 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x334 SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH2 0x36A DUP2 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE DUP1 MLOAD DUP8 DUP2 MSTORE SWAP1 MLOAD SWAP3 DUP9 AND SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD DUP1 DUP4 GT ISZERO PUSH2 0x452 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SSTORE PUSH2 0x494 JUMP JUMPDEST PUSH2 0x462 DUP2 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SSTORE JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 SLOAD DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH2 0x54F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6E4 AND JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND DUP2 MSTORE KECCAK256 SLOAD PUSH2 0x58E SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE DUP1 MLOAD DUP6 DUP2 MSTORE SWAP1 MLOAD SWAP2 SWAP3 CALLER SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 SLOAD PUSH2 0x63A SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x6F6 AND JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP10 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE DUP1 MLOAD SWAP5 DUP6 MSTORE MLOAD SWAP2 SWAP4 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x6F0 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x703 JUMPI INVALID JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 MLOAD LOG3 0x1e 0xb7 0x22 0xac PUSH23 0xE46FA7A059CC5C819797A9212BE6C8F8762BF9EE4E4B1D SDIV CALLCODE STOP 0x29 ",
"sourceMap": "423:2660:42:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1535:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1535:176:42;;;;;;;;;;;;;;;;;;;;;;;;;;;179:26:14;;8:9:-1;5:2;;;30:1;27;20:12;5:2;179:26:14;;;;;;;;;;;;;;;;;;;;814:489:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;814:489:42;;;;;;;;;;;;;;2675:405;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2675:405:42;;;;;;;;;976:104:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:104:32;;;;;;;542:231;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;542:231:32;;;;;;;;;2407:264:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2407:264:42;;;;;;;;;2030:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2030:133:42;;;;;;;;;;;;1535:176;1615:10;1595:4;1607:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;:38;;;1651;;;;;;;1595:4;;1607:29;;1615:10;;1651:38;;;;;;;;-1:-1:-1;1702:4:42;1535:176;;;;:::o;179:26:14:-;;;;:::o;814:489:42:-;918:14;;;889:4;918:14;;;:7;:14;;;;;;;;933:10;918:26;;;;;;;;1116:15;;;:8;:15;;;;;;889:4;;918:26;1116:27;;1136:6;1116:27;:19;:27;:::i;:::-;1098:15;;;;;;;;:8;:15;;;;;;:45;;;;1165:13;;;;;;;:25;;1183:6;1165:25;:17;:25;:::i;:::-;1149:13;;;;;;;:8;:13;;;;;:41;1225:22;:10;1240:6;1225:22;:14;:22;:::i;:::-;1196:14;;;;;;;;:7;:14;;;;;;;;1211:10;1196:26;;;;;;;;:51;;;;1253:28;;;;;;;;;;;1196:14;;1253:28;;;;;;;;;;;-1:-1:-1;1294:4:42;;814:489;-1:-1:-1;;;;814:489:42:o;2675:405::-;2801:10;2757:12;2793:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;2832:27;;;2828:164;;;2877:10;2901:1;2869:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;:33;2828:164;;;2955:30;:8;2968:16;2955:30;:12;:30;:::i;:::-;2931:10;2923:19;;;;:7;:19;;;;;;;;;:29;;;;;;;;;:62;2828:164;3006:10;3028:19;;;;:7;:19;;;;;;;;2997:61;;;3028:29;;;;;;;;;;;2997:61;;;;;;;;;3006:10;2997:61;;;;;;;;;;;-1:-1:-1;3071:4:42;;2675:405;-1:-1:-1;;;2675:405:42:o;976:104:32:-;1059:16;;1029:15;1059:16;;;:8;:16;;;;;;;976:104::o;542:231::-;642:10;598:4;633:20;;;:8;:20;;;;;;:32;;658:6;633:32;:24;:32;:::i;:::-;619:10;610:20;;;;:8;:20;;;;;;:55;;;;:20;687:13;;;;;;:25;;705:6;687:25;:17;:25;:::i;:::-;671:13;;;;;;;:8;:13;;;;;;;;;:41;;;;718:33;;;;;;;671:13;;727:10;;718:33;;;;;;;;;;-1:-1:-1;764:4:32;542:231;;;;:::o;2407:264:42:-;2544:10;2484:12;2536:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;:46;;2570:11;2536:46;:33;:46;:::i;:::-;2512:10;2504:19;;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;;:78;;;2588:61;;;;;;2504:29;;2588:61;;;;;;;;;;;-1:-1:-1;2662:4:42;2407:264;;;;:::o;2030:133::-;2133:15;;;;2101:17;2133:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;2030:133::o;1069:116:40:-;1129:7;1151:8;;;;1144:16;;;;-1:-1:-1;1173:7:40;;;1069:116::o;1247:128::-;1328:7;;;1348;;;;1341:15;;;;1247:128;;;;:::o"
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"decreaseApproval(address,uint256)": "66188463",
"increaseApproval(address,uint256)": "d73dd623",
"totalSupply()": "18160ddd",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseApproval\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"balance\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseApproval\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"remaining\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"allowance(address,address)\":{\"details\":\"Function to check the amount of tokens that an owner allowed to a spender.\",\"params\":{\"_owner\":\"address The address which owns the funds.\",\"_spender\":\"address The address which will spend the funds.\"},\"return\":\"A uint256 specifying the amount of tokens still available for the spender.\"},\"approve(address,uint256)\":{\"details\":\"Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\",\"params\":{\"_spender\":\"The address which will spend the funds.\",\"_value\":\"The amount of tokens to be spent.\"}},\"balanceOf(address)\":{\"details\":\"Gets the balance of the specified address.\",\"params\":{\"_owner\":\"The address to query the the balance of. \"},\"return\":\"An uint256 representing the amount owned by the passed address.\"},\"transfer(address,uint256)\":{\"details\":\"transfer token for a specified address\",\"params\":{\"_to\":\"The address to transfer to.\",\"_value\":\"The amount to be transferred.\"}},\"transferFrom(address,address,uint256)\":{\"details\":\"Transfer tokens from one address to another\",\"params\":{\"_from\":\"address The address which you want to send tokens from\",\"_to\":\"address The address which you want to transfer to\",\"_value\":\"uint256 the amount of tokens to be transferred\"}}},\"title\":\"Standard ERC20 token\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/StandardToken.sol\":\"StandardToken\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ERC20.sol\":{\"keccak256\":\"0x2e730e56649a5cb6666156e209fc3dc20cacfc4ec20cb85dc54cd6a3fa0b813b\",\"urls\":[\"bzzr://f9fc1f27ff4e7b6135aa0a5935a71907513fc4330d336d0b221797f680c32cbe\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ERC20Basic.sol\":{\"keccak256\":\"0x5c0857cec6aebc5dfbafe5c0b3761952f0180c07f23200ed2b80051ccc6a6d6d\",\"urls\":[\"bzzr://658dc7a8924774d1009631c1ff7c546328ff32bf5a53274fb7651d5ca20e3e48\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/BasicToken.sol\":{\"keccak256\":\"0xe024b5f9c509c6e630587c51beeb5417a7b147c4532b0cbf00763a01ff98ad45\",\"urls\":[\"bzzr://b898aa83d88a05011b5f6e4a7aedea29b0f8f27f742049efd7b9b89988901ae6\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol\":{\"keccak256\":\"0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074\",\"urls\":[\"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/StandardToken.sol\":{\"keccak256\":\"0xd95075ff88d9c3e18f894f3a65f698d98b041db68bddaf9adf63ad9652363c06\",\"urls\":[\"bzzr://030366986f2090ce6642b729d43c0b8ab9972e08f691120e38239da5d2cd9627\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/StandardToken.sol": {
"id": 42
},
"vendor/BasicToken.sol": {
"id": 32
},
"interfaces/ERC20Basic.sol": {
"id": 14
},
"vendor/SafeMathChainlink.sol": {
"id": 40
},
"interfaces/ERC20.sol": {
"id": 13
}
},
"sourceCodes": {
"vendor/StandardToken.sol": "pragma solidity ^0.4.11;\n\n\nimport { BasicToken as linkBasicToken } from \"./BasicToken.sol\";\nimport { ERC20 as linkERC20 } from \"../interfaces/ERC20.sol\";\n\n\n/**\n * @title Standard ERC20 token\n *\n * @dev Implementation of the basic standard token.\n * @dev https://github.com/ethereum/EIPs/issues/20\n * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol\n */\ncontract StandardToken is linkERC20, linkBasicToken {\n\n mapping (address => mapping (address => uint256)) allowed;\n\n\n /**\n * @dev Transfer tokens from one address to another\n * @param _from address The address which you want to send tokens from\n * @param _to address The address which you want to transfer to\n * @param _value uint256 the amount of tokens to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _value) returns (bool) {\n var _allowance = allowed[_from][msg.sender];\n\n // Check is not needed because sub(_allowance, _value) will already throw if this condition is not met\n // require (_value <= _allowance);\n\n balances[_from] = balances[_from].sub(_value);\n balances[_to] = balances[_to].add(_value);\n allowed[_from][msg.sender] = _allowance.sub(_value);\n Transfer(_from, _to, _value);\n return true;\n }\n\n /**\n * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\n * @param _spender The address which will spend the funds.\n * @param _value The amount of tokens to be spent.\n */\n function approve(address _spender, uint256 _value) returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n\n /**\n * @dev Function to check the amount of tokens that an owner allowed to a spender.\n * @param _owner address The address which owns the funds.\n * @param _spender address The address which will spend the funds.\n * @return A uint256 specifying the amount of tokens still available for the spender.\n */\n function allowance(address _owner, address _spender) constant returns (uint256 remaining) {\n return allowed[_owner][_spender];\n }\n \n /*\n * approve should be called when allowed[_spender] == 0. To increment\n * allowed value is better to use this function to avoid 2 calls (and wait until \n * the first transaction is mined)\n * From MonolithDAO Token.sol\n */\n function increaseApproval (address _spender, uint _addedValue) \n returns (bool success) {\n allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);\n Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n return true;\n }\n\n function decreaseApproval (address _spender, uint _subtractedValue) \n returns (bool success) {\n uint oldValue = allowed[msg.sender][_spender];\n if (_subtractedValue > oldValue) {\n allowed[msg.sender][_spender] = 0;\n } else {\n allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);\n }\n Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n return true;\n }\n\n}\n",
"vendor/BasicToken.sol": "pragma solidity ^0.4.24;\n\n\nimport { ERC20Basic as linkERC20Basic } from \"../interfaces/ERC20Basic.sol\";\nimport { SafeMathChainlink as linkSafeMath } from \"./SafeMathChainlink.sol\";\n\n\n/**\n * @title Basic token\n * @dev Basic version of StandardToken, with no allowances. \n */\ncontract BasicToken is linkERC20Basic {\n using linkSafeMath for uint256;\n\n mapping(address => uint256) balances;\n\n /**\n * @dev transfer token for a specified address\n * @param _to The address to transfer to.\n * @param _value The amount to be transferred.\n */\n function transfer(address _to, uint256 _value) returns (bool) {\n balances[msg.sender] = balances[msg.sender].sub(_value);\n balances[_to] = balances[_to].add(_value);\n Transfer(msg.sender, _to, _value);\n return true;\n }\n\n /**\n * @dev Gets the balance of the specified address.\n * @param _owner The address to query the the balance of. \n * @return An uint256 representing the amount owned by the passed address.\n */\n function balanceOf(address _owner) constant returns (uint256 balance) {\n return balances[_owner];\n }\n\n}\n",
"interfaces/ERC20Basic.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title ERC20Basic\n * @dev Simpler version of ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/179\n */\ncontract ERC20Basic {\n uint256 public totalSupply;\n function balanceOf(address who) constant returns (uint256);\n function transfer(address to, uint256 value) returns (bool);\n event Transfer(address indexed from, address indexed to, uint256 value);\n}\n",
"vendor/SafeMathChainlink.sol": "pragma solidity ^0.4.11;\n\n\n/**\n * @title SafeMath\n * @dev Math operations with safety checks that throw on error\n */\nlibrary SafeMathChainlink {\n\n /**\n * @dev Multiplies two numbers, throws on overflow.\n */\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n if (_a == 0) {\n return 0;\n }\n\n c = _a * _b;\n assert(c / _a == _b);\n return c;\n }\n\n /**\n * @dev Integer division of two numbers, truncating the quotient.\n */\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\n // uint256 c = _a / _b;\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n return _a / _b;\n }\n\n /**\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n */\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n assert(_b <= _a);\n return _a - _b;\n }\n\n /**\n * @dev Adds two numbers, throws on overflow.\n */\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n c = _a + _b;\n assert(c >= _a);\n return c;\n }\n}\n",
"interfaces/ERC20.sol": "pragma solidity ^0.4.11;\n\n\nimport { ERC20Basic as linkERC20Basic } from \"./ERC20Basic.sol\";\n\n\n/**\n * @title ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/20\n */\ncontract ERC20 is linkERC20Basic {\n function allowance(address owner, address spender) constant returns (uint256);\n function transferFrom(address from, address to, uint256 value) returns (bool);\n function approve(address spender, uint256 value) returns (bool);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"
},
"sourceTreeHashHex": "0xa224c4ae64d8792b48ec10e6b63a196747c12ee47544ca993b90e8f4bd2cd177",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "UpdatableConsumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getChainlinkToken",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getOracle",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawLink",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "updateOracle",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_specId",
"type": "bytes32"
},
{
"name": "_ens",
"type": "address"
},
{
"name": "_node",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": true,
"name": "price",
"type": "bytes32"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405260016004553480156200001657600080fd5b5060405160608062001a19833981016040908152815160208301519190920151600683905562000050828264010000000062000059810204565b505050620004b1565b60008054600160a060020a038416600160a060020a03199091161781556001829055604080517f6c696e6b000000000000000000000000000000000000000000000000000000008152815190819003600401812060208083018690528284019190915282518083038401815260609092019283905281518493918291908401908083835b60208310620000fe5780518252601f199092019160209182019101620000dd565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080547f0178b8bf000000000000000000000000000000000000000000000000000000008552600485018390529551919950600160a060020a039095169650630178b8bf955060248084019592945090928390030190829087803b1580156200018e57600080fd5b505af1158015620001a3573d6000803e3d6000fd5b505050506040513d6020811015620001ba57600080fd5b5051604080517f3b3b57de0000000000000000000000000000000000000000000000000000000081526004810185905290519192506200026491600160a060020a03841691633b3b57de9160248083019260209291908290030181600087803b1580156200022757600080fd5b505af11580156200023c573d6000803e3d6000fd5b505050506040513d60208110156200025357600080fd5b50516401000000006200027d810204565b620002776401000000006200029f810204565b50505050565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600154604080517f6f7261636c6500000000000000000000000000000000000000000000000000008152815190819003600601812060208083019490945281830152815180820383018152606090910191829052805160009384939182918401908083835b60208310620003255780518252601f19909201916020918201910162000304565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080547f0178b8bf000000000000000000000000000000000000000000000000000000008552600485018390529551919950600160a060020a039095169650630178b8bf955060248084019592945090928390030190829087803b158015620003b557600080fd5b505af1158015620003ca573d6000803e3d6000fd5b505050506040513d6020811015620003e157600080fd5b5051604080517f3b3b57de0000000000000000000000000000000000000000000000000000000081526004810185905290519192506200048b91600160a060020a03841691633b3b57de9160248083019260209291908290030181600087803b1580156200044e57600080fd5b505af115801562000463573d6000803e3d6000fd5b505050506040513d60208110156200047a57600080fd5b50516401000000006200048f810204565b5050565b60038054600160a060020a031916600160a060020a0392909216919091179055565b61155880620004c16000396000f30060806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b658114610092578063165d35e1146100af5780636c0cae68146100ed578063833b1fce146101465780638dc654a21461015b5780639d1b464a14610170578063d6f124f014610197578063ec65d0f8146101ac575b600080fd5b34801561009e57600080fd5b506100ad6004356024356101ef565b005b3480156100bb57600080fd5b506100c4610338565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100f957600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100ad9436949293602493928401919081908401838280828437509497506103479650505050505050565b34801561015257600080fd5b506100c46104fa565b34801561016757600080fd5b506100ad610504565b34801561017c57600080fd5b506101856106c4565b60408051918252519081900360200190f35b3480156101a357600080fd5b506100ad6106ca565b3480156101b857600080fd5b506100ad6004356024357fffffffff00000000000000000000000000000000000000000000000000000000604435166064356106d4565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146102a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b60006103426106e0565b905090565b61034f6114df565b60606103816006543063042f2b657c0100000000000000000000000000000000000000000000000000000000026106fc565b915061044f6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250846107279092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816104645790505090508281600081518110151561048b57fe5b906020019060200201819052506104e26040805190810160405280600481526020017f706174680000000000000000000000000000000000000000000000000000000081525082846107569092919063ffffffff16565b6104f482670de0b6b3a76400006107c9565b50505050565b60006103426107f9565b600061050e6106e0565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b15801561058957600080fd5b505af115801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561062857600080fd5b505af115801561063c573d6000803e3d6000fd5b505050506040513d602081101561065257600080fd5b505115156106c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106d2610815565b565b6104f484848484610a48565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b6107046114df565b61070c6114df565b61071e8186868663ffffffff610b8316565b95945050505050565b608083015161073c908363ffffffff610be516565b6080830151610751908263ffffffff610be516565b505050565b608083015160009061076e908463ffffffff610be516565b61077b8460800151610c02565b5060005b81518110156107bc576107b4828281518110151561079957fe5b6020908102909101015160808601519063ffffffff610be516565b60010161077f565b6104f48460800151610c0d565b6003546000906107f09073ffffffffffffffffffffffffffffffffffffffff168484610c18565b90505b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b600154604080517f6f7261636c6500000000000000000000000000000000000000000000000000008152815190819003600601812060208083019490945281830152815180820383018152606090910191829052805160009384939182918401908083835b602083106108b757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161087a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018290038220600080547f0178b8bf00000000000000000000000000000000000000000000000000000000855260048501839052955191995073ffffffffffffffffffffffffffffffffffffffff9095169650630178b8bf955060248084019592945090928390030190829087803b15801561097157600080fd5b505af1158015610985573d6000803e3d6000fd5b505050506040513d602081101561099b57600080fd5b5051604080517f3b3b57de000000000000000000000000000000000000000000000000000000008152600481018590529051919250610a449173ffffffffffffffffffffffffffffffffffffffff841691633b3b57de9160248083019260209291908290030181600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b505050506040513d6020811015610a3d57600080fd5b5051610f7a565b5050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b505050505050505050565b610b8b6114df565b610b9b8560800151610100610fc1565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610bf28260038351610ffb565b610751828263ffffffff6110f816565b6106c1816004611112565b6106c1816007611112565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610ccc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c8f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610dbd8761112b565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e5d578181015183820152602001610e45565b50505050905090810190601f168015610e8a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610eab57600080fd5b505af1158015610ebf573d6000803e3d6000fd5b505050506040513d6020811015610ed557600080fd5b50511515610f6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610fc9611514565b6020820615610fde5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6017811161101d576110178360ff8481166020021683176112dd565b50610751565b60ff81116110515761103e836018602060ff8616021763ffffffff6112dd16565b506110178382600163ffffffff6112f516565b61ffff811161108657611073836019602060ff8616021763ffffffff6112dd16565b506110178382600263ffffffff6112f516565b63ffffffff81116110bd576110aa83601a602060ff8616021763ffffffff6112dd16565b506110178382600463ffffffff6112f516565b67ffffffffffffffff8111610751576110e583601b602060ff8616021763ffffffff6112dd16565b506104f48382600863ffffffff6112f516565b611100611514565b6107f083846000015151848551611316565b61075182601f602060ff8516021763ffffffff6112dd16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611220578181015183820152602001611208565b50505050905090810190601f16801561124d5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b6112e5611514565b6107f08384600001515184611408565b6112fd611514565b61130e848560000151518585611453565b949350505050565b61131e611514565b60008060008551851115151561133357600080fd5b8760200151858801111561135d5761135d886113558a602001518a89016114b1565b6002026114c8565b8751805188602083010194508089880111156113795788870182525b60208801935050505b602085106113c257815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611382565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b611410611514565b6020840151831061142c5761142c8485602001516002026114c8565b8351805160208583010184815381861415611448576001820183525b509495945050505050565b61145b611514565b60008560200151858401111561147a5761147a868685016002026114c8565b6001836101000a03905085518386820101858319825116178152815185880111156114a55784870182525b50959695505050505050565b6000818311156114c25750816107f3565b50919050565b81516114d48383610fc1565b506104f483826110f8565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161150f611514565b905290565b604080518082019091526060815260006020820152905600a165627a7a723058200511bc4a84b0a6a7132e191557061968ebe42854d9b89258b485310ebc26b7750029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x60 DUP1 PUSH3 0x1A19 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 SWAP1 SWAP3 ADD MLOAD PUSH1 0x6 DUP4 SWAP1 SSTORE PUSH3 0x50 DUP3 DUP3 PUSH5 0x100000000 PUSH3 0x59 DUP2 MUL DIV JUMP JUMPDEST POP POP POP PUSH3 0x4B1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND OR DUP2 SSTORE PUSH1 0x1 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH32 0x6C696E6B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x4 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP4 ADD DUP7 SWAP1 MSTORE DUP3 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD DUP5 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0xFE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0xDD JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 SLOAD PUSH32 0x178B8BF00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD DUP4 SWAP1 MSTORE SWAP6 MLOAD SWAP2 SWAP10 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP6 AND SWAP7 POP PUSH4 0x178B8BF SWAP6 POP PUSH1 0x24 DUP1 DUP5 ADD SWAP6 SWAP3 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP1 SUB ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x18E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x1A3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x3B3B57DE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH3 0x264 SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP2 PUSH4 0x3B3B57DE SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x227 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x23C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH5 0x100000000 PUSH3 0x27D DUP2 MUL DIV JUMP JUMPDEST PUSH3 0x277 PUSH5 0x100000000 PUSH3 0x29F DUP2 MUL DIV JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F7261636C650000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x6 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP2 DUP4 ADD MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP4 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x325 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x304 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 SLOAD PUSH32 0x178B8BF00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD DUP4 SWAP1 MSTORE SWAP6 MLOAD SWAP2 SWAP10 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP6 AND SWAP7 POP PUSH4 0x178B8BF SWAP6 POP PUSH1 0x24 DUP1 DUP5 ADD SWAP6 SWAP3 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP1 SUB ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x3B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x3CA JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x3E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x3B3B57DE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH3 0x48B SWAP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP2 PUSH4 0x3B3B57DE SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x463 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x47A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH5 0x100000000 PUSH3 0x48F DUP2 MUL DIV JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1558 DUP1 PUSH3 0x4C1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0xAF JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0xED JUMPI DUP1 PUSH4 0x833B1FCE EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x15B JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0xD6F124F0 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x1AC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1EF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC4 PUSH2 0x338 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xAD SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x347 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC4 PUSH2 0x4FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH2 0x504 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x185 PUSH2 0x6C4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH2 0x6CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x6D4 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2A9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342 PUSH2 0x6E0 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x34F PUSH2 0x14DF JUMP JUMPDEST PUSH1 0x60 PUSH2 0x381 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x6FC JUMP JUMPDEST SWAP2 POP PUSH2 0x44F PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x727 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x464 JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x48B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x4E2 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x756 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4F4 DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x7C9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342 PUSH2 0x7F9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x50E PUSH2 0x6E0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x589 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x628 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x63C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x652 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x6C1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6D2 PUSH2 0x815 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4F4 DUP5 DUP5 DUP5 DUP5 PUSH2 0xA48 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x704 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x70C PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x71E DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xB83 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x73C SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x751 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x76E SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH2 0x77B DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC02 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7BC JUMPI PUSH2 0x7B4 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x799 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x77F JUMP JUMPDEST PUSH2 0x4F4 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC0D JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x7F0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xC18 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F7261636C650000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x6 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP2 DUP4 ADD MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP4 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x8B7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x87A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 SLOAD PUSH32 0x178B8BF00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD DUP4 SWAP1 MSTORE SWAP6 MLOAD SWAP2 SWAP10 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP6 AND SWAP7 POP PUSH4 0x178B8BF SWAP6 POP PUSH1 0x24 DUP1 DUP5 ADD SWAP6 SWAP3 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP1 SUB ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x971 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x985 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x3B3B57DE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH2 0xA44 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 PUSH4 0x3B3B57DE SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xF7A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB8B PUSH2 0x14DF JUMP JUMPDEST PUSH2 0xB9B DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xFC1 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xBF2 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x751 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x10F8 AND JUMP JUMPDEST PUSH2 0x6C1 DUP2 PUSH1 0x4 PUSH2 0x1112 JUMP JUMPDEST PUSH2 0x6C1 DUP2 PUSH1 0x7 PUSH2 0x1112 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xCCC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC8F JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xDBD DUP8 PUSH2 0x112B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE45 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE8A 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xEBF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xED5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xF6A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xFC9 PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xFDE JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x101D JUMPI PUSH2 0x1017 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x12DD JUMP JUMPDEST POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1051 JUMPI PUSH2 0x103E DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1086 JUMPI PUSH2 0x1073 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x10BD JUMPI PUSH2 0x10AA DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x751 JUMPI PUSH2 0x10E5 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x4F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH2 0x1100 PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x7F0 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1316 JUMP JUMPDEST PUSH2 0x751 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1220 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1208 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124D 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x12E5 PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x7F0 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1408 JUMP JUMPDEST PUSH2 0x12FD PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x130E DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1453 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x131E PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x135D JUMPI PUSH2 0x135D DUP9 PUSH2 0x1355 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x14B1 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1379 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x13C2 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1382 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1410 PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x142C JUMPI PUSH2 0x142C DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1448 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x145B PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x147A JUMPI PUSH2 0x147A DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x14A5 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x14C2 JUMPI POP DUP2 PUSH2 0x7F3 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x14D4 DUP4 DUP4 PUSH2 0xFC1 JUMP JUMPDEST POP PUSH2 0x4F4 DUP4 DUP3 PUSH2 0x10F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x150F PUSH2 0x1514 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SDIV GT 0xbc 0x4a DUP5 0xb0 0xa6 0xa7 SGT 0x2e NOT ISZERO JUMPI MOD NOT PUSH9 0xEBE42854D9B89258B4 DUP6 BALANCE 0xe 0xbc 0x26 0xb7 PUSH22 0x290000000000000000000000000000000000000000 ",
"sourceMap": "51:454:31:-;;;1121:1:2;1094:28;;95:130:31;8:9:-1;5:2;;;30:1;27;20:12;5:2;95:130:31;;;;;;;;;;;;;;;;;;;;;;;;;166:6;:16;;;188:32;95:130;;188:19;;;;:32;:::i;:::-;95:130;;;51:454;;6260:386:2;6390:19;6339:24;;-1:-1:-1;;;;;6339:24:2;;-1:-1:-1;;;;;;6339:24:2;;;;;;;6369:15;;;777:17;;;;;;;;;;;;;;;;6422:44;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;6422:44:2;;;;;;;;6412:55;;6390:19;;6422:44;;;6412:55;;;;;6422:44;6412:55;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;6412:55:2;;;;;;;;;;;;-1:-1:-1;6528:3:2;;:25;;;;;;;;;;;6412:55;;-1:-1:-1;;;;;;6528:3:2;;;;-1:-1:-1;6528:12:2;;-1:-1:-1;6528:25:2;;;;;263:2:-1;;-1:-1;6528:25:2;;;;;;;;;:3;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;6528:25:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6528:25:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6528:25:2;6578:26;;;;;;;;;;;;;;6528:25;;-1:-1:-1;6560:45:2;;-1:-1:-1;;;;;6578:13:2;;;;;:26;;;;;6528:25;;6578:26;;;;;;;;:13;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;6578:26:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6578:26:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6578:26:2;6560:17;;;;:45;:::i;:::-;6611:30;:28;;;;:30;:::i;:::-;6260:386;;;;:::o;4751:94::-;4808:4;:32;;-1:-1:-1;;;;;;4808:32:2;-1:-1:-1;;;;;4808:32:2;;;;;;;;;;4751:94::o;6840:289::-;6952:7;;844:19;;;;;;;;;;;;;;;;6935:45;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;6935:45:2;;;;;;;;6925:56;;6901:21;;;;6935:45;;;6925:56;;;;6935:45;6925:56;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;6925:56:2;;;;;;;;;;;;-1:-1:-1;7042:3:2;;:27;;;;;;;;;;;6925:56;;-1:-1:-1;;;;;;7042:3:2;;;;-1:-1:-1;7042:12:2;;-1:-1:-1;7042:27:2;;;;;263:2:-1;;-1:-1;7042:27:2;;;;;;;;;:3;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;7042:27:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7042:27:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7042:27:2;7095:28;;;;;;;;;;;;;;7042:27;;-1:-1:-1;7076:48:2;;-1:-1:-1;;;;;7095:13:2;;;;;:28;;;;;7042:27;;7095:28;;;;;;;;:13;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;7095:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7095:28:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7095:28:2;7076:18;;;;:48;:::i;:::-;6840:289;;:::o;4529:108::-;4589:6;:43;;-1:-1:-1;;;;;;4589:43:2;-1:-1:-1;;;;;4589:43:2;;;;;;;;;;4529:108::o;51:454:31:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b658114610092578063165d35e1146100af5780636c0cae68146100ed578063833b1fce146101465780638dc654a21461015b5780639d1b464a14610170578063d6f124f014610197578063ec65d0f8146101ac575b600080fd5b34801561009e57600080fd5b506100ad6004356024356101ef565b005b3480156100bb57600080fd5b506100c4610338565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100f957600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100ad9436949293602493928401919081908401838280828437509497506103479650505050505050565b34801561015257600080fd5b506100c46104fa565b34801561016757600080fd5b506100ad610504565b34801561017c57600080fd5b506101856106c4565b60408051918252519081900360200190f35b3480156101a357600080fd5b506100ad6106ca565b3480156101b857600080fd5b506100ad6004356024357fffffffff00000000000000000000000000000000000000000000000000000000604435166064356106d4565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146102a957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b60006103426106e0565b905090565b61034f6114df565b60606103816006543063042f2b657c0100000000000000000000000000000000000000000000000000000000026106fc565b915061044f6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250846107279092919063ffffffff16565b60408051600180825281830190925290816020015b60608152602001906001900390816104645790505090508281600081518110151561048b57fe5b906020019060200201819052506104e26040805190810160405280600481526020017f706174680000000000000000000000000000000000000000000000000000000081525082846107569092919063ffffffff16565b6104f482670de0b6b3a76400006107c9565b50505050565b60006103426107f9565b600061050e6106e0565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a082319160248083019260209291908290030181600087803b15801561058957600080fd5b505af115801561059d573d6000803e3d6000fd5b505050506040513d60208110156105b357600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561062857600080fd5b505af115801561063c573d6000803e3d6000fd5b505050506040513d602081101561065257600080fd5b505115156106c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106d2610815565b565b6104f484848484610a48565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b6107046114df565b61070c6114df565b61071e8186868663ffffffff610b8316565b95945050505050565b608083015161073c908363ffffffff610be516565b6080830151610751908263ffffffff610be516565b505050565b608083015160009061076e908463ffffffff610be516565b61077b8460800151610c02565b5060005b81518110156107bc576107b4828281518110151561079957fe5b6020908102909101015160808601519063ffffffff610be516565b60010161077f565b6104f48460800151610c0d565b6003546000906107f09073ffffffffffffffffffffffffffffffffffffffff168484610c18565b90505b92915050565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b600154604080517f6f7261636c6500000000000000000000000000000000000000000000000000008152815190819003600601812060208083019490945281830152815180820383018152606090910191829052805160009384939182918401908083835b602083106108b757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161087a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260408051929094018290038220600080547f0178b8bf00000000000000000000000000000000000000000000000000000000855260048501839052955191995073ffffffffffffffffffffffffffffffffffffffff9095169650630178b8bf955060248084019592945090928390030190829087803b15801561097157600080fd5b505af1158015610985573d6000803e3d6000fd5b505050506040513d602081101561099b57600080fd5b5051604080517f3b3b57de000000000000000000000000000000000000000000000000000000008152600481018590529051919250610a449173ffffffffffffffffffffffffffffffffffffffff841691633b3b57de9160248083019260209291908290030181600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b505050506040513d6020811015610a3d57600080fd5b5051610f7a565b5050565b60008481526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101879052602481018690527fffffffff000000000000000000000000000000000000000000000000000000008516604482015260648101849052905173ffffffffffffffffffffffffffffffffffffffff831691636ee4d55391608480830192600092919082900301818387803b158015610b6457600080fd5b505af1158015610b78573d6000803e3d6000fd5b505050505050505050565b610b8b6114df565b610b9b8560800151610100610fc1565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610bf28260038351610ffb565b610751828263ffffffff6110f816565b6106c1816004611112565b6106c1816007611112565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610ccc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c8f565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900390912060045460608a01526000818152600590925283822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610dbd8761112b565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e5d578181015183820152602001610e45565b50505050905090810190601f168015610e8a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610eab57600080fd5b505af1158015610ebf573d6000803e3d6000fd5b505050506040513d6020811015610ed557600080fd5b50511515610f6a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610fc9611514565b6020820615610fde5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6017811161101d576110178360ff8481166020021683176112dd565b50610751565b60ff81116110515761103e836018602060ff8616021763ffffffff6112dd16565b506110178382600163ffffffff6112f516565b61ffff811161108657611073836019602060ff8616021763ffffffff6112dd16565b506110178382600263ffffffff6112f516565b63ffffffff81116110bd576110aa83601a602060ff8616021763ffffffff6112dd16565b506110178382600463ffffffff6112f516565b67ffffffffffffffff8111610751576110e583601b602060ff8616021763ffffffff6112dd16565b506104f48382600863ffffffff6112f516565b611100611514565b6107f083846000015151848551611316565b61075182601f602060ff8516021763ffffffff6112dd16565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611220578181015183820152602001611208565b50505050905090810190601f16801561124d5780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b6112e5611514565b6107f08384600001515184611408565b6112fd611514565b61130e848560000151518585611453565b949350505050565b61131e611514565b60008060008551851115151561133357600080fd5b8760200151858801111561135d5761135d886113558a602001518a89016114b1565b6002026114c8565b8751805188602083010194508089880111156113795788870182525b60208801935050505b602085106113c257815183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09094019360209283019290910190611382565b505181516020949094036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116931692909217909152509192915050565b611410611514565b6020840151831061142c5761142c8485602001516002026114c8565b8351805160208583010184815381861415611448576001820183525b509495945050505050565b61145b611514565b60008560200151858401111561147a5761147a868685016002026114c8565b6001836101000a03905085518386820101858319825116178152815185880111156114a55784870182525b50959695505050505050565b6000818311156114c25750816107f3565b50919050565b81516114d48383610fc1565b506104f483826110f8565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161150f611514565b905290565b604080518082019091526060815260006020820152905600a165627a7a723058200511bc4a84b0a6a7132e191557061968ebe42854d9b89258b485310ebc26b7750029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0xAF JUMPI DUP1 PUSH4 0x6C0CAE68 EQ PUSH2 0xED JUMPI DUP1 PUSH4 0x833B1FCE EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x15B JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0xD6F124F0 EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0xEC65D0F8 EQ PUSH2 0x1AC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH2 0x1EF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC4 PUSH2 0x338 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xAD SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x347 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC4 PUSH2 0x4FA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH2 0x504 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x185 PUSH2 0x6C4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH2 0x6CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x44 CALLDATALOAD AND PUSH1 0x64 CALLDATALOAD PUSH2 0x6D4 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2A9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342 PUSH2 0x6E0 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x34F PUSH2 0x14DF JUMP JUMPDEST PUSH1 0x60 PUSH2 0x381 PUSH1 0x6 SLOAD ADDRESS PUSH4 0x42F2B65 PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH2 0x6FC JUMP JUMPDEST SWAP2 POP PUSH2 0x44F PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 PUSH2 0x727 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE SWAP1 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x464 JUMPI SWAP1 POP POP SWAP1 POP DUP3 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x48B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x4E2 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x756 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4F4 DUP3 PUSH8 0xDE0B6B3A7640000 PUSH2 0x7C9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x342 PUSH2 0x7F9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x50E PUSH2 0x6E0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x589 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x628 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x63C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x652 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x6C1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6D2 PUSH2 0x815 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4F4 DUP5 DUP5 DUP5 DUP5 PUSH2 0xA48 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x704 PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x70C PUSH2 0x14DF JUMP JUMPDEST PUSH2 0x71E DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xB83 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x73C SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x751 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH1 0x0 SWAP1 PUSH2 0x76E SWAP1 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH2 0x77B DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC02 JUMP JUMPDEST POP PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x7BC JUMPI PUSH2 0x7B4 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x799 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xBE5 AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x77F JUMP JUMPDEST PUSH2 0x4F4 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC0D JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x7F0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xC18 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x6F7261636C650000000000000000000000000000000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x6 ADD DUP2 KECCAK256 PUSH1 0x20 DUP1 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE DUP2 DUP4 ADD MSTORE DUP2 MLOAD DUP1 DUP3 SUB DUP4 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP2 ADD SWAP2 DUP3 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x8B7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x87A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 SLOAD PUSH32 0x178B8BF00000000000000000000000000000000000000000000000000000000 DUP6 MSTORE PUSH1 0x4 DUP6 ADD DUP4 SWAP1 MSTORE SWAP6 MLOAD SWAP2 SWAP10 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP6 AND SWAP7 POP PUSH4 0x178B8BF SWAP6 POP PUSH1 0x24 DUP1 DUP5 ADD SWAP6 SWAP3 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP1 SUB ADD SWAP1 DUP3 SWAP1 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x971 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x985 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x99B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x3B3B57DE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH2 0xA44 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 PUSH4 0x3B3B57DE SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xA13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xA27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA3D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH2 0xF7A JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP2 AND SWAP1 SWAP2 SSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP2 DUP7 SWAP2 PUSH32 0xE1FE3AFA0F7F761FF0A8B89086790EFD5140D2907EBD5B7FF6BFCB5E075FD4C5 SWAP2 SWAP1 LOG2 PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP8 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP6 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP5 SWAP1 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP4 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB78 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB8B PUSH2 0x14DF JUMP JUMPDEST PUSH2 0xB9B DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xFC1 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xBF2 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xFFB JUMP JUMPDEST PUSH2 0x751 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x10F8 AND JUMP JUMPDEST PUSH2 0x6C1 DUP2 PUSH1 0x4 PUSH2 0x1112 JUMP JUMPDEST PUSH2 0x6C1 DUP2 PUSH1 0x7 PUSH2 0x1112 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xCCC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC8F JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xDBD DUP8 PUSH2 0x112B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE5D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE45 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE8A 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xEAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xEBF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xED5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xF6A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xFC9 PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xFDE JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x101D JUMPI PUSH2 0x1017 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x12DD JUMP JUMPDEST POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1051 JUMPI PUSH2 0x103E DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1086 JUMPI PUSH2 0x1073 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x10BD JUMPI PUSH2 0x10AA DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x1017 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x751 JUMPI PUSH2 0x10E5 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST POP PUSH2 0x4F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x12F5 AND JUMP JUMPDEST PUSH2 0x1100 PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x7F0 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1316 JUMP JUMPDEST PUSH2 0x751 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x12DD AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1220 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1208 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124D 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x12E5 PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x7F0 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1408 JUMP JUMPDEST PUSH2 0x12FD PUSH2 0x1514 JUMP JUMPDEST PUSH2 0x130E DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1453 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x131E PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x135D JUMPI PUSH2 0x135D DUP9 PUSH2 0x1355 DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x14B1 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1379 JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x13C2 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1382 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1410 PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x142C JUMPI PUSH2 0x142C DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1448 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x145B PUSH2 0x1514 JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x147A JUMPI PUSH2 0x147A DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x14C8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x14A5 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x14C2 JUMPI POP DUP2 PUSH2 0x7F3 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x14D4 DUP4 DUP4 PUSH2 0xFC1 JUMP JUMPDEST POP PUSH2 0x4F4 DUP4 DUP3 PUSH2 0x10F8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x150F PUSH2 0x1514 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SDIV GT 0xbc 0x4a DUP5 0xb0 0xa6 0xa7 SGT 0x2e NOT ISZERO JUMPI MOD NOT PUSH9 0xEBE42854D9B89258B4 DUP6 BALANCE 0xe 0xbc 0x26 0xb7 PUSH22 0x290000000000000000000000000000000000000000 ",
"sourceMap": "51:454:31:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1169:188:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1169:188:24;;;;;;;;;305:100:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;305:100:31;;;;;;;;;;;;;;;;;;;;;;;323:404:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;323:404:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;323:404:24;;-1:-1:-1;323:404:24;;-1:-1:-1;;;;;;;323:404:24;409:93:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;409:93:31;;;;961:204:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;961:204:24;;;;127:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:27:24;;;;;;;;;;;;;;;;;;;;229:72:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;229:72:31;;;;731:226:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;731:226:24;;;;;;;;;;;;;1169:188;8660:27:2;;;;:15;:27;;;;;;;;;;8646:10;:41;8638:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;;;;;8783:30;8761:10;;8783:30;;;1289:36:24;;1318:6;;1306:10;;1289:36;;;;;-1:-1:-1;1331:12:24;:21;-1:-1:-1;1169:188:24:o;305:100:31:-;355:7;377:23;:21;:23::i;:::-;370:30;;305:100;:::o;323:404:24:-;384:28;;:::i;:::-;574:20;415:58;437:6;;445:4;451:21;;;415;:58::i;:::-;384:89;;479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;597:15;;;610:1;597:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;574:38;;628:9;618:4;623:1;618:7;;;;;;;;;;;;;;;;;:19;;;;643:32;;;;;;;;;;;;;;;;;;;670:4;643:3;:18;;:32;;;;;:::i;:::-;681:41;702:3;579:6:2;681:20:24;:41::i;:::-;;323:404;;;:::o;409:93:31:-;451:7;473:24;:22;:24::i;961:204:24:-;998:23;1043;:21;:23::i;:::-;1107:29;;;;;;1130:4;1107:29;;;;;;998:69;;-1:-1:-1;1081:13:24;;;;;;1095:10;;1081:13;;1107:14;;:29;;;;;;;;;;;;;;-1:-1:-1;1081:13:24;1107:29;;;5:2:-1;;;;30:1;27;20:12;5:2;1107:29:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1107:29:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1107:29:24;1081:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:29;;1081:56;;;;;;;-1:-1:-1;1081:56:24;;;;5:2:-1;;;;30:1;27;20:12;5:2;1081:56:24;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1081:56:24;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1081:56:24;1073:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;961:204;:::o;127:27::-;;;;:::o;229:72:31:-;266:30;:28;:30::i;:::-;229:72::o;731:226:24:-;874:78;897:10;909:8;919:19;940:11;874:22;:78::i;5210:110:2:-;5310:4;;;;5210:110;:::o;1725:295::-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;1958:155:1:-;2046:8;;;;:27;;2068:4;2046:27;:21;:27;:::i;:::-;2079:8;;;;:29;;2101:6;2079:29;:21;:29;:::i;:::-;1958:155;;;:::o;3428:294::-;3537:8;;;;3602:9;;3537:27;;3559:4;3537:27;:21;:27;:::i;:::-;3570:21;:4;:8;;;:19;:21::i;:::-;-1:-1:-1;3614:1:1;3597:93;3621:7;:14;3617:1;:18;3597:93;;;3650:33;3672:7;3680:1;3672:10;;;;;;;;;;;;;;;;;;;3650:8;;;;;:33;:21;:33;:::i;:::-;3637:3;;3597:93;;;3695:22;:4;:8;;;:20;:22::i;2317:180:2:-;2469:6;;2422:7;;2446:46;;2469:6;;2477:4;2483:8;2446:22;:46::i;:::-;2439:53;;2317:180;;;;;:::o;5449:113::-;5550:6;;;;5449:113;:::o;6840:289::-;6952:7;;844:19;;;;;;;;;;;;;;;;6935:45;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;6935:45:2;;;;;;;;6925:56;;6901:21;;;;6935:45;;;6925:56;;;;6935:45;6925:56;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;6925:56:2;;;;;;;;;;;;-1:-1:-1;7042:3:2;;:27;;;;;;;;;;;6925:56;;-1:-1:-1;7042:3:2;;;;;-1:-1:-1;7042:12:2;;-1:-1:-1;7042:27:2;;;;;263:2:-1;;-1:-1;7042:27:2;;;;;;;;;:3;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;7042:27:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7042:27:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7042:27:2;7095:28;;;;;;;;;;;;;;7042:27;;-1:-1:-1;7076:48:2;;7095:13;;;;;;:28;;;;;7042:27;;7095:28;;;;;;;;:13;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;7095:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7095:28:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7095:28:2;7076:18;:48::i;:::-;6840:289;;:::o;3997:417::-;4151:35;4215:27;;;:15;:27;;;;;;;;4249:34;;;;;;4294:30;;4215:27;;;;;4231:10;;4294:30;;4151:35;4294:30;4330:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;4330:79:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4330:79:2;;;;3997:417;;;;;:::o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;1228:39;;:20;;;:39;1273:43;;:23;;;:43;1209:13;972:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;3001:476:2:-;3125:17;3191:4;3197:8;;3174:32;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3174:32:2;;;3164:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;;;;;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;;;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3330:60:2;3322:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;:::o;4529:108::-;4589:6;:43;;;;;;;;;;;;;;;4529:108::o;942:395:33:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:33;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:33;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;4496:155:33:-;4573:6;;:::i;:::-;4601:45;4607:3;4612;:7;;;:14;4628:4;4634;:11;4601:5;:45::i;1439:155:34:-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;7481:527:2:-;7878:7;;7893:20;;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7628:6;7598:405;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;;;;;;;;;;;;;;7628:6;7598:405;;;;;;7628:6;7598:405;;;;;;;;;;;;;;7569:5;;7628:29;;:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7990:12;;7598:405;;;;;;;;;;7628:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7598:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7598:405:2;;;22:32:-1;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;7598:405:2;;;;179:29:-1;;;;160:49;;;-1:-1;7598:405:2;;-1:-1:-1;;;;;;;;;;7481:527:2;;;:::o;5811:144:33:-;5885:6;;:::i;:::-;5913:37;5924:3;5929;:7;;;:14;5945:4;5913:10;:37::i;9497:154::-;9578:6;;:::i;:::-;9606:40;9615:3;9620;:7;;;:14;9636:4;9642:3;9606:8;:40::i;:::-;9599:47;9497:154;-1:-1:-1;;;;9497:154:33:o;2651:1140::-;2746:6;;:::i;:::-;2897:9;2912:8;3580:9;2782:4;:11;2775:3;:18;;2767:27;;;;;;;;2817:3;:12;;;2811:3;2805;:9;:24;2801:90;;;2839:45;2846:3;2851:28;2855:3;:12;;;2875:3;2869;:9;2851:3;:28::i;:::-;2882:1;2851:32;2839:6;:45::i;:::-;3006:3;3000:10;3077:6;3071:13;3193:3;3188:2;3180:6;3176:15;3172:25;3164:33;;3277:6;3271:3;3266;3262:13;3259:25;3256:2;;;3319:3;3314;3310:13;3302:6;3295:29;3256:2;3356;3350:4;3346:13;3339:20;;2935:430;;3417:129;3431:2;3424:9;;3417:129;;3486:10;;3473:24;;3435:9;;;;;3520:2;3512:10;;;;3530:9;;;;3417:129;;;-1:-1:-1;3655:10:33;3704:11;;3600:2;:8;;;;3592:3;:17;:21;;3667:9;;3651:26;;;3700:22;;3742:21;;;;3729:35;;;-1:-1:-1;3783:3:33;;;-1:-1:-1;;2651:1140:33:o;4945:619::-;5028:6;;:::i;:::-;5060:12;;;;5053:19;;5049:69;;5082:29;5089:3;5094;:12;;;5109:1;5094:16;5082:6;:29::i;:::-;5204:3;5198:10;5275:6;5269:13;5387:2;5381:3;5373:6;5369:16;5365:25;5411:4;5405;5397:19;5482:6;5477:3;5474:15;5471:2;;;5527:1;5519:6;5515:14;5507:6;5500:30;5471:2;-1:-1:-1;5556:3:33;;4945:619;-1:-1:-1;;;;;4945:619:33:o;8610:642::-;8699:6;;:::i;:::-;8799:9;8736:3;:12;;;8730:3;8724;:9;:24;8720:73;;;8758:28;8765:3;8777;8771;:9;8784:1;8770:15;8758:6;:28::i;:::-;8824:1;8818:3;8811;:10;:14;8799:26;;8911:3;8905:10;9026:3;9020;9012:6;9008:16;9004:26;9082:4;9074;9070:9;9063:4;9057:11;9053:27;9050:37;9044:4;9037:51;9170:6;9164:13;9158:3;9153;9149:13;9146:32;9143:2;;;9213:3;9208;9204:13;9196:6;9189:29;9143:2;-1:-1:-1;9244:3:33;;8610:642;-1:-1:-1;;;;;;8610:642:33:o;1889:114::-;1939:4;1959:1;1955;:5;1951:34;;;-1:-1:-1;1977:1:33;1970:8;;1951:34;-1:-1:-1;1997:1:33;1889:114;-1:-1:-1;1889:114:33:o;1732:153::-;1823:7;;1836:19;1823:3;1846:8;1836:4;:19::i;:::-;;1861;1868:3;1873:6;1861;:19::i;51:454:31:-;;;;;;;;;-1:-1:-1;51:454:31;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;51:454:31;;;;;:::o"
},
"methodIdentifiers": {
"cancelRequest(bytes32,uint256,bytes4,uint256)": "ec65d0f8",
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"getChainlinkToken()": "165d35e1",
"getOracle()": "833b1fce",
"requestEthereumPrice(string)": "6c0cae68",
"updateOracle()": "d6f124f0",
"withdrawLink()": "8dc654a2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.4.24+commit.e67f0147\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getChainlinkToken\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOracle\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawLink\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateOracle\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_specId\",\"type\":\"bytes32\"},{\"name\":\"_ens\",\"type\":\"address\"},{\"name\":\"_node\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"RequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/UpdatableConsumer.sol\":\"UpdatableConsumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/Chainlink.sol\":{\"keccak256\":\"0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63\",\"urls\":[\"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/ChainlinkClient.sol\":{\"keccak256\":\"0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380\",\"urls\":[\"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992\",\"urls\":[\"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/ENSInterface.sol\":{\"keccak256\":\"0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767\",\"urls\":[\"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92\",\"urls\":[\"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/interfaces/PointerInterface.sol\":{\"keccak256\":\"0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218\",\"urls\":[\"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/Consumer.sol\":{\"keccak256\":\"0xbfa7e56235f6b488d92d3d5441048331cc6d1cbd83518eb07a0805e7a62f4449\",\"urls\":[\"bzzr://05c399b169c9aebb647d546fff910e4452d13d54080ee031f6ca442302c8ef6e\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/tests/UpdatableConsumer.sol\":{\"keccak256\":\"0x04390d3aa35afc2cb48ddf07dbb39a758acc01de499e003216eecd06b164c173\",\"urls\":[\"bzzr://8e56fb27d91f250a0236467bb7f6955ee4870cf5ba3bcb926cb4c9a6a80afe6c\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/Buffer.sol\":{\"keccak256\":\"0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883\",\"urls\":[\"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.4/vendor/ENSResolver.sol\":{\"keccak256\":\"0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683\",\"urls\":[\"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/UpdatableConsumer.sol": {
"id": 31
},
"tests/Consumer.sol": {
"id": 24
},
"ChainlinkClient.sol": {
"id": 2
},
"Chainlink.sol": {
"id": 1
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 12
},
"interfaces/LinkTokenInterface.sol": {
"id": 18
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 11
},
"interfaces/PointerInterface.sol": {
"id": 20
},
"vendor/ENSResolver.sol": {
"id": 37
}
},
"sourceCodes": {
"tests/UpdatableConsumer.sol": "pragma solidity 0.4.24;\n\nimport \"./Consumer.sol\";\n\ncontract UpdatableConsumer is Consumer {\n\n constructor(bytes32 _specId, address _ens, bytes32 _node) public {\n specId = _specId;\n useChainlinkWithENS(_ens, _node);\n }\n\n function updateOracle() public {\n updateChainlinkOracleWithENS();\n }\n\n function getChainlinkToken() public view returns (address) {\n return chainlinkTokenAddress();\n }\n\n function getOracle() public view returns (address) {\n return chainlinkOracleAddress();\n }\n\n}\n",
"tests/Consumer.sol": "pragma solidity 0.4.24;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract Consumer is ChainlinkClient {\n bytes32 internal specId;\n bytes32 public currentPrice;\n\n uint256 constant private ORACLE_PAYMENT = 1 * LINK;\n\n event RequestFulfilled(\n bytes32 indexed requestId, // User-defined ID\n bytes32 indexed price\n );\n\n function requestEthereumPrice(string _currency) public {\n Chainlink.Request memory req = buildChainlinkRequest(specId, this, this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n string[] memory path = new string[](1);\n path[0] = _currency;\n req.addStringArray(\"path\", path);\n sendChainlinkRequest(req, ORACLE_PAYMENT);\n }\n\n function cancelRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n cancelChainlinkRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function withdrawLink() public {\n LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress());\n require(link.transfer(msg.sender, link.balanceOf(address(this))), \"Unable to transfer\");\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n emit RequestFulfilled(_requestId, _price);\n currentPrice = _price;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.4.24;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = 0x0;\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requests = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(oracle, _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requests));\n _req.nonce = requests;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requests += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId], \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.4.24;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string _key, string _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string _key, bytes _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity >0.4.18;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}\n",
"interfaces/ENSInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external;\n function setResolver(bytes32 node, address resolver) external;\n function setOwner(bytes32 node, address owner) external;\n function setTTL(bytes32 node, uint64 ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.4.24;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string tokenName);\n function symbol() external view returns (string tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.4.24;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 payment,\n bytes32 id,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 version,\n bytes data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.4.24;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity 0.4.24;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x2de247c010f774287ce16cd413188f1e6a37d70277285f27e3e304c80ae42db1",
"compiler": {
"name": "solc",
"version": "soljson-v0.4.24+commit.e67f0147.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "AggregatorInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "latestAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRound",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "current",
"type": "int256"
},
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": false,
"name": "timestamp",
"type": "uint256"
}
],
"name": "AnswerUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": true,
"name": "startedBy",
"type": "address"
},
{
"indexed": false,
"name": "startedAt",
"type": "uint256"
}
],
"name": "NewRound",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"getAnswer(uint256)": "b5ab58dc",
"getTimestamp(uint256)": "b633620c",
"latestAnswer()": "50d25bcd",
"latestRound()": "668a0f02",
"latestTimestamp()": "8205bf6a"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/AggregatorInterface.sol": {
"id": 11
}
},
"sourceCodes": {
"interfaces/AggregatorInterface.sol": "pragma solidity >=0.5.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n"
},
"sourceTreeHashHex": "0x64fa8b255860b1cf2661a2d87ca287c21479edf18673ca694a770b6498e2de39",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "AggregatorV2V3Interface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "version",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRound",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "description",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_roundId",
"type": "uint80"
}
],
"name": "getRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getAnswer",
"outputs": [
{
"name": "",
"type": "int256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "roundId",
"type": "uint256"
}
],
"name": "getTimestamp",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "current",
"type": "int256"
},
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": false,
"name": "timestamp",
"type": "uint256"
}
],
"name": "AnswerUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "roundId",
"type": "uint256"
},
{
"indexed": true,
"name": "startedBy",
"type": "address"
},
{
"indexed": false,
"name": "startedAt",
"type": "uint256"
}
],
"name": "NewRound",
"type": "event"
}
],
"devdoc": {
"methods": {},
"title": "The V2 & V3 Aggregator Interface"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"decimals()": "313ce567",
"description()": "7284e416",
"getAnswer(uint256)": "b5ab58dc",
"getRoundData(uint80)": "9a6fc8f5",
"getTimestamp(uint256)": "b633620c",
"latestAnswer()": "50d25bcd",
"latestRound()": "668a0f02",
"latestRoundData()": "feaf968c",
"latestTimestamp()": "8205bf6a",
"version()": "54fd4d50"
}
},
"metadata": "",
"userdoc": {
"methods": {},
"notice": "Solidity V0.5 does not allow interfaces to inherit from other interfaces so this contract is a combination of v0.5 AggregatorInterface.sol and v0.5 AggregatorV3Interface.sol."
}
},
"sources": {
"interfaces/AggregatorV2V3Interface.sol": {
"id": 12
},
"interfaces/AggregatorInterface.sol": {
"id": 11
},
"interfaces/AggregatorV3Interface.sol": {
"id": 13
}
},
"sourceCodes": {
"interfaces/AggregatorV2V3Interface.sol": "pragma solidity >=0.5.0;\n\nimport \"./AggregatorInterface.sol\";\nimport \"./AggregatorV3Interface.sol\";\n\n/**\n * @title The V2 & V3 Aggregator Interface\n * @notice Solidity V0.5 does not allow interfaces to inherit from other\n * interfaces so this contract is a combination of v0.5 AggregatorInterface.sol\n * and v0.5 AggregatorV3Interface.sol.\n */\ninterface AggregatorV2V3Interface {\n //\n // V2 Interface:\n //\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n\n //\n // V3 Interface:\n //\n function decimals() external view returns (uint8);\n function description() external view returns (string memory);\n function version() external view returns (uint256);\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(uint80 _roundId)\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n",
"interfaces/AggregatorInterface.sol": "pragma solidity >=0.5.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n function latestTimestamp() external view returns (uint256);\n function latestRound() external view returns (uint256);\n function getAnswer(uint256 roundId) external view returns (int256);\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp);\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n",
"interfaces/AggregatorV3Interface.sol": "pragma solidity >=0.5.0;\n\ninterface AggregatorV3Interface {\n\n function decimals() external view returns (uint8);\n function description() external view returns (string memory);\n function version() external view returns (uint256);\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(uint80 _roundId)\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n"
},
"sourceTreeHashHex": "0x8d77d33c824250739a6cc244710a1581bbe617fe7bdeed82daa032f0e23f07f9",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "AggregatorV3Interface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [],
"name": "decimals",
"outputs": [
{
"name": "",
"type": "uint8"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "version",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "description",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "_roundId",
"type": "uint80"
}
],
"name": "getRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "latestRoundData",
"outputs": [
{
"name": "roundId",
"type": "uint80"
},
{
"name": "answer",
"type": "int256"
},
{
"name": "startedAt",
"type": "uint256"
},
{
"name": "updatedAt",
"type": "uint256"
},
{
"name": "answeredInRound",
"type": "uint80"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"decimals()": "313ce567",
"description()": "7284e416",
"getRoundData(uint80)": "9a6fc8f5",
"latestRoundData()": "feaf968c",
"version()": "54fd4d50"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/AggregatorV3Interface.sol": {
"id": 13
}
},
"sourceCodes": {
"interfaces/AggregatorV3Interface.sol": "pragma solidity >=0.5.0;\n\ninterface AggregatorV3Interface {\n\n function decimals() external view returns (uint8);\n function description() external view returns (string memory);\n function version() external view returns (uint256);\n\n // getRoundData and latestRoundData should both raise \"No data present\"\n // if they do not have data to report, instead of returning unset values\n // which could be misinterpreted as actual reported values.\n function getRoundData(uint80 _roundId)\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n}\n"
},
"sourceTreeHashHex": "0x636b9f52b4ef5795c35a189a94e95a8f909ed1f7ef799e0218b71d97b3a780a0",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "BasicConsumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callback",
"type": "address"
}
],
"name": "requestEthereumPriceByCallback",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
},
{
"name": "_payment",
"type": "uint256"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawLink",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_requestId",
"type": "bytes32"
}
],
"name": "addExternalRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"name": "_link",
"type": "address"
},
{
"name": "_oracle",
"type": "address"
},
{
"name": "_specId",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": true,
"name": "price",
"type": "bytes32"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b5060405160608061145f8339810180604052606081101561003557600080fd5b508051602082015160409092015190919061005883640100000000610075810204565b61006a82640100000000610097810204565b600655506100b99050565b60028054600160a060020a031916600160a060020a0392909216919091179055565b60038054600160a060020a031916600160a060020a0392909216919091179055565b611397806100c86000396000f3fe6080604052600436106100825763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100875780635591a608146100b957806374961d4d1461013357806383db5cbc146102015780638dc654a2146102b65780639d1b464a146102cb578063e8d5359d146102f2575b600080fd5b34801561009357600080fd5b506100b7600480360360408110156100aa57600080fd5b5080359060200135610338565b005b3480156100c557600080fd5b506100b7600480360360a08110156100dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060800135610481565b34801561013f57600080fd5b506100b76004803603606081101561015657600080fd5b81019060208101813564010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013573ffffffffffffffffffffffffffffffffffffffff16610548565b34801561020d57600080fd5b506100b76004803603604081101561022457600080fd5b81019060208101813564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106f3915050565b3480156102c257600080fd5b506100b7610702565b3480156102d757600080fd5b506102e06108c0565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506100b76004803603604081101561031557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108c6565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff0000000000000000000000000000000000000000000000000000000084166044820152606481018390529051869173ffffffffffffffffffffffffffffffffffffffff831691636ee4d5539160848082019260009290919082900301818387803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b50505050505050505050565b61055061131e565b60065461057e90837f042f2b65000000000000000000000000000000000000000000000000000000006108d0565b905061064c6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836108fb9092919063ffffffff16565b604080516001808252818301909252606091816020015b60608152602001906001900390816106635790505090508481600081518110151561068a57fe5b906020019060200201819052506106e16040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461092a9092919063ffffffff16565b6106eb828561099a565b505050505050565b6106fe828230610548565b5050565b600061070c6109ca565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b15801561078557600080fd5b505afa158015610799573d6000803e3d6000fd5b505050506040513d60208110156107af57600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b505115156108bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106fe82826109e6565b6108d861131e565b6108e061131e565b6108f28186868663ffffffff610acd16565b95945050505050565b6080830151610910908363ffffffff610b2f16565b6080830151610925908263ffffffff610b2f16565b505050565b608083015161093f908363ffffffff610b2f16565b61094c8360800151610b4c565b60005b815181101561098c57610984828281518110151561096957fe5b6020908102909101015160808601519063ffffffff610b2f16565b60010161094f565b506109258360800151610b57565b6003546000906109c19073ffffffffffffffffffffffffffffffffffffffff168484610b62565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610a7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610ad561131e565b610ae58560800151610100610e04565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610b3c8260038351610e3e565b610925828263ffffffff610f4116565b6108bd816004610f5b565b6108bd816007610f5b565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610c4787610f74565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ce7578181015183820152602001610ccf565b50505050905090810190601f168015610d145780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d3557600080fd5b505af1158015610d49573d6000803e3d6000fd5b505050506040513d6020811015610d5f57600080fd5b50511515610df457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610e0c611353565b6020820615610e215760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610e6057610e5a8360ff848116602002168317611126565b50610925565b60ff8111610e9457610e81836018602060ff8616021763ffffffff61112616565b50610e5a8382600163ffffffff61113e16565b61ffff8111610ec957610eb6836019602060ff8616021763ffffffff61112616565b50610e5a8382600263ffffffff61113e16565b63ffffffff8111610f0057610eed83601a602060ff8616021763ffffffff61112616565b50610e5a8382600463ffffffff61113e16565b67ffffffffffffffff811161092557610f2883601b602060ff8616021763ffffffff61112616565b50610f3b8382600863ffffffff61113e16565b50505050565b610f49611353565b6109c18384600001515184855161115f565b61092582601f602060ff8516021763ffffffff61112616565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b61112e611353565b6109c18384600001515184611247565b611146611353565b611157848560000151518585611292565b949350505050565b611167611353565b825182111561117557600080fd5b8460200151828501111561119f5761119f8561119787602001518786016112f0565b600202611307565b6000808651805187602083010193508088870111156111be5787860182525b505050602084015b6020841061120357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016111c6565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b61124f611353565b6020840151831061126b5761126b848560200151600202611307565b8351805160208583010184815381861415611287576001820183525b509495945050505050565b61129a611353565b846020015184830111156112b7576112b785858401600202611307565b60006001836101000a03905085518386820101858319825116178152815185880111156112e45784870182525b50959695505050505050565b6000818311156113015750816109c4565b50919050565b81516113138383610e04565b50610f3b8382610f41565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161134e611353565b905290565b6040805180820190915260608152600060208201529056fea165627a7a723058203b872aa1bee2ed7f0455d9496046bbf1d3b5a31146d63bd709cac6821608841a0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x60 DUP1 PUSH2 0x145F DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 SWAP1 SWAP3 ADD MLOAD SWAP1 SWAP2 SWAP1 PUSH2 0x58 DUP4 PUSH5 0x100000000 PUSH2 0x75 DUP2 MUL DIV JUMP JUMPDEST PUSH2 0x6A DUP3 PUSH5 0x100000000 PUSH2 0x97 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x6 SSTORE POP PUSH2 0xB9 SWAP1 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x1397 DUP1 PUSH2 0xC8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x5591A608 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x74961D4D EQ PUSH2 0x133 JUMPI DUP1 PUSH4 0x83DB5CBC EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x2B6 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xE8D5359D EQ PUSH2 0x2F2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x338 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x548 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x6F3 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH2 0x702 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD DUP7 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x528 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x53C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x550 PUSH2 0x131E JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x57E SWAP1 DUP4 PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x8D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x64C PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x8FB SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x663 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x68A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x6E1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x92A SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x6EB DUP3 DUP6 PUSH2 0x99A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 ADDRESS PUSH2 0x548 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70C PUSH2 0x9CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x785 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x799 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x824 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x838 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x84E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x8BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 PUSH2 0x9E6 JUMP JUMPDEST PUSH2 0x8D8 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8E0 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8F2 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xACD AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x910 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x925 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x93F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH2 0x94C DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x98C JUMPI PUSH2 0x984 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x969 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x94F JUMP JUMPDEST POP PUSH2 0x925 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB57 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x9C1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB62 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xA79 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0x131E JUMP JUMPDEST PUSH2 0xAE5 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xE04 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xB3C DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xE3E JUMP JUMPDEST PUSH2 0x925 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF41 AND JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x4 PUSH2 0xF5B JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x7 PUSH2 0xF5B JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xC47 DUP8 PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCE7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCCF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD14 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xDF4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xE21 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xE60 JUMPI PUSH2 0xE5A DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1126 JUMP JUMPDEST POP PUSH2 0x925 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xE94 JUMPI PUSH2 0xE81 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xEC9 JUMPI PUSH2 0xEB6 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xF00 JUMPI PUSH2 0xEED DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x925 JUMPI PUSH2 0xF28 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x115F JUMP JUMPDEST PUSH2 0x925 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1069 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1051 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1096 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x112E PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x1157 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1292 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1167 PUSH2 0x1353 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x119F JUMPI PUSH2 0x119F DUP6 PUSH2 0x1197 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x12F0 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x11BE JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x124F PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x126B JUMPI PUSH2 0x126B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1287 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x129A PUSH2 0x1353 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x12B7 JUMPI PUSH2 0x12B7 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x12E4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1301 JUMPI POP DUP2 PUSH2 0x9C4 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1313 DUP4 DUP4 PUSH2 0xE04 JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH2 0xF41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x134E PUSH2 0x1353 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 EXTCODESIZE DUP8 0x2a LOG1 0xbe 0xe2 0xed PUSH32 0x455D9496046BBF1D3B5A31146D63BD709CAC6821608841A0029000000000000 ",
"sourceMap": "51:201:21:-;;;1131:1:1;1100:32;;91:158:21;8:9:-1;5:2;;;30:1;27;20:12;5:2;91:158:21;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;91:158:21;;;;;;;;;;;;;;165:24;91:158;165:17;;;;:24;:::i;:::-;195:27;214:7;195:18;;;;:27;:::i;:::-;228:6;:16;-1:-1:-1;51:201:21;;-1:-1:-1;51:201:21;4782:94:1;4839:4;:32;;-1:-1:-1;;;;;;4839:32:1;-1:-1:-1;;;;;4839:32:1;;;;;;;;;;4782:94::o;4560:108::-;4620:6;:43;;-1:-1:-1;;;;;;4620:43:1;-1:-1:-1;;;;;4620:43:1;;;;;;;;;;4560:108::o;51:201:21:-;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100825763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100875780635591a608146100b957806374961d4d1461013357806383db5cbc146102015780638dc654a2146102b65780639d1b464a146102cb578063e8d5359d146102f2575b600080fd5b34801561009357600080fd5b506100b7600480360360408110156100aa57600080fd5b5080359060200135610338565b005b3480156100c557600080fd5b506100b7600480360360a08110156100dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060800135610481565b34801561013f57600080fd5b506100b76004803603606081101561015657600080fd5b81019060208101813564010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013573ffffffffffffffffffffffffffffffffffffffff16610548565b34801561020d57600080fd5b506100b76004803603604081101561022457600080fd5b81019060208101813564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106f3915050565b3480156102c257600080fd5b506100b7610702565b3480156102d757600080fd5b506102e06108c0565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506100b76004803603604081101561031557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108c6565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff0000000000000000000000000000000000000000000000000000000084166044820152606481018390529051869173ffffffffffffffffffffffffffffffffffffffff831691636ee4d5539160848082019260009290919082900301818387803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b50505050505050505050565b61055061131e565b60065461057e90837f042f2b65000000000000000000000000000000000000000000000000000000006108d0565b905061064c6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836108fb9092919063ffffffff16565b604080516001808252818301909252606091816020015b60608152602001906001900390816106635790505090508481600081518110151561068a57fe5b906020019060200201819052506106e16040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461092a9092919063ffffffff16565b6106eb828561099a565b505050505050565b6106fe828230610548565b5050565b600061070c6109ca565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b15801561078557600080fd5b505afa158015610799573d6000803e3d6000fd5b505050506040513d60208110156107af57600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b505115156108bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106fe82826109e6565b6108d861131e565b6108e061131e565b6108f28186868663ffffffff610acd16565b95945050505050565b6080830151610910908363ffffffff610b2f16565b6080830151610925908263ffffffff610b2f16565b505050565b608083015161093f908363ffffffff610b2f16565b61094c8360800151610b4c565b60005b815181101561098c57610984828281518110151561096957fe5b6020908102909101015160808601519063ffffffff610b2f16565b60010161094f565b506109258360800151610b57565b6003546000906109c19073ffffffffffffffffffffffffffffffffffffffff168484610b62565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610a7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610ad561131e565b610ae58560800151610100610e04565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610b3c8260038351610e3e565b610925828263ffffffff610f4116565b6108bd816004610f5b565b6108bd816007610f5b565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610c4787610f74565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ce7578181015183820152602001610ccf565b50505050905090810190601f168015610d145780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d3557600080fd5b505af1158015610d49573d6000803e3d6000fd5b505050506040513d6020811015610d5f57600080fd5b50511515610df457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610e0c611353565b6020820615610e215760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610e6057610e5a8360ff848116602002168317611126565b50610925565b60ff8111610e9457610e81836018602060ff8616021763ffffffff61112616565b50610e5a8382600163ffffffff61113e16565b61ffff8111610ec957610eb6836019602060ff8616021763ffffffff61112616565b50610e5a8382600263ffffffff61113e16565b63ffffffff8111610f0057610eed83601a602060ff8616021763ffffffff61112616565b50610e5a8382600463ffffffff61113e16565b67ffffffffffffffff811161092557610f2883601b602060ff8616021763ffffffff61112616565b50610f3b8382600863ffffffff61113e16565b50505050565b610f49611353565b6109c18384600001515184855161115f565b61092582601f602060ff8516021763ffffffff61112616565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b61112e611353565b6109c18384600001515184611247565b611146611353565b611157848560000151518585611292565b949350505050565b611167611353565b825182111561117557600080fd5b8460200151828501111561119f5761119f8561119787602001518786016112f0565b600202611307565b6000808651805187602083010193508088870111156111be5787860182525b505050602084015b6020841061120357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016111c6565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b61124f611353565b6020840151831061126b5761126b848560200151600202611307565b8351805160208583010184815381861415611287576001820183525b509495945050505050565b61129a611353565b846020015184830111156112b7576112b785858401600202611307565b60006001836101000a03905085518386820101858319825116178152815185880111156112e45784870182525b50959695505050505050565b6000818311156113015750816109c4565b50919050565b81516113138383610e04565b50610f3b8382610f41565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161134e611353565b905290565b6040805180820190915260608152600060208201529056fea165627a7a723058203b872aa1bee2ed7f0455d9496046bbf1d3b5a31146d63bd709cac6821608841a0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x5591A608 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x74961D4D EQ PUSH2 0x133 JUMPI DUP1 PUSH4 0x83DB5CBC EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x2B6 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xE8D5359D EQ PUSH2 0x2F2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x338 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x548 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x6F3 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH2 0x702 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD DUP7 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x528 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x53C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x550 PUSH2 0x131E JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x57E SWAP1 DUP4 PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x8D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x64C PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x8FB SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x663 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x68A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x6E1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x92A SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x6EB DUP3 DUP6 PUSH2 0x99A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 ADDRESS PUSH2 0x548 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70C PUSH2 0x9CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x785 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x799 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x824 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x838 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x84E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x8BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 PUSH2 0x9E6 JUMP JUMPDEST PUSH2 0x8D8 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8E0 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8F2 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xACD AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x910 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x925 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x93F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH2 0x94C DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x98C JUMPI PUSH2 0x984 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x969 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x94F JUMP JUMPDEST POP PUSH2 0x925 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB57 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x9C1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB62 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xA79 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0x131E JUMP JUMPDEST PUSH2 0xAE5 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xE04 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xB3C DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xE3E JUMP JUMPDEST PUSH2 0x925 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF41 AND JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x4 PUSH2 0xF5B JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x7 PUSH2 0xF5B JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xC47 DUP8 PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCE7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCCF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD14 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xDF4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xE21 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xE60 JUMPI PUSH2 0xE5A DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1126 JUMP JUMPDEST POP PUSH2 0x925 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xE94 JUMPI PUSH2 0xE81 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xEC9 JUMPI PUSH2 0xEB6 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xF00 JUMPI PUSH2 0xEED DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x925 JUMPI PUSH2 0xF28 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x115F JUMP JUMPDEST PUSH2 0x925 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1069 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1051 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1096 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x112E PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x1157 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1292 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1167 PUSH2 0x1353 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x119F JUMPI PUSH2 0x119F DUP6 PUSH2 0x1197 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x12F0 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x11BE JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x124F PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x126B JUMPI PUSH2 0x126B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1287 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x129A PUSH2 0x1353 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x12B7 JUMPI PUSH2 0x12B7 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x12E4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1301 JUMPI POP DUP2 PUSH2 0x9C4 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1313 DUP4 DUP4 PUSH2 0xE04 JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH2 0xF41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x134E PUSH2 0x1353 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 EXTCODESIZE DUP8 0x2a LOG1 0xbe 0xe2 0xed PUSH32 0x455D9496046BBF1D3B5A31146D63BD709CAC6821608841A0029000000000000 ",
"sourceMap": "51:201:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1574:188:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1574:188:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1574:188:23;;;;;;;;;;890:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;890:332:23;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;890:332:23;;;;;;;;;;;;;;;;;;;;;;;;;;;429:457;;8:9:-1;5:2;;;30:1;27;20:12;5:2;429:457:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;429:457:23;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;429:457:23;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;429:457:23;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;429:457:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;429:457:23;;-1:-1:-1;;429:457:23;;;-1:-1:-1;;;429:457:23;;;;;;;268:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;268:157:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;268:157:23;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;268:157:23;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;268:157:23;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;268:157:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;268:157:23;;-1:-1:-1;;268:157:23;;;-1:-1:-1;268:157:23;;-1:-1:-1;;268:157:23;1226:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1226:207:23;;;;127:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:27:23;;;;;;;;;;;;;;;;;;;;1437:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1437:133:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1437:133:23;;;;;;;;;;1574:188;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;1694:36:23;;1723:6;;1711:10;;1694:36;;;;;-1:-1:-1;1736:12:23;:21;-1:-1:-1;1574:188:23:o;890:332::-;1132:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:7;;1132:29;;;;;;:85;;;;;1054:35;;1132:85;;;;;;;;1054:35;1132:29;:85;;;5:2:-1;;;;30:1;27;20:12;5:2;1132:85:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1132:85:23;;;;890:332;;;;;;:::o;429:457::-;544:28;;:::i;:::-;597:6;;575:63;;605:9;616:21;575;:63::i;:::-;544:94;;644:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;762:15;;;775:1;762:15;;;;;;;;;739:20;;762:15;;;;;;;;;;;;;;;;;;;;739:38;;793:9;783:4;788:1;783:7;;;;;;;;;;;;;;;;;:19;;;;808:32;;;;;;;;;;;;;;;;;;;835:4;808:3;:18;;:32;;;;;:::i;:::-;846:35;867:3;872:8;846:20;:35::i;:::-;;429:457;;;;;:::o;268:157::-;354:66;385:9;396:8;414:4;354:30;:66::i;:::-;268:157;;:::o;1226:207::-;1263:24;1309:23;:21;:23::i;:::-;1374:30;;;;;;1398:4;1374:30;;;;;;1263:70;;-1:-1:-1;1347:14:23;;;;;;1362:10;;1347:14;;1374:15;;:30;;;;;;;;;;;;;;1347:14;1374:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1374:30:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1374:30:23;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1374:30:23;1347:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1374:30;;1347:58;;;;;;;-1:-1:-1;1347:58:23;;;;5:2:-1;;;;30:1;27;20:12;5:2;1347:58:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1347:58:23;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1347:58:23;1339:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1226:207;:::o;127:27::-;;;;:::o;1437:133::-;1517:48;1545:7;1554:10;1517:27;:48::i;1735:295:1:-;1883:24;;:::i;:::-;1915:28;;:::i;:::-;1956:69;:3;1971:7;1980:16;1998:26;1956:69;:14;:69;:::i;:::-;1949:76;1735:295;-1:-1:-1;;;;;1735:295:1:o;1964:169:0:-;2066:8;;;;:27;;2088:4;2066:27;:21;:27;:::i;:::-;2099:8;;;;:29;;2121:6;2099:29;:21;:29;:::i;:::-;1964:169;;;:::o;3476:301::-;3592:8;;;;:27;;3614:4;3592:27;:21;:27;:::i;:::-;3625:21;:4;:8;;;:19;:21::i;:::-;3657:9;3652:93;3676:7;:14;3672:1;:18;3652:93;;;3705:33;3727:7;3735:1;3727:10;;;;;;;;;;;;;;;;;;;3705:8;;;;;:33;:21;:33;:::i;:::-;3692:3;;3652:93;;;;3750:22;:4;:8;;;:20;:22::i;2327:189:1:-;2487:6;;2432:7;;2456:55;;2487:6;;2496:4;2502:8;2456:22;:55::i;:::-;2449:62;;2327:189;;;;;:::o;5241:110::-;5341:4;;;;5241:110;:::o;5864:171::-;9090:1;9051:27;;;:15;:27;;;;;;5973:10;;9051:41;:27;:41;9043:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5993:27:1;;;;:15;:27;;;;;:37;;;;;;;;;;;;;;;5864:171::o;971:366:0:-;1120:24;;:::i;:::-;1152:50;1174:4;:8;;;335:3;1152:21;:50::i;:::-;-1:-1:-1;;1208:13:0;;;1227:39;;:20;;;:39;1272:43;;:23;;;:43;1208:13;971:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;3020:488:1:-;3216:12;;3193:36;;;3210:4;3193:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3193:36:1;;;;;;3183:47;;;;;;;;;3236:10;;;:25;;;;-1:-1:-1;3267:26:1;;;:15;:26;;;;;;:36;;;;3193;3267;;;;;3314:29;;3183:47;;3314:29;;;3357:4;;;;:20;3378:7;3387:8;3397:19;3411:4;3397:13;:19::i;:::-;3357:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;3357:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3357:60:1;3349:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3463:12;:17;;3479:1;3463:17;;;3020:488;;;;;:::o;941:395:33:-;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;;1282:27;1269:41;;1150:12;941:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;:::-;;709:724;;;:::o;4495:155:33:-;4572:13;;:::i;:::-;4600:45;4606:3;4611;:7;;;:14;4627:4;4633;:11;4600:5;:45::i;1439:155:34:-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;7512:527:1:-;7909:7;;7924:20;;;;;7952:23;;;;;7600:12;7983:10;;;;8021:8;;;;:12;7629:405;;7659:6;7629:405;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;7659:6;7629:405;;;;;;;;;;;;;;7600:12;;7659:29;;:6;;;;7909:7;;7924:20;;7952:23;;7983:10;7659:6;;8021:12;;7629:405;;;;;;;;;;7659:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7629:405:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7629:405:1;;;22:32:-1;26:21;;;22:32;6:49;;7629:405:1;;;49:4:-1;25:18;;61:17;;7629:405:1;182:15:-1;7629:405:1;;;;179:29:-1;;;;160:49;;;-1:-1;7629:405:1;;-1:-1:-1;;;;;;;;;;7512:527:1;;;:::o;5810:144:33:-;5884:13;;:::i;:::-;5912:37;5923:3;5928;:7;;;:14;5944:4;5912:10;:37::i;9502:154::-;9583:13;;:::i;:::-;9611:40;9620:3;9625;:7;;;:14;9641:4;9647:3;9611:8;:40::i;:::-;9604:47;9502:154;-1:-1:-1;;;;9502:154:33:o;2650:1140::-;2745:13;;:::i;:::-;2781:11;;2774:18;;;2766:27;;;;;;2816:3;:12;;;2810:3;2804;:9;:24;2800:90;;;2838:45;2845:3;2850:28;2854:3;:12;;;2874:3;2868;:9;2850:3;:28::i;:::-;2881:1;2850:32;2838:6;:45::i;:::-;2896:9;2911:8;3005:3;2999:10;3076:6;3070:13;3192:3;3187:2;3179:6;3175:15;3171:25;3163:33;;3276:6;3270:3;3265;3261:13;3258:25;3255:2;;;3318:3;3313;3309:13;3301:6;3294:29;3255:2;-1:-1:-1;;;3355:2:33;3345:13;;3416:129;3430:2;3423:9;;3416:129;;3485:10;;3472:24;;3434:9;;;;;3519:2;3511:10;;;;3529:9;3416:129;;;3654:10;3703:11;;3591:21;3599:2;:8;;;3591:3;:17;:21;3699:22;;;3666:9;;3650:26;;;;3741:21;3728:35;;-1:-1:-1;3782:3:33;2650:1140;;;;;;:::o;4944:619::-;5027:13;;:::i;:::-;5059:12;;;;5052:19;;5048:69;;5081:29;5088:3;5093;:12;;;5108:1;5093:16;5081:6;:29::i;:::-;5203:3;5197:10;5274:6;5268:13;5386:2;5380:3;5372:6;5368:16;5364:25;5410:4;5404;5396:19;5481:6;5476:3;5473:15;5470:2;;;5526:1;5518:6;5514:14;5506:6;5499:30;5470:2;-1:-1:-1;5555:3:33;;4944:619;-1:-1:-1;;;;;4944:619:33:o;8609:642::-;8698:13;;:::i;:::-;8735:3;:12;;;8729:3;8723;:9;:24;8719:73;;;8757:28;8764:3;8776;8770;:9;8783:1;8769:15;8757:6;:28::i;:::-;8798:9;8823:1;8817:3;8810;:10;:14;8798:26;;8910:3;8904:10;9025:3;9019;9011:6;9007:16;9003:26;9081:4;9073;9069:9;9062:4;9056:11;9052:27;9049:37;9043:4;9036:51;9169:6;9163:13;9157:3;9152;9148:13;9145:32;9142:2;;;9212:3;9207;9203:13;9195:6;9188:29;9142:2;-1:-1:-1;9243:3:33;;8609:642;-1:-1:-1;;;;;;8609:642:33:o;1888:114::-;1938:4;1958:1;1954;:5;1950:34;;;-1:-1:-1;1976:1:33;1969:8;;1950:34;-1:-1:-1;1996:1:33;1888:114;-1:-1:-1;1888:114:33:o;1731:153::-;1822:7;;1835:19;1822:3;1845:8;1835:4;:19::i;:::-;;1860;1867:3;1872:6;1860;:19::i;51:201:21:-;;;;;;;;;-1:-1:-1;51:201:21;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;51:201:21;;;;;:::o"
},
"methodIdentifiers": {
"addExternalRequest(address,bytes32)": "e8d5359d",
"cancelRequest(address,bytes32,uint256,bytes4,uint256)": "5591a608",
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"requestEthereumPrice(string,uint256)": "83db5cbc",
"requestEthereumPriceByCallback(string,uint256,address)": "74961d4d",
"withdrawLink()": "8dc654a2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callback\",\"type\":\"address\"}],\"name\":\"requestEthereumPriceByCallback\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"},{\"name\":\"_payment\",\"type\":\"uint256\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawLink\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_requestId\",\"type\":\"bytes32\"}],\"name\":\"addExternalRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_link\",\"type\":\"address\"},{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_specId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"RequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/BasicConsumer.sol\":\"BasicConsumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/BasicConsumer.sol\":{\"keccak256\":\"0x72beacc96ede73912744b51c9493d557b7c28b164a271466e8d7a65e372455dd\",\"urls\":[\"bzzr://2739aa008e6bf846cb785480ac2068e0234831013ef719f73da131dbfa0d6adf\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/Consumer.sol\":{\"keccak256\":\"0xd01430ff4d7618f2b59e5f8a6315d5ac5d81a4a5f7529d80840d94ba615abcc2\",\"urls\":[\"bzzr://b935e49145c2de48e923181af0c008af6059006db6119574e240e330324f843c\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/BasicConsumer.sol": {
"id": 21
},
"tests/Consumer.sol": {
"id": 23
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
}
},
"sourceCodes": {
"tests/BasicConsumer.sol": "pragma solidity ^0.5.0;\n\nimport \"./Consumer.sol\";\n\ncontract BasicConsumer is Consumer {\n\n constructor(address _link, address _oracle, bytes32 _specId) public {\n setChainlinkToken(_link);\n setChainlinkOracle(_oracle);\n specId = _specId;\n }\n\n}\n",
"tests/Consumer.sol": "pragma solidity ^0.5.0;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract Consumer is ChainlinkClient {\n bytes32 internal specId;\n bytes32 public currentPrice;\n\n event RequestFulfilled(\n bytes32 indexed requestId, // User-defined ID\n bytes32 indexed price\n );\n\n function requestEthereumPrice(string memory _currency, uint256 _payment) public {\n requestEthereumPriceByCallback(_currency, _payment, address(this));\n }\n\n function requestEthereumPriceByCallback(string memory _currency, uint256 _payment, address _callback) public {\n Chainlink.Request memory req = buildChainlinkRequest(specId, _callback, this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n string[] memory path = new string[](1);\n path[0] = _currency;\n req.addStringArray(\"path\", path);\n sendChainlinkRequest(req, _payment);\n }\n\n function cancelRequest(\n address _oracle,\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(_oracle);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function withdrawLink() public {\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transfer(msg.sender, _link.balanceOf(address(this))), \"Unable to transfer\");\n }\n\n function addExternalRequest(address _oracle, bytes32 _requestId) external {\n addChainlinkExternalRequest(_oracle, _requestId);\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n emit RequestFulfilled(_requestId, _price);\n currentPrice = _price;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x90cbcc1469bb913fe7b1d02c710ac51305fa00cb49bafb2ae82cd557ba00bcfa",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Buffer",
"compilerOutput": {
"abi": [],
"devdoc": {
"details": "A library for working with mutable byte buffers in Solidity. * Byte buffers are mutable and expandable, and provide a variety of primitives for writing to them. At any time you can fetch a bytes object containing the current contents of the buffer. The bytes object should not be stored between operations, as it may change due to resizing of the buffer.",
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820ec5cf529f60581da1e27ef00a5accb526207710f2312a77bffd23f7910fdc8660029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xec 0x5c CREATE2 0x29 0xf6 SDIV DUP2 0xda 0x1e 0x27 0xef STOP 0xa5 0xac 0xcb MSTORE PUSH3 0x7710F 0x23 SLT 0xa7 PUSH28 0xFFD23F7910FDC8660029000000000000000000000000000000000000 ",
"sourceMap": "402:9256:33:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820ec5cf529f60581da1e27ef00a5accb526207710f2312a77bffd23f7910fdc8660029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xec 0x5c CREATE2 0x29 0xf6 SDIV DUP2 0xda 0x1e 0x27 0xef STOP 0xa5 0xac 0xcb MSTORE PUSH3 0x7710F 0x23 SLT 0xa7 PUSH28 0xFFD23F7910FDC8660029000000000000000000000000000000000000 ",
"sourceMap": "402:9256:33:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"A library for working with mutable byte buffers in Solidity. * Byte buffers are mutable and expandable, and provide a variety of primitives for writing to them. At any time you can fetch a bytes object containing the current contents of the buffer. The bytes object should not be stored between operations, as it may change due to resizing of the buffer.\",\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":\"Buffer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}"
},
"sourceTreeHashHex": "0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "CBOR",
"compilerOutput": {
"abi": [],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820eb38703a2ae86044ffab40247791f29c1cf83313855aa3371439cbbbe506ec4c0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xeb CODESIZE PUSH17 0x3A2AE86044FFAB40247791F29C1CF83313 DUP6 GAS LOG3 CALLDATACOPY EQ CODECOPY 0xcb 0xbb 0xe5 MOD 0xec 0x4c STOP 0x29 ",
"sourceMap": "127:3333:34:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820eb38703a2ae86044ffab40247791f29c1cf83313855aa3371439cbbbe506ec4c0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xeb CODESIZE PUSH17 0x3A2AE86044FFAB40247791F29C1CF83313 DUP6 GAS LOG3 CALLDATACOPY EQ CODECOPY 0xcb 0xbb 0xe5 MOD 0xec 0x4c STOP 0x29 ",
"sourceMap": "127:3333:34:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":\"CBOR\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}"
},
"sourceTreeHashHex": "0xe27470be568cd4c8ccba293b1e25b605fee36badc568d715bda3ce60d7dc17bf",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Chainlink",
"compilerOutput": {
"abi": [],
"devdoc": {
"details": "Uses imported CBOR library for encoding to buffer",
"methods": {},
"title": "Library for common Chainlink functions"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x604c602c600b82828239805160001a60731460008114601c57601e565bfe5b5030600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820204c7c18be7d0d24d17b088dfffc496aee559a4960f4b52c0e40c694daebcece0029",
"opcodes": "PUSH1 0x4C PUSH1 0x2C PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x0 DUP2 EQ PUSH1 0x1C JUMPI PUSH1 0x1E JUMP JUMPDEST INVALID JUMPDEST POP ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 KECCAK256 0x4c PUSH29 0x18BE7D0D24D17B088DFFFC496AEE559A4960F4B52C0E40C694DAEBCECE STOP 0x29 ",
"sourceMap": "267:3512:0:-;;132:2:-1;166:7;155:9;146:7;137:37;252:7;246:14;243:1;238:23;232:4;229:33;270:1;265:20;;;;222:63;;265:20;274:9;222:63;;298:9;295:1;288:20;328:4;319:7;311:22;352:7;343;336:24"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x73000000000000000000000000000000000000000030146080604052600080fdfea165627a7a72305820204c7c18be7d0d24d17b088dfffc496aee559a4960f4b52c0e40c694daebcece0029",
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 KECCAK256 0x4c PUSH29 0x18BE7D0D24D17B088DFFFC496AEE559A4960F4B52C0E40C694DAEBCECE STOP 0x29 ",
"sourceMap": "267:3512:0:-;;;;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Uses imported CBOR library for encoding to buffer\",\"methods\":{},\"title\":\"Library for common Chainlink functions\"},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":\"Chainlink\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}"
},
"sourceTreeHashHex": "0x9a03bf8a0dc0b9ad2e0cd4b14b07730d44ab80564c4cb28decc0fdd60cd63500",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ChainlinkClient",
"compilerOutput": {
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {},
"title": "The ChainlinkClient contract"
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x60806040526001600455348015601457600080fd5b5060358060226000396000f3fe6080604052600080fdfea165627a7a72305820f0304eb6863389f3dc5d0c54f338e6231d9be9531203f3b1b1abeac1edd9509e0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH1 0x14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x35 DUP1 PUSH1 0x22 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 CREATE ADDRESS 0x4e 0xb6 DUP7 CALLER DUP10 RETURN 0xdc 0x5d 0xc SLOAD RETURN CODESIZE 0xe6 0x23 SAR SWAP12 0xe9 MSTORE8 SLT SUB RETURN 0xb1 0xb1 0xab 0xea 0xc1 0xed 0xd9 POP SWAP15 STOP 0x29 ",
"sourceMap": "474:8663:1:-;;;1131:1;1100:32;;474:8663;8:9:-1;5:2;;;30:1;27;20:12;5:2;474:8663:1;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600080fdfea165627a7a72305820f0304eb6863389f3dc5d0c54f338e6231d9be9531203f3b1b1abeac1edd9509e0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 CREATE ADDRESS 0x4e 0xb6 DUP7 CALLER DUP10 RETURN 0xdc 0x5d 0xc SLOAD RETURN CODESIZE 0xe6 0x23 SAR SWAP12 0xe9 MSTORE8 SLT SUB RETURN 0xb1 0xb1 0xab 0xea 0xc1 0xed 0xd9 POP SWAP15 STOP 0x29 ",
"sourceMap": "474:8663:1:-;;;;;"
},
"methodIdentifiers": {}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{},\"title\":\"The ChainlinkClient contract\"},\"userdoc\":{\"methods\":{},\"notice\":\"Contract writers can inherit this contract in order to create requests for the Chainlink network\"}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":\"ChainlinkClient\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]}},\"version\":1}",
"userdoc": {
"methods": {},
"notice": "Contract writers can inherit this contract in order to create requests for the Chainlink network"
}
},
"sources": {
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
}
},
"sourceCodes": {
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0xa495316bccd00b549b1843eead3eddaed28f38ab3506135d7fd8083ad3b7ffe6",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ChainlinkRequestInterface",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "sender",
"type": "address"
},
{
"name": "requestPrice",
"type": "uint256"
},
{
"name": "serviceAgreementID",
"type": "bytes32"
},
{
"name": "callbackAddress",
"type": "address"
},
{
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"name": "nonce",
"type": "uint256"
},
{
"name": "dataVersion",
"type": "uint256"
},
{
"name": "data",
"type": "bytes"
}
],
"name": "oracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "requestId",
"type": "bytes32"
},
{
"name": "payment",
"type": "uint256"
},
{
"name": "callbackFunctionId",
"type": "bytes4"
},
{
"name": "expiration",
"type": "uint256"
}
],
"name": "cancelOracleRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"cancelOracleRequest(bytes32,uint256,bytes4,uint256)": "6ee4d553",
"oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)": "40429946"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
}
},
"sourceCodes": {
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n"
},
"sourceTreeHashHex": "0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ChainlinkTestHelper",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [],
"name": "closeEvent",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "addUint",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "bytes"
}
],
"name": "addBytes",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_values",
"type": "bytes32[]"
}
],
"name": "addStringArray",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "int256"
}
],
"name": "addInt",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "data",
"type": "bytes"
}
],
"name": "setBuffer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_key",
"type": "string"
},
{
"name": "_value",
"type": "string"
}
],
"name": "add",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "payload",
"type": "bytes"
}
],
"name": "RequestData",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50611c84806100206000396000f3fe6080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303dc532681146100875780630e734a581461009e5780632255beb01461015357806347655b1b1461028d5780635e31692e146103c4578063cc39406f14610479578063ebdf86ca1461052c575b600080fd5b34801561009357600080fd5b5061009c610666565b005b3480156100aa57600080fd5b5061009c600480360360408110156100c157600080fd5b8101906020810181356401000000008111156100dc57600080fd5b8201836020820111156100ee57600080fd5b8035906020019184600183028401116401000000008311171561011057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610733915050565b34801561015f57600080fd5b5061009c6004803603604081101561017657600080fd5b81019060208101813564010000000081111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111640100000000831117156101c557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109ab945050505050565b34801561029957600080fd5b5061009c600480360360408110156102b057600080fd5b8101906020810181356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460018302840111640100000000831117156102ff57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561035257600080fd5b82018360208201111561036457600080fd5b8035906020019184602083028401116401000000008311171561038657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b2f945050505050565b3480156103d057600080fd5b5061009c600480360360408110156103e757600080fd5b81019060208101813564010000000081111561040257600080fd5b82018360208201111561041457600080fd5b8035906020019184600183028401116401000000008311171561043657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610e2f915050565b34801561048557600080fd5b5061009c6004803603602081101561049c57600080fd5b8101906020810181356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460018302840111640100000000831117156104eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fb3945050505050565b34801561053857600080fd5b5061009c6004803603604081101561054f57600080fd5b81019060208101813564010000000081111561056a57600080fd5b82018360208201111561057c57600080fd5b8035906020019184600183028401116401000000008311171561059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105f157600080fd5b82018360208201111561060357600080fd5b8035906020019184600183028401116401000000008311171561062557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611229945050505050565b6040805160208082526003805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116049183018290527f84485ae823e5c366e9581c146349e23f73b2f459d9eee1b9f15f36aac3b3145a939092918291820190849080156107235780601f106106f857610100808354040283529160200191610723565b820191906000526020600020905b81548152906001019060200180831161070657829003601f168201915b50509250505060405180910390a1565b61073b611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f8101849004909302820181018752958101828152949593946080870194919392849284919084018282801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff6113ad16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179290921691909117905560608301516002556080830151805180518594936003926109969284929190910190611ba5565b50602082015181600101555050905050505050565b6109b3611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff6113dc16565b60608151604051908082528060200260200182016040528015610b6657816020015b6060815260200190600190039081610b515790505b50905060005b8251811015610bb557610b958382815181101515610b8657fe5b90602001906020020151611406565b8282815181101515610ba357fe5b60209081029091010152600101610b6c565b50610bbe611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610d0f5780601f10610ce457610100808354040283529160200191610d0f565b820191906000526020600020905b815481529060010190602001808311610cf257829003601f168201915b5050509183525050600191909101546020909101529052509050610d3a81858463ffffffff61159b16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610e199284929190910190611ba5565b5060208201518160010155505090505050505050565b610e37611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610f885780601f10610f5d57610100808354040283529160200191610f88565b820191906000526020600020905b815481529060010190602001808311610f6b57829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff61160b16565b610fbb611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f8101849004909302820181018752958101828152949593946080870194919392849284919084018282801561110c5780601f106110e15761010080835404028352916020019161110c565b820191906000526020600020905b8154815290600101906020018083116110ef57829003601f168201915b5050509183525050600191909101546020909101529052509050611136818363ffffffff61163516565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179290921691909117905560608301516002556080830151805180518594936003926112159284929190910190611ba5565b506020820151816001015550509050505050565b611231611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f810184900490930282018101875295810182815294959394608087019491939284928491908401828280156113825780601f1061135757610100808354040283529160200191611382565b820191906000526020600020905b81548152906001019060200180831161136557829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff61165316565b60808301516113c2908363ffffffff61167d16565b60808301516113d7908263ffffffff61169a16565b505050565b60808301516113f1908363ffffffff61167d16565b60808301516113d7908263ffffffff6116aa16565b6040805160208082528183019092526060918291906020820181803883390190505090506000805b60208110156114b7576008810260020a85027fff000000000000000000000000000000000000000000000000000000000000008116156114ae5780848481518110151561147757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b5060010161142e565b506060816040519080825280601f01601f1916602001820160405280156114e5576020820181803883390190505b50905060005b8281101561159257838181518110151561150157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002828281518110151561155a57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016114eb565b50949350505050565b60808301516115b0908363ffffffff61167d16565b6115bd83608001516116b7565b60005b81518110156115fd576115f582828151811015156115da57fe5b6020908102909101015160808601519063ffffffff61167d16565b6001016115c0565b506113d783608001516116c5565b6080830151611620908363ffffffff61167d16565b60808301516113d7908263ffffffff6116d016565b61164482608001518251611763565b506113d78260800151826117a3565b6080830151611668908363ffffffff61167d16565b60808301516113d7908263ffffffff61167d16565b61168a82600383516117c4565b6113d7828263ffffffff6117a316565b6116a6826000836117c4565b5050565b61168a82600283516117c4565b6116c28160046118c7565b50565b6116c28160076118c7565b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008112156117075761170282826118e0565b6116a6565b67ffffffffffffffff81131561172157611702828261193d565b6000811261173557611702826000836117c4565b6116a6826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036117c4565b61176b611c23565b60208206156117805760208206602003820191505b506020808301829052604080518085526000815283019091019052815b92915050565b6117ab611c23565b6117bd83846000015151848551611978565b9392505050565b601781116117e6576117e08360ff848116602002168317611a60565b506113d7565b60ff811161181a57611807836018602060ff8616021763ffffffff611a6016565b506117e08382600163ffffffff611a7816565b61ffff811161184f5761183c836019602060ff8616021763ffffffff611a6016565b506117e08382600263ffffffff611a7816565b63ffffffff81116118865761187383601a602060ff8616021763ffffffff611a6016565b506117e08382600463ffffffff611a7816565b67ffffffffffffffff81116113d7576118ae83601b602060ff8616021763ffffffff611a6016565b506118c18382600863ffffffff611a7816565b50505050565b6113d782601f602060ff8516021763ffffffff611a6016565b6118f18260c363ffffffff611a6016565b506116a682827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03604051602001808281526020019150506040516020818303038152906040526116aa565b61194e8260c263ffffffff611a6016565b506116a68282604051602001808281526020019150506040516020818303038152906040526116aa565b611980611c23565b825182111561198e57600080fd5b846020015182850111156119b8576119b8856119b08760200151878601611a99565b600202611ab0565b6000808651805187602083010193508088870111156119d75787860182525b505050602084015b60208410611a1c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016119df565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b611a68611c23565b6117bd8384600001515184611ac7565b611a80611c23565b611a91848560000151518585611b12565b949350505050565b600081831115611aaa57508161179d565b50919050565b8151611abc8383611763565b506118c183826117a3565b611acf611c23565b60208401518310611aeb57611aeb848560200151600202611ab0565b8351805160208583010184815381861415611b07576001820183525b509495945050505050565b611b1a611c23565b84602001518483011115611b3757611b3785858401600202611ab0565b60006001836101000a0390508551838682010185831982511617815281518588011115611b645784870182525b50959695505050505050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ba0611c23565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611be657805160ff1916838001178555611c13565b82800160010185558215611c13579182015b82811115611c13578251825591602001919060010190611bf8565b50611c1f929150611c3b565b5090565b60408051808201909152606081526000602082015290565b611c5591905b80821115611c1f5760008155600101611c41565b9056fea165627a7a723058204f7f58f8fd01f0be002dfdf63d1d35661026c557ce09311f20587ab3408308310029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C84 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3DC5326 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0xE734A58 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x2255BEB0 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x47655B1B EQ PUSH2 0x28D JUMPI DUP1 PUSH4 0x5E31692E EQ PUSH2 0x3C4 JUMPI DUP1 PUSH4 0xCC39406F EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0xEBDF86CA EQ PUSH2 0x52C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x666 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x733 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x24C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x9AB SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x364 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xB2F SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x402 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x414 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x436 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xE2F SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xFB3 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x538 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x603 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x625 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE PUSH32 0x84485AE823E5C366E9581C146349E23F73B2F459D9EEE1B9F15F36AAC3B3145A SWAP4 SWAP1 SWAP3 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x723 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6F8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x723 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 0x706 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x73B PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x88C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x861 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x88C 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 0x86F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13AD AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x996 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x9B3 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB04 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAD9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB04 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 0xAE7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13DC AND JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xB66 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xB51 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0xBB5 JUMPI PUSH2 0xB95 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB86 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1406 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xB6C JUMP JUMPDEST POP PUSH2 0xBBE PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xD0F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCE4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD0F 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 0xCF2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xD3A DUP2 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x159B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xE19 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE37 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xF88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xF5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xF88 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 0xF6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x160B AND JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x110C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x10E1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x110C 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 0x10EF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x1136 DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1635 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x1215 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1231 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1382 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1357 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1382 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 0x1365 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1653 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13C2 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x169A AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13F1 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x16AA AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x8 DUP2 MUL PUSH1 0x2 EXP DUP6 MUL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 AND ISZERO PUSH2 0x14AE JUMPI DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1477 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x142E JUMP JUMPDEST POP PUSH1 0x60 DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1592 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1501 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x155A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 ADD PUSH2 0x14EB JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x15B0 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH2 0x15BD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x16B7 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x15FD JUMPI PUSH2 0x15F5 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15DA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x15C0 JUMP JUMPDEST POP PUSH2 0x13D7 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x16C5 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1620 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x16D0 AND JUMP JUMPDEST PUSH2 0x1644 DUP3 PUSH1 0x80 ADD MLOAD DUP3 MLOAD PUSH2 0x1763 JUMP JUMPDEST POP PUSH2 0x13D7 DUP3 PUSH1 0x80 ADD MLOAD DUP3 PUSH2 0x17A3 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1668 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH2 0x168A DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x13D7 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x17A3 AND JUMP JUMPDEST PUSH2 0x16A6 DUP3 PUSH1 0x0 DUP4 PUSH2 0x17C4 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x168A DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x16C2 DUP2 PUSH1 0x4 PUSH2 0x18C7 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x16C2 DUP2 PUSH1 0x7 PUSH2 0x18C7 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x1707 JUMPI PUSH2 0x1702 DUP3 DUP3 PUSH2 0x18E0 JUMP JUMPDEST PUSH2 0x16A6 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x1721 JUMPI PUSH2 0x1702 DUP3 DUP3 PUSH2 0x193D JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x1735 JUMPI PUSH2 0x1702 DUP3 PUSH1 0x0 DUP4 PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x16A6 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x176B PUSH2 0x1C23 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1780 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE DUP4 ADD SWAP1 SWAP2 ADD SWAP1 MSTORE DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17AB PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x17BD DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1978 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x17E6 JUMPI PUSH2 0x17E0 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A60 JUMP JUMPDEST POP PUSH2 0x13D7 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x181A JUMPI PUSH2 0x1807 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x184F JUMPI PUSH2 0x183C DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x1886 JUMPI PUSH2 0x1873 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13D7 JUMPI PUSH2 0x18AE DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x18C1 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x13D7 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST PUSH2 0x18F1 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x16A6 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x194E DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x16A6 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x1980 PUSH2 0x1C23 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x19B8 JUMPI PUSH2 0x19B8 DUP6 PUSH2 0x19B0 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x1A99 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x19D7 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1A1C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x19DF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1A68 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x17BD DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1AC7 JUMP JUMPDEST PUSH2 0x1A80 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x1A91 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1B12 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1AAA JUMPI POP DUP2 PUSH2 0x179D JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1ABC DUP4 DUP4 PUSH2 0x1763 JUMP JUMPDEST POP PUSH2 0x18C1 DUP4 DUP3 PUSH2 0x17A3 JUMP JUMPDEST PUSH2 0x1ACF PUSH2 0x1C23 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1AEB JUMPI PUSH2 0x1AEB DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1B07 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1B1A PUSH2 0x1C23 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1B64 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1BA0 PUSH2 0x1C23 JUMP JUMPDEST SWAP1 MSTORE SWAP1 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 PUSH2 0x1BE6 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1C13 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1C13 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1C13 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1BF8 JUMP JUMPDEST POP PUSH2 0x1C1F SWAP3 SWAP2 POP PUSH2 0x1C3B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x1C55 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1C1F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1C41 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x4f PUSH32 0x58F8FD01F0BE002DFDF63D1D35661026C557CE09311F20587AB3408308310029 ",
"sourceMap": "53:2017:22:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53:2017:22;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100825763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303dc532681146100875780630e734a581461009e5780632255beb01461015357806347655b1b1461028d5780635e31692e146103c4578063cc39406f14610479578063ebdf86ca1461052c575b600080fd5b34801561009357600080fd5b5061009c610666565b005b3480156100aa57600080fd5b5061009c600480360360408110156100c157600080fd5b8101906020810181356401000000008111156100dc57600080fd5b8201836020820111156100ee57600080fd5b8035906020019184600183028401116401000000008311171561011057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610733915050565b34801561015f57600080fd5b5061009c6004803603604081101561017657600080fd5b81019060208101813564010000000081111561019157600080fd5b8201836020820111156101a357600080fd5b803590602001918460018302840111640100000000831117156101c557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506109ab945050505050565b34801561029957600080fd5b5061009c600480360360408110156102b057600080fd5b8101906020810181356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460018302840111640100000000831117156102ff57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929594936020810193503591505064010000000081111561035257600080fd5b82018360208201111561036457600080fd5b8035906020019184602083028401116401000000008311171561038657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610b2f945050505050565b3480156103d057600080fd5b5061009c600480360360408110156103e757600080fd5b81019060208101813564010000000081111561040257600080fd5b82018360208201111561041457600080fd5b8035906020019184600183028401116401000000008311171561043657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610e2f915050565b34801561048557600080fd5b5061009c6004803603602081101561049c57600080fd5b8101906020810181356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460018302840111640100000000831117156104eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fb3945050505050565b34801561053857600080fd5b5061009c6004803603604081101561054f57600080fd5b81019060208101813564010000000081111561056a57600080fd5b82018360208201111561057c57600080fd5b8035906020019184600183028401116401000000008311171561059e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105f157600080fd5b82018360208201111561060357600080fd5b8035906020019184600183028401116401000000008311171561062557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611229945050505050565b6040805160208082526003805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116049183018290527f84485ae823e5c366e9581c146349e23f73b2f459d9eee1b9f15f36aac3b3145a939092918291820190849080156107235780601f106106f857610100808354040283529160200191610723565b820191906000526020600020905b81548152906001019060200180831161070657829003601f168201915b50509250505060405180910390a1565b61073b611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f8101849004909302820181018752958101828152949593946080870194919392849284919084018282801561088c5780601f106108615761010080835404028352916020019161088c565b820191906000526020600020905b81548152906001019060200180831161086f57829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff6113ad16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179290921691909117905560608301516002556080830151805180518594936003926109969284929190910190611ba5565b50602082015181600101555050905050505050565b6109b3611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff6113dc16565b60608151604051908082528060200260200182016040528015610b6657816020015b6060815260200190600190039081610b515790505b50905060005b8251811015610bb557610b958382815181101515610b8657fe5b90602001906020020151611406565b8282815181101515610ba357fe5b60209081029091010152600101610b6c565b50610bbe611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610d0f5780601f10610ce457610100808354040283529160200191610d0f565b820191906000526020600020905b815481529060010190602001808311610cf257829003601f168201915b5050509183525050600191909101546020909101529052509050610d3a81858463ffffffff61159b16565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff000000000000000000000000000000000000000090921691909117929092169190911790556060830151600255608083015180518051859493600392610e199284929190910190611ba5565b5060208201518160010155505090505050505050565b610e37611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f81018490049093028201810187529581018281529495939460808701949193928492849190840182828015610f885780601f10610f5d57610100808354040283529160200191610f88565b820191906000526020600020905b815481529060010190602001808311610f6b57829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff61160b16565b610fbb611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f8101849004909302820181018752958101828152949593946080870194919392849284919084018282801561110c5780601f106110e15761010080835404028352916020019161110c565b820191906000526020600020905b8154815290600101906020018083116110ef57829003601f168201915b5050509183525050600191909101546020909101529052509050611136818363ffffffff61163516565b805160009081556020808301516001805460408601517c0100000000000000000000000000000000000000000000000000000000900474010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179290921691909117905560608301516002556080830151805180518594936003926112159284929190910190611ba5565b506020820151816001015550509050505050565b611231611b70565b6040805160a0810182526000805482526001805473ffffffffffffffffffffffffffffffffffffffff8116602080860191909152740100000000000000000000000000000000000000009091047c0100000000000000000000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000016848601526002805460608087019190915286516003805461010096811615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190951692909204601f810184900490930282018101875295810182815294959394608087019491939284928491908401828280156113825780601f1061135757610100808354040283529160200191611382565b820191906000526020600020905b81548152906001019060200180831161136557829003601f168201915b50505091835250506001919091015460209091015290525090506108b781848463ffffffff61165316565b60808301516113c2908363ffffffff61167d16565b60808301516113d7908263ffffffff61169a16565b505050565b60808301516113f1908363ffffffff61167d16565b60808301516113d7908263ffffffff6116aa16565b6040805160208082528183019092526060918291906020820181803883390190505090506000805b60208110156114b7576008810260020a85027fff000000000000000000000000000000000000000000000000000000000000008116156114ae5780848481518110151561147757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b5060010161142e565b506060816040519080825280601f01601f1916602001820160405280156114e5576020820181803883390190505b50905060005b8281101561159257838181518110151561150157fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002828281518110151561155a57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016114eb565b50949350505050565b60808301516115b0908363ffffffff61167d16565b6115bd83608001516116b7565b60005b81518110156115fd576115f582828151811015156115da57fe5b6020908102909101015160808601519063ffffffff61167d16565b6001016115c0565b506113d783608001516116c5565b6080830151611620908363ffffffff61167d16565b60808301516113d7908263ffffffff6116d016565b61164482608001518251611763565b506113d78260800151826117a3565b6080830151611668908363ffffffff61167d16565b60808301516113d7908263ffffffff61167d16565b61168a82600383516117c4565b6113d7828263ffffffff6117a316565b6116a6826000836117c4565b5050565b61168a82600283516117c4565b6116c28160046118c7565b50565b6116c28160076118c7565b7fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008112156117075761170282826118e0565b6116a6565b67ffffffffffffffff81131561172157611702828261193d565b6000811261173557611702826000836117c4565b6116a6826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036117c4565b61176b611c23565b60208206156117805760208206602003820191505b506020808301829052604080518085526000815283019091019052815b92915050565b6117ab611c23565b6117bd83846000015151848551611978565b9392505050565b601781116117e6576117e08360ff848116602002168317611a60565b506113d7565b60ff811161181a57611807836018602060ff8616021763ffffffff611a6016565b506117e08382600163ffffffff611a7816565b61ffff811161184f5761183c836019602060ff8616021763ffffffff611a6016565b506117e08382600263ffffffff611a7816565b63ffffffff81116118865761187383601a602060ff8616021763ffffffff611a6016565b506117e08382600463ffffffff611a7816565b67ffffffffffffffff81116113d7576118ae83601b602060ff8616021763ffffffff611a6016565b506118c18382600863ffffffff611a7816565b50505050565b6113d782601f602060ff8516021763ffffffff611a6016565b6118f18260c363ffffffff611a6016565b506116a682827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03604051602001808281526020019150506040516020818303038152906040526116aa565b61194e8260c263ffffffff611a6016565b506116a68282604051602001808281526020019150506040516020818303038152906040526116aa565b611980611c23565b825182111561198e57600080fd5b846020015182850111156119b8576119b8856119b08760200151878601611a99565b600202611ab0565b6000808651805187602083010193508088870111156119d75787860182525b505050602084015b60208410611a1c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016119df565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b611a68611c23565b6117bd8384600001515184611ac7565b611a80611c23565b611a91848560000151518585611b12565b949350505050565b600081831115611aaa57508161179d565b50919050565b8151611abc8383611763565b506118c183826117a3565b611acf611c23565b60208401518310611aeb57611aeb848560200151600202611ab0565b8351805160208583010184815381861415611b07576001820183525b509495945050505050565b611b1a611c23565b84602001518483011115611b3757611b3785858401600202611ab0565b60006001836101000a0390508551838682010185831982511617815281518588011115611b645784870182525b50959695505050505050565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ba0611c23565b905290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611be657805160ff1916838001178555611c13565b82800160010185558215611c13579182015b82811115611c13578251825591602001919060010190611bf8565b50611c1f929150611c3b565b5090565b60408051808201909152606081526000602082015290565b611c5591905b80821115611c1f5760008155600101611c41565b9056fea165627a7a723058204f7f58f8fd01f0be002dfdf63d1d35661026c557ce09311f20587ab3408308310029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3DC5326 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0xE734A58 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x2255BEB0 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x47655B1B EQ PUSH2 0x28D JUMPI DUP1 PUSH4 0x5E31692E EQ PUSH2 0x3C4 JUMPI DUP1 PUSH4 0xCC39406F EQ PUSH2 0x479 JUMPI DUP1 PUSH4 0xEBDF86CA EQ PUSH2 0x52C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x666 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xEE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x110 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x733 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x176 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x191 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x218 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x24C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x9AB SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x299 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x2FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x352 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x364 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x386 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xB2F SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x402 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x414 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x436 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0xE2F SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x485 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0xFB3 SWAP5 POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x538 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x56A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x57C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x59E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 SWAP5 SWAP4 PUSH1 0x20 DUP2 ADD SWAP4 POP CALLDATALOAD SWAP2 POP POP PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x603 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x625 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x1229 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE PUSH32 0x84485AE823E5C366E9581C146349E23F73B2F459D9EEE1B9F15F36AAC3B3145A SWAP4 SWAP1 SWAP3 SWAP2 DUP3 SWAP2 DUP3 ADD SWAP1 DUP5 SWAP1 DUP1 ISZERO PUSH2 0x723 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x6F8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x723 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 0x706 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH2 0x73B PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x88C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x861 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x88C 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 0x86F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13AD AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x996 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x9B3 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB04 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAD9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB04 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 0xAE7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x13DC AND JUMP JUMPDEST PUSH1 0x60 DUP2 MLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xB66 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xB51 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 MLOAD DUP2 LT ISZERO PUSH2 0xBB5 JUMPI PUSH2 0xB95 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB86 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1406 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xB6C JUMP JUMPDEST POP PUSH2 0xBBE PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xD0F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCE4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD0F 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 0xCF2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0xD3A DUP2 DUP6 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x159B AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0xE19 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0xE37 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xF88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xF5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xF88 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 0xF6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x160B AND JUMP JUMPDEST PUSH2 0xFBB PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x110C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x10E1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x110C 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 0x10EF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x1136 DUP2 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1635 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 DUP2 SSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP7 ADD MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH21 0x10000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x2 SSTORE PUSH1 0x80 DUP4 ADD MLOAD DUP1 MLOAD DUP1 MLOAD DUP6 SWAP5 SWAP4 PUSH1 0x3 SWAP3 PUSH2 0x1215 SWAP3 DUP5 SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1BA5 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE POP POP SWAP1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1231 PUSH2 0x1B70 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xA0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 SLOAD DUP3 MSTORE PUSH1 0x1 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x20 DUP1 DUP7 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH21 0x10000000000000000000000000000000000000000 SWAP1 SWAP2 DIV PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND DUP5 DUP7 ADD MSTORE PUSH1 0x2 DUP1 SLOAD PUSH1 0x60 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP7 MLOAD PUSH1 0x3 DUP1 SLOAD PUSH2 0x100 SWAP7 DUP2 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV SWAP1 SWAP4 MUL DUP3 ADD DUP2 ADD DUP8 MSTORE SWAP6 DUP2 ADD DUP3 DUP2 MSTORE SWAP5 SWAP6 SWAP4 SWAP5 PUSH1 0x80 DUP8 ADD SWAP5 SWAP2 SWAP4 SWAP3 DUP5 SWAP3 DUP5 SWAP2 SWAP1 DUP5 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1382 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1357 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1382 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 0x1365 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SLOAD PUSH1 0x20 SWAP1 SWAP2 ADD MSTORE SWAP1 MSTORE POP SWAP1 POP PUSH2 0x8B7 DUP2 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1653 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13C2 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x169A AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13F1 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x16AA AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 SWAP1 PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP POP SWAP1 POP PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x14B7 JUMPI PUSH1 0x8 DUP2 MUL PUSH1 0x2 EXP DUP6 MUL PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 AND ISZERO PUSH2 0x14AE JUMPI DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1477 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x142E JUMP JUMPDEST POP PUSH1 0x60 DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x1F ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14E5 JUMPI PUSH1 0x20 DUP3 ADD DUP2 DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x1592 JUMPI DUP4 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1501 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x155A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD SWAP1 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH1 0x0 BYTE SWAP1 MSTORE8 POP PUSH1 0x1 ADD PUSH2 0x14EB JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x15B0 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH2 0x15BD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x16B7 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x15FD JUMPI PUSH2 0x15F5 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15DA JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x15C0 JUMP JUMPDEST POP PUSH2 0x13D7 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x16C5 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1620 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x16D0 AND JUMP JUMPDEST PUSH2 0x1644 DUP3 PUSH1 0x80 ADD MLOAD DUP3 MLOAD PUSH2 0x1763 JUMP JUMPDEST POP PUSH2 0x13D7 DUP3 PUSH1 0x80 ADD MLOAD DUP3 PUSH2 0x17A3 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1668 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x13D7 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x167D AND JUMP JUMPDEST PUSH2 0x168A DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x13D7 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x17A3 AND JUMP JUMPDEST PUSH2 0x16A6 DUP3 PUSH1 0x0 DUP4 PUSH2 0x17C4 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x168A DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x16C2 DUP2 PUSH1 0x4 PUSH2 0x18C7 JUMP JUMPDEST POP JUMP JUMPDEST PUSH2 0x16C2 DUP2 PUSH1 0x7 PUSH2 0x18C7 JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x1707 JUMPI PUSH2 0x1702 DUP3 DUP3 PUSH2 0x18E0 JUMP JUMPDEST PUSH2 0x16A6 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x1721 JUMPI PUSH2 0x1702 DUP3 DUP3 PUSH2 0x193D JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x1735 JUMPI PUSH2 0x1702 DUP3 PUSH1 0x0 DUP4 PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x16A6 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x17C4 JUMP JUMPDEST PUSH2 0x176B PUSH2 0x1C23 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x1780 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE DUP4 ADD SWAP1 SWAP2 ADD SWAP1 MSTORE DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17AB PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x17BD DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1978 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x17E6 JUMPI PUSH2 0x17E0 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A60 JUMP JUMPDEST POP PUSH2 0x13D7 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x181A JUMPI PUSH2 0x1807 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x184F JUMPI PUSH2 0x183C DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x1886 JUMPI PUSH2 0x1873 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x17E0 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13D7 JUMPI PUSH2 0x18AE DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x18C1 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A78 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x13D7 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST PUSH2 0x18F1 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x16A6 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x194E DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A60 AND JUMP JUMPDEST POP PUSH2 0x16A6 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x16AA JUMP JUMPDEST PUSH2 0x1980 PUSH2 0x1C23 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x198E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x19B8 JUMPI PUSH2 0x19B8 DUP6 PUSH2 0x19B0 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x1A99 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x19D7 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1A1C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x19DF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1A68 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x17BD DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1AC7 JUMP JUMPDEST PUSH2 0x1A80 PUSH2 0x1C23 JUMP JUMPDEST PUSH2 0x1A91 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1B12 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1AAA JUMPI POP DUP2 PUSH2 0x179D JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1ABC DUP4 DUP4 PUSH2 0x1763 JUMP JUMPDEST POP PUSH2 0x18C1 DUP4 DUP3 PUSH2 0x17A3 JUMP JUMPDEST PUSH2 0x1ACF PUSH2 0x1C23 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1AEB JUMPI PUSH2 0x1AEB DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1B07 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1B1A PUSH2 0x1C23 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1AB0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1B64 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1BA0 PUSH2 0x1C23 JUMP JUMPDEST SWAP1 MSTORE SWAP1 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 PUSH2 0x1BE6 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1C13 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1C13 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1C13 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1BF8 JUMP JUMPDEST POP PUSH2 0x1C1F SWAP3 SWAP2 POP PUSH2 0x1C3B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x1C55 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1C1F JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1C41 JUMP JUMPDEST SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0x4f PUSH32 0x58F8FD01F0BE002DFDF63D1D35661026C557CE09311F20587AB3408308310029 ",
"sourceMap": "53:2017:22:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;251:69;;8:9:-1;5:2;;;30:1;27;20:12;5:2;251:69:22;;;;;;913:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;913:148:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;913:148:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;913:148:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;913:148:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;913:148:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;913:148:22;;-1:-1:-1;;913:148:22;;;-1:-1:-1;913:148:22;;-1:-1:-1;;913:148:22;605:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;605:155:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;605:155:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;605:155:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;605:155:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;605:155:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;605:155:22;;;;;;;;-1:-1:-1;605:155:22;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;605:155:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;605:155:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;605:155:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;605:155:22;;-1:-1:-1;605:155:22;;-1:-1:-1;;;;;605:155:22;1194:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1194:338:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1194:338:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;1194:338:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1194:338:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1194:338:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1194:338:22;;;;;;;;-1:-1:-1;1194:338:22;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;1194:338:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1194:338:22;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;1194:338:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;1194:338:22;;-1:-1:-1;1194:338:22;;-1:-1:-1;;;;;1194:338:22;764:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;764:145:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;764:145:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;764:145:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;764:145:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;764:145:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;764:145:22;;-1:-1:-1;;764:145:22;;;-1:-1:-1;764:145:22;;-1:-1:-1;;764:145:22;324:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;324:127:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;324:127:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;324:127:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;324:127:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;324:127:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;324:127:22;;-1:-1:-1;324:127:22;;-1:-1:-1;;;;;324:127:22;455:146;;8:9:-1;5:2;;;30:1;27;20:12;5:2;455:146:22;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;455:146:22;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;455:146:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;455:146:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;455:146:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;455:146:22;;;;;;;;-1:-1:-1;455:146:22;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;455:146:22;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;455:146:22;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;455:146:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;455:146:22;;-1:-1:-1;455:146:22;;-1:-1:-1;;;;;455:146:22;251:69;291:24;;;;;;;303:7;291:24;;;;;;;;;;;;;;;;;;;;;;;303:7;;291:24;;;;;;303:7;;291:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;251:69::o;913:148::-;979:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;979:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;979:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;979:33:22;;;-1:-1:-1;;979:33:22;;;;;;;;;;;;;-1:-1:-1;979:33:22;-1:-1:-1;1018:24:22;979:33;1029:4;1035:6;1018:24;:10;:24;:::i;:::-;1048:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1054:2;;1048:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;913:148;;;:::o;605:155::-;677:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;677:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;677:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;677:33:22;;;-1:-1:-1;;677:33:22;;;;;;;;;;;;;-1:-1:-1;677:33:22;-1:-1:-1;716:25:22;677:33;728:4;734:6;716:25;:11;:25;:::i;1194:338::-;1277:23;1316:7;:14;1303:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1277:54:22;-1:-1:-1;1342:9:22;1337:100;1361:7;:14;1357:1;:18;1337:100;;;1403:27;1419:7;1427:1;1419:10;;;;;;;;;;;;;;;;;;1403:15;:27::i;:::-;1390:7;1398:1;1390:10;;;;;;;;;;;;;;;;;;:40;1377:3;;1337:100;;;;1442:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;1442:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1442:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1442:33:22;;;-1:-1:-1;;1442:33:22;;;;;;;;;;;;;-1:-1:-1;1442:33:22;-1:-1:-1;1481:32:22;1442:33;1499:4;1505:7;1481:32;:17;:32;:::i;:::-;1519:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1525:2;;1519:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;1194:338;;;;:::o;764:145::-;828:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;828:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;828:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;828:33:22;;;-1:-1:-1;;828:33:22;;;;;;;;;;;;;-1:-1:-1;828:33:22;-1:-1:-1;867:23:22;828:33;877:4;883:6;867:23;:9;:23;:::i;324:127::-;375:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;375:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;375:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;375:33:22;;;-1:-1:-1;;375:33:22;;;;;;;;;;;;;-1:-1:-1;375:33:22;-1:-1:-1;414:18:22;375:33;427:4;414:18;:12;:18;:::i;:::-;438:8;;:3;:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;444:2;;438:3;:8;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;324:127;;:::o;455:146::-;523:27;;:::i;:::-;:33;;;;;;;;-1:-1:-1;523:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;523:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;523:33:22;;;-1:-1:-1;;523:33:22;;;;;;;;;;;;;-1:-1:-1;523:33:22;-1:-1:-1;562:20:22;523:33;569:4;575:6;562:20;:6;:20;:::i;3088:165:0:-;3188:8;;;;:27;;3210:4;3188:27;:21;:27;:::i;:::-;3221:8;;;;:27;;3241:6;3221:27;:19;:27;:::i;:::-;3088:165;;;:::o;2338:172::-;2444:8;;;;:27;;2466:4;2444:27;:21;:27;:::i;:::-;2477:8;;;;:28;;2498:6;2477:28;:20;:28;:::i;1536:532:22:-;1642:13;;;1652:2;1642:13;;;;;;;;;1594;;;;1642;;;;21:6:-1;;104:10;1642:13:22;87:34:-1;135:17;;-1:-1;;1615:40:22;-1:-1:-1;1661:14:22;;1685:185;1706:2;1702:1;:6;1685:185;;;1764:1;:5;;1758:1;:12;1748:22;;1784:9;;;;1780:84;;1830:4;1805:11;1817:9;1805:22;;;;;;;;;;;;;;:29;;;;;;;;;;-1:-1:-1;1844:11:22;;;;;1780:84;-1:-1:-1;1710:3:22;;1685:185;;;;1875:31;1919:9;1909:20;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;1909:20:22;87:34:-1;135:17;;-1:-1;1909:20:22;-1:-1:-1;1875:54:22;-1:-1:-1;1940:6:22;1935:90;1956:9;1952:1;:13;1935:90;;;2004:11;2016:1;2004:14;;;;;;;;;;;;;;;;;;;;1980:18;1999:1;1980:21;;;;;;;;;;;;;;:38;;;;;;;;;;-1:-1:-1;1967:3:22;;1935:90;;;-1:-1:-1;2044:18:22;1536:532;-1:-1:-1;;;;1536:532:22:o;3476:301:0:-;3592:8;;;;:27;;3614:4;3592:27;:21;:27;:::i;:::-;3625:21;:4;:8;;;:19;:21::i;:::-;3657:9;3652:93;3676:7;:14;3672:1;:18;3652:93;;;3705:33;3727:7;3735:1;3727:10;;;;;;;;;;;;;;;;;;;3705:8;;;;;:33;:21;:33;:::i;:::-;3692:3;;3652:93;;;;3750:22;:4;:8;;;:20;:22::i;2717:162::-;2815:8;;;;:27;;2837:4;2815:27;:21;:27;:::i;:::-;2848:8;;;;:26;;2867:6;2848:26;:18;:26;:::i;1575:182::-;1661:45;1683:4;:8;;;1693:5;:12;1661:21;:45::i;:::-;;1712:40;1736:4;:8;;;1746:5;1712:23;:40::i;1964:169::-;2066:8;;;;:27;;2088:4;2066:27;:21;:27;:::i;:::-;2099:8;;;;:29;;2121:6;2099:29;:21;:29;:::i;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;1600:136::-;1691:38;1702:3;241:1;1723:5;1691:10;:38::i;:::-;1600:136;;:::o;2196:181::-;2296:47;2307:3;346:1;2330:5;:12;2296:10;:47::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;:::-;3037:135;:::o;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;1742:448::-;1842:20;1834:5;:28;1831:353;;;1878:30;1897:3;1902:5;1878:18;:30::i;:::-;1831:353;;;1936:18;1928:5;:26;1925:259;;;1970:24;1983:3;1988:5;1970:12;:24::i;1925:259::-;2023:1;2014:10;;2011:173;;2040:44;2051:3;241:1;2077:5;2040:10;:44::i;2011:173::-;2115:58;2126:3;297:1;2166:5;2161:2;:10;2115;:58::i;941:395:33:-;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;1282:27;;;1269:41;;1150:3;941:395;;;;;:::o;4495:155::-;4572:13;;:::i;:::-;4600:45;4606:3;4611;:7;;;:14;4627:4;4633;:11;4600:5;:45::i;:::-;4593:52;4495:155;-1:-1:-1;;;4495:155:33:o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;:::-;;709:724;;;:::o;1439:155::-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;2598:229::-;2694:72;:3;2716:48;2694:72;:15;:72;:::i;:::-;;2774:46;2786:3;2812:5;2807:2;:10;2791:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2791:28:34;;;2774:11;:46::i;2383:209::-;2473:63;:3;2495:39;2473:63;:15;:63;:::i;:::-;;2544:41;2556:3;2577:5;2561:23;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2561:23:34;;;2544:11;:41::i;2650:1140:33:-;2745:13;;:::i;:::-;2781:11;;2774:18;;;2766:27;;;;;;2816:3;:12;;;2810:3;2804;:9;:24;2800:90;;;2838:45;2845:3;2850:28;2854:3;:12;;;2874:3;2868;:9;2850:3;:28::i;:::-;2881:1;2850:32;2838:6;:45::i;:::-;2896:9;2911:8;3005:3;2999:10;3076:6;3070:13;3192:3;3187:2;3179:6;3175:15;3171:25;3163:33;;3276:6;3270:3;3265;3261:13;3258:25;3255:2;;;3318:3;3313;3309:13;3301:6;3294:29;3255:2;-1:-1:-1;;;3355:2:33;3345:13;;3416:129;3430:2;3423:9;;3416:129;;3485:10;;3472:24;;3434:9;;;;;3519:2;3511:10;;;;3529:9;3416:129;;;3654:10;3703:11;;3591:21;3599:2;:8;;;3591:3;:17;:21;3699:22;;;3666:9;;3650:26;;;;3741:21;3728:35;;-1:-1:-1;3782:3:33;2650:1140;;;;;;:::o;5810:144::-;5884:13;;:::i;:::-;5912:37;5923:3;5928;:7;;;:14;5944:4;5912:10;:37::i;9502:154::-;9583:13;;:::i;:::-;9611:40;9620:3;9625;:7;;;:14;9641:4;9647:3;9611:8;:40::i;:::-;9604:47;9502:154;-1:-1:-1;;;;9502:154:33:o;1888:114::-;1938:4;1958:1;1954;:5;1950:34;;;-1:-1:-1;1976:1:33;1969:8;;1950:34;-1:-1:-1;1996:1:33;1888:114;-1:-1:-1;1888:114:33:o;1731:153::-;1822:7;;1835:19;1822:3;1845:8;1835:4;:19::i;:::-;;1860;1867:3;1872:6;1860;:19::i;4944:619::-;5027:13;;:::i;:::-;5059:12;;;;5052:19;;5048:69;;5081:29;5088:3;5093;:12;;;5108:1;5093:16;5081:6;:29::i;:::-;5203:3;5197:10;5274:6;5268:13;5386:2;5380:3;5372:6;5368:16;5364:25;5410:4;5404;5396:19;5481:6;5476:3;5473:15;5470:2;;;5526:1;5518:6;5514:14;5506:6;5499:30;5470:2;-1:-1:-1;5555:3:33;;4944:619;-1:-1:-1;;;;;4944:619:33:o;8609:642::-;8698:13;;:::i;:::-;8735:3;:12;;;8729:3;8723;:9;:24;8719:73;;;8757:28;8764:3;8776;8770;:9;8783:1;8769:15;8757:6;:28::i;:::-;8798:9;8823:1;8817:3;8810;:10;:14;8798:26;;8910:3;8904:10;9025:3;9019;9011:6;9007:16;9003:26;9081:4;9073;9069:9;9062:4;9056:11;9052:27;9049:37;9043:4;9036:51;9169:6;9163:13;9157:3;9152;9148:13;9145:32;9142:2;;;9212:3;9207;9203:13;9195:6;9188:29;9142:2;-1:-1:-1;9243:3:33;;8609:642;-1:-1:-1;;;;;;8609:642:33:o;53:2017:22:-;;;;;;;;;-1:-1:-1;53:2017:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53:2017:22;;;-1:-1:-1;53:2017:22;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;53:2017:22;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o"
},
"methodIdentifiers": {
"add(string,string)": "ebdf86ca",
"addBytes(string,bytes)": "2255beb0",
"addInt(string,int256)": "5e31692e",
"addStringArray(string,bytes32[])": "47655b1b",
"addUint(string,uint256)": "0e734a58",
"closeEvent()": "03dc5326",
"setBuffer(bytes)": "cc39406f"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[],\"name\":\"closeEvent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"addUint\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"bytes\"}],\"name\":\"addBytes\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_values\",\"type\":\"bytes32[]\"}],\"name\":\"addStringArray\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"int256\"}],\"name\":\"addInt\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"setBuffer\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_key\",\"type\":\"string\"},{\"name\":\"_value\",\"type\":\"string\"}],\"name\":\"add\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"RequestData\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/ChainlinkTestHelper.sol\":\"ChainlinkTestHelper\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/ChainlinkTestHelper.sol\":{\"keccak256\":\"0x2e2205b4ea6ad71024126ab5803a0cacc64459a9fddeb4e4f402829ce076cb20\",\"urls\":[\"bzzr://ee86bad766b6988ca81822ad02f66ed5f343447a72b78dd5ac178eadb3622b3c\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/ChainlinkTestHelper.sol": {
"id": 22
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
}
},
"sourceCodes": {
"tests/ChainlinkTestHelper.sol": "pragma solidity ^0.5.0;\n\nimport \"../Chainlink.sol\";\n\ncontract ChainlinkTestHelper {\n using Chainlink for Chainlink.Request;\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n Chainlink.Request private req;\n\n event RequestData(bytes payload);\n\n function closeEvent() public {\n emit RequestData(req.buf.buf);\n }\n\n function setBuffer(bytes memory data) public {\n Chainlink.Request memory r2 = req;\n r2.setBuffer(data);\n req = r2;\n }\n\n function add(string memory _key, string memory _value) public {\n Chainlink.Request memory r2 = req;\n r2.add(_key, _value);\n req = r2;\n }\n\n function addBytes(string memory _key, bytes memory _value) public {\n Chainlink.Request memory r2 = req;\n r2.addBytes(_key, _value);\n req = r2;\n }\n\n function addInt(string memory _key, int256 _value) public {\n Chainlink.Request memory r2 = req;\n r2.addInt(_key, _value);\n req = r2;\n }\n\n function addUint(string memory _key, uint256 _value) public {\n Chainlink.Request memory r2 = req;\n r2.addUint(_key, _value);\n req = r2;\n }\n\n // Temporarily have method receive bytes32[] memory until experimental\n // string[] memory can be invoked from truffle tests.\n function addStringArray(string memory _key, bytes32[] memory _values) public {\n string[] memory strings = new string[](_values.length);\n for (uint256 i = 0; i < _values.length; i++) {\n strings[i] = bytes32ToString(_values[i]);\n }\n Chainlink.Request memory r2 = req;\n r2.addStringArray(_key, strings);\n req = r2;\n }\n\n function bytes32ToString(bytes32 x) private pure returns (string memory) {\n bytes memory bytesString = new bytes(32);\n uint charCount = 0;\n for (uint j = 0; j < 32; j++) {\n byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));\n if (char != 0) {\n bytesString[charCount] = char;\n charCount++;\n }\n }\n bytes memory bytesStringTrimmed = new bytes(charCount);\n for (uint j = 0; j < charCount; j++) {\n bytesStringTrimmed[j] = bytesString[j];\n }\n return string(bytesStringTrimmed);\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}"
},
"sourceTreeHashHex": "0x5555ad67d1314569ab24581c118f708218b2426a202bece2af791a310d65241a",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "Consumer",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_price",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callbackFunctionId",
"type": "bytes4"
},
{
"name": "_expiration",
"type": "uint256"
}
],
"name": "cancelRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
},
{
"name": "_payment",
"type": "uint256"
},
{
"name": "_callback",
"type": "address"
}
],
"name": "requestEthereumPriceByCallback",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_currency",
"type": "string"
},
{
"name": "_payment",
"type": "uint256"
}
],
"name": "requestEthereumPrice",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [],
"name": "withdrawLink",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "currentPrice",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_oracle",
"type": "address"
},
{
"name": "_requestId",
"type": "bytes32"
}
],
"name": "addExternalRequest",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": true,
"name": "price",
"type": "bytes32"
}
],
"name": "RequestFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkRequested",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkFulfilled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "id",
"type": "bytes32"
}
],
"name": "ChainlinkCancelled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x6080604052600160045534801561001557600080fd5b50611397806100256000396000f3fe6080604052600436106100825763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100875780635591a608146100b957806374961d4d1461013357806383db5cbc146102015780638dc654a2146102b65780639d1b464a146102cb578063e8d5359d146102f2575b600080fd5b34801561009357600080fd5b506100b7600480360360408110156100aa57600080fd5b5080359060200135610338565b005b3480156100c557600080fd5b506100b7600480360360a08110156100dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060800135610481565b34801561013f57600080fd5b506100b76004803603606081101561015657600080fd5b81019060208101813564010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013573ffffffffffffffffffffffffffffffffffffffff16610548565b34801561020d57600080fd5b506100b76004803603604081101561022457600080fd5b81019060208101813564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106f3915050565b3480156102c257600080fd5b506100b7610702565b3480156102d757600080fd5b506102e06108c0565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506100b76004803603604081101561031557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108c6565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff0000000000000000000000000000000000000000000000000000000084166044820152606481018390529051869173ffffffffffffffffffffffffffffffffffffffff831691636ee4d5539160848082019260009290919082900301818387803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b50505050505050505050565b61055061131e565b60065461057e90837f042f2b65000000000000000000000000000000000000000000000000000000006108d0565b905061064c6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836108fb9092919063ffffffff16565b604080516001808252818301909252606091816020015b60608152602001906001900390816106635790505090508481600081518110151561068a57fe5b906020019060200201819052506106e16040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461092a9092919063ffffffff16565b6106eb828561099a565b505050505050565b6106fe828230610548565b5050565b600061070c6109ca565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b15801561078557600080fd5b505afa158015610799573d6000803e3d6000fd5b505050506040513d60208110156107af57600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b505115156108bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106fe82826109e6565b6108d861131e565b6108e061131e565b6108f28186868663ffffffff610acd16565b95945050505050565b6080830151610910908363ffffffff610b2f16565b6080830151610925908263ffffffff610b2f16565b505050565b608083015161093f908363ffffffff610b2f16565b61094c8360800151610b4c565b60005b815181101561098c57610984828281518110151561096957fe5b6020908102909101015160808601519063ffffffff610b2f16565b60010161094f565b506109258360800151610b57565b6003546000906109c19073ffffffffffffffffffffffffffffffffffffffff168484610b62565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610a7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610ad561131e565b610ae58560800151610100610e04565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610b3c8260038351610e3e565b610925828263ffffffff610f4116565b6108bd816004610f5b565b6108bd816007610f5b565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610c4787610f74565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ce7578181015183820152602001610ccf565b50505050905090810190601f168015610d145780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d3557600080fd5b505af1158015610d49573d6000803e3d6000fd5b505050506040513d6020811015610d5f57600080fd5b50511515610df457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610e0c611353565b6020820615610e215760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610e6057610e5a8360ff848116602002168317611126565b50610925565b60ff8111610e9457610e81836018602060ff8616021763ffffffff61112616565b50610e5a8382600163ffffffff61113e16565b61ffff8111610ec957610eb6836019602060ff8616021763ffffffff61112616565b50610e5a8382600263ffffffff61113e16565b63ffffffff8111610f0057610eed83601a602060ff8616021763ffffffff61112616565b50610e5a8382600463ffffffff61113e16565b67ffffffffffffffff811161092557610f2883601b602060ff8616021763ffffffff61112616565b50610f3b8382600863ffffffff61113e16565b50505050565b610f49611353565b6109c18384600001515184855161115f565b61092582601f602060ff8516021763ffffffff61112616565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b61112e611353565b6109c18384600001515184611247565b611146611353565b611157848560000151518585611292565b949350505050565b611167611353565b825182111561117557600080fd5b8460200151828501111561119f5761119f8561119787602001518786016112f0565b600202611307565b6000808651805187602083010193508088870111156111be5787860182525b505050602084015b6020841061120357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016111c6565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b61124f611353565b6020840151831061126b5761126b848560200151600202611307565b8351805160208583010184815381861415611287576001820183525b509495945050505050565b61129a611353565b846020015184830111156112b7576112b785858401600202611307565b60006001836101000a03905085518386820101858319825116178152815185880111156112e45784870182525b50959695505050505050565b6000818311156113015750816109c4565b50919050565b81516113138383610e04565b50610f3b8382610f41565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161134e611353565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820d95081c722efe5d561f13e8084635b1857f57a7533abbb2029a2977f411734ef0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1397 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x5591A608 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x74961D4D EQ PUSH2 0x133 JUMPI DUP1 PUSH4 0x83DB5CBC EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x2B6 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xE8D5359D EQ PUSH2 0x2F2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x338 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x548 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x6F3 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH2 0x702 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD DUP7 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x528 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x53C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x550 PUSH2 0x131E JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x57E SWAP1 DUP4 PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x8D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x64C PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x8FB SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x663 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x68A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x6E1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x92A SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x6EB DUP3 DUP6 PUSH2 0x99A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 ADDRESS PUSH2 0x548 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70C PUSH2 0x9CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x785 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x799 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x824 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x838 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x84E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x8BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 PUSH2 0x9E6 JUMP JUMPDEST PUSH2 0x8D8 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8E0 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8F2 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xACD AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x910 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x925 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x93F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH2 0x94C DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x98C JUMPI PUSH2 0x984 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x969 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x94F JUMP JUMPDEST POP PUSH2 0x925 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB57 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x9C1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB62 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xA79 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0x131E JUMP JUMPDEST PUSH2 0xAE5 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xE04 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xB3C DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xE3E JUMP JUMPDEST PUSH2 0x925 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF41 AND JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x4 PUSH2 0xF5B JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x7 PUSH2 0xF5B JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xC47 DUP8 PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCE7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCCF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD14 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xDF4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xE21 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xE60 JUMPI PUSH2 0xE5A DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1126 JUMP JUMPDEST POP PUSH2 0x925 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xE94 JUMPI PUSH2 0xE81 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xEC9 JUMPI PUSH2 0xEB6 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xF00 JUMPI PUSH2 0xEED DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x925 JUMPI PUSH2 0xF28 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x115F JUMP JUMPDEST PUSH2 0x925 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1069 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1051 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1096 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x112E PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x1157 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1292 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1167 PUSH2 0x1353 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x119F JUMPI PUSH2 0x119F DUP6 PUSH2 0x1197 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x12F0 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x11BE JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x124F PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x126B JUMPI PUSH2 0x126B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1287 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x129A PUSH2 0x1353 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x12B7 JUMPI PUSH2 0x12B7 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x12E4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1301 JUMPI POP DUP2 PUSH2 0x9C4 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1313 DUP4 DUP4 PUSH2 0xE04 JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH2 0xF41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x134E PUSH2 0x1353 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd9 POP DUP2 0xc7 0x22 0xef 0xe5 0xd5 PUSH2 0xF13E DUP1 DUP5 PUSH4 0x5B1857F5 PUSH27 0x7533ABBB2029A2977F411734EF0029000000000000000000000000 ",
"sourceMap": "59:1706:23:-;;;1131:1:1;1100:32;;59:1706:23;8:9:-1;5:2;;;30:1;27;20:12;5:2;59:1706:23;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x6080604052600436106100825763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663042f2b6581146100875780635591a608146100b957806374961d4d1461013357806383db5cbc146102015780638dc654a2146102b65780639d1b464a146102cb578063e8d5359d146102f2575b600080fd5b34801561009357600080fd5b506100b7600480360360408110156100aa57600080fd5b5080359060200135610338565b005b3480156100c557600080fd5b506100b7600480360360a08110156100dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020810135906040810135907fffffffff000000000000000000000000000000000000000000000000000000006060820135169060800135610481565b34801561013f57600080fd5b506100b76004803603606081101561015657600080fd5b81019060208101813564010000000081111561017157600080fd5b82018360208201111561018357600080fd5b803590602001918460018302840111640100000000831117156101a557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020013573ffffffffffffffffffffffffffffffffffffffff16610548565b34801561020d57600080fd5b506100b76004803603604081101561022457600080fd5b81019060208101813564010000000081111561023f57600080fd5b82018360208201111561025157600080fd5b8035906020019184600183028401116401000000008311171561027357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106f3915050565b3480156102c257600080fd5b506100b7610702565b3480156102d757600080fd5b506102e06108c0565b60408051918252519081900360200190f35b3480156102fe57600080fd5b506100b76004803603604081101561031557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108c6565b600082815260056020526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146103f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008181526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2604051829084907f0c2366233f634048c0f0458060d1228fab36d00f7c0ecf6bdf2d9c458503631190600090a35060075550565b604080517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff0000000000000000000000000000000000000000000000000000000084166044820152606481018390529051869173ffffffffffffffffffffffffffffffffffffffff831691636ee4d5539160848082019260009290919082900301818387803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b50505050505050505050565b61055061131e565b60065461057e90837f042f2b65000000000000000000000000000000000000000000000000000000006108d0565b905061064c6040805190810160405280600381526020017f6765740000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604781526020017f68747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f81526020017f6d2f646174612f70726963653f6673796d3d455448267473796d733d5553442c81526020017f4555522c4a505900000000000000000000000000000000000000000000000000815250836108fb9092919063ffffffff16565b604080516001808252818301909252606091816020015b60608152602001906001900390816106635790505090508481600081518110151561068a57fe5b906020019060200201819052506106e16040805190810160405280600481526020017f7061746800000000000000000000000000000000000000000000000000000000815250828461092a9092919063ffffffff16565b6106eb828561099a565b505050505050565b6106fe828230610548565b5050565b600061070c6109ca565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925073ffffffffffffffffffffffffffffffffffffffff83169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b15801561078557600080fd5b505afa158015610799573d6000803e3d6000fd5b505050506040513d60208110156107af57600080fd5b5051604080517c010000000000000000000000000000000000000000000000000000000063ffffffff861602815273ffffffffffffffffffffffffffffffffffffffff909316600484015260248301919091525160448083019260209291908290030181600087803b15801561082457600080fd5b505af1158015610838573d6000803e3d6000fd5b505050506040513d602081101561084e57600080fd5b505115156108bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e61626c6520746f207472616e736665720000000000000000000000000000604482015290519081900360640190fd5b50565b60075481565b6106fe82826109e6565b6108d861131e565b6108e061131e565b6108f28186868663ffffffff610acd16565b95945050505050565b6080830151610910908363ffffffff610b2f16565b6080830151610925908263ffffffff610b2f16565b505050565b608083015161093f908363ffffffff610b2f16565b61094c8360800151610b4c565b60005b815181101561098c57610984828281518110151561096957fe5b6020908102909101015160808601519063ffffffff610b2f16565b60010161094f565b506109258360800151610b57565b6003546000906109c19073ffffffffffffffffffffffffffffffffffffffff168484610b62565b90505b92915050565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b600081815260056020526040902054819073ffffffffffffffffffffffffffffffffffffffff1615610a7957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f5265717565737420697320616c72656164792070656e64696e67000000000000604482015290519081900360640190fd5b50600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610ad561131e565b610ae58560800151610100610e04565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b610b3c8260038351610e3e565b610925828263ffffffff610f4116565b6108bd816004610f5b565b6108bd816007610f5b565b60045460408051306c01000000000000000000000000026020808301919091526034808301859052835180840390910181526054909201835281519181019190912060608601939093526000838152600590915281812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055905182917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af991a260025473ffffffffffffffffffffffffffffffffffffffff16634000aea08584610c4787610f74565b6040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ce7578181015183820152602001610ccf565b50505050905090810190601f168015610d145780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d3557600080fd5b505af1158015610d49573d6000803e3d6000fd5b505050506040513d6020811015610d5f57600080fd5b50511515610df457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b610e0c611353565b6020820615610e215760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111610e6057610e5a8360ff848116602002168317611126565b50610925565b60ff8111610e9457610e81836018602060ff8616021763ffffffff61112616565b50610e5a8382600163ffffffff61113e16565b61ffff8111610ec957610eb6836019602060ff8616021763ffffffff61112616565b50610e5a8382600263ffffffff61113e16565b63ffffffff8111610f0057610eed83601a602060ff8616021763ffffffff61112616565b50610e5a8382600463ffffffff61113e16565b67ffffffffffffffff811161092557610f2883601b602060ff8616021763ffffffff61112616565b50610f3b8382600863ffffffff61113e16565b50505050565b610f49611353565b6109c18384600001515184855161115f565b61092582601f602060ff8516021763ffffffff61112616565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a905273ffffffffffffffffffffffffffffffffffffffff881660848401527fffffffff00000000000000000000000000000000000000000000000000000000861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b83811015611069578181015183820152602001611051565b50505050905090810190601f1680156110965780820380516001836020036101000a031916815260200191505b50604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909d169c909c17909b5250989950505050505050505050919050565b61112e611353565b6109c18384600001515184611247565b611146611353565b611157848560000151518585611292565b949350505050565b611167611353565b825182111561117557600080fd5b8460200151828501111561119f5761119f8561119787602001518786016112f0565b600202611307565b6000808651805187602083010193508088870111156111be5787860182525b505050602084015b6020841061120357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090930192602091820191016111c6565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b61124f611353565b6020840151831061126b5761126b848560200151600202611307565b8351805160208583010184815381861415611287576001820183525b509495945050505050565b61129a611353565b846020015184830111156112b7576112b785858401600202611307565b60006001836101000a03905085518386820101858319825116178152815185880111156112e45784870182525b50959695505050505050565b6000818311156113015750816109c4565b50919050565b81516113138383610e04565b50610f3b8382610f41565b6040805160c08101825260008082526020820181905291810182905260608101919091526080810161134e611353565b905290565b6040805180820190915260608152600060208201529056fea165627a7a72305820d95081c722efe5d561f13e8084635b1857f57a7533abbb2029a2977f411734ef0029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x82 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F2B65 DUP2 EQ PUSH2 0x87 JUMPI DUP1 PUSH4 0x5591A608 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x74961D4D EQ PUSH2 0x133 JUMPI DUP1 PUSH4 0x83DB5CBC EQ PUSH2 0x201 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x2B6 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xE8D5359D EQ PUSH2 0x2F2 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x338 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH1 0x40 DUP2 ADD CALLDATALOAD SWAP1 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x80 ADD CALLDATALOAD PUSH2 0x481 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x156 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x171 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP DUP3 CALLDATALOAD SWAP4 POP POP POP PUSH1 0x20 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x548 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x224 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 PUSH1 0x20 DUP2 ADD DUP2 CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP POP SWAP2 CALLDATALOAD SWAP3 POP PUSH2 0x6F3 SWAP2 POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH2 0x702 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD AND SWAP1 PUSH1 0x20 ADD CALLDATALOAD PUSH2 0x8C6 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x3F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x28 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x40 MLOAD DUP3 SWAP1 DUP5 SWAP1 PUSH32 0xC2366233F634048C0F0458060D1228FAB36D00F7C0ECF6BDF2D9C4585036311 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP PUSH1 0x7 SSTORE POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x6EE4D55300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP6 SWAP1 MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP5 AND PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD DUP4 SWAP1 MSTORE SWAP1 MLOAD DUP7 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0x6EE4D553 SWAP2 PUSH1 0x84 DUP1 DUP3 ADD SWAP3 PUSH1 0x0 SWAP3 SWAP1 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP4 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x528 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x53C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x550 PUSH2 0x131E JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH2 0x57E SWAP1 DUP4 PUSH32 0x42F2B6500000000000000000000000000000000000000000000000000000000 PUSH2 0x8D0 JUMP JUMPDEST SWAP1 POP PUSH2 0x64C PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x47 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6D696E2D6170692E63727970746F636F6D706172652E636F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6D2F646174612F70726963653F6673796D3D455448267473796D733D5553442C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4555522C4A505900000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x8FB SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x663 JUMPI SWAP1 POP POP SWAP1 POP DUP5 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x68A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 SWAP1 MSTORE POP PUSH2 0x6E1 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x92A SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x6EB DUP3 DUP6 PUSH2 0x99A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 ADDRESS PUSH2 0x548 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x70C PUSH2 0x9CA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE ADDRESS PUSH1 0x4 DUP3 ADD MSTORE SWAP1 MLOAD SWAP2 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP2 PUSH4 0xA9059CBB SWAP2 CALLER SWAP2 DUP5 SWAP2 PUSH4 0x70A08231 SWAP2 PUSH1 0x24 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x785 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x799 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH1 0x40 DUP1 MLOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH4 0xFFFFFFFF DUP7 AND MUL DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND PUSH1 0x4 DUP5 ADD MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE MLOAD PUSH1 0x44 DUP1 DUP4 ADD SWAP3 PUSH1 0x20 SWAP3 SWAP2 SWAP1 DUP3 SWAP1 SUB ADD DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x824 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x838 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x84E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0x8BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x6FE DUP3 DUP3 PUSH2 0x9E6 JUMP JUMPDEST PUSH2 0x8D8 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8E0 PUSH2 0x131E JUMP JUMPDEST PUSH2 0x8F2 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0xACD AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x910 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x925 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x93F SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH2 0x94C DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP2 MLOAD DUP2 LT ISZERO PUSH2 0x98C JUMPI PUSH2 0x984 DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x969 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0xB2F AND JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x94F JUMP JUMPDEST POP PUSH2 0x925 DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0xB57 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x9C1 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 DUP5 PUSH2 0xB62 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xA79 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5265717565737420697320616C72656164792070656E64696E67000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0xAD5 PUSH2 0x131E JUMP JUMPDEST PUSH2 0xAE5 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xE04 JUMP JUMPDEST POP POP SWAP2 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x40 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0xB3C DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xE3E JUMP JUMPDEST PUSH2 0x925 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0xF41 AND JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x4 PUSH2 0xF5B JUMP JUMPDEST PUSH2 0x8BD DUP2 PUSH1 0x7 PUSH2 0xF5B JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x34 DUP1 DUP4 ADD DUP6 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x54 SWAP1 SWAP3 ADD DUP4 MSTORE DUP2 MLOAD SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 KECCAK256 PUSH1 0x60 DUP7 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE DUP2 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE SWAP1 MLOAD DUP3 SWAP2 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP2 LOG2 PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xC47 DUP8 PUSH2 0xF74 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCE7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xCCF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD14 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 SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD49 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD ISZERO ISZERO PUSH2 0xDF4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x23 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xE0C PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0xE21 JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xE60 JUMPI PUSH2 0xE5A DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1126 JUMP JUMPDEST POP PUSH2 0x925 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xE94 JUMPI PUSH2 0xE81 DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xEC9 JUMPI PUSH2 0xEB6 DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xF00 JUMPI PUSH2 0xEED DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xE5A DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x925 JUMPI PUSH2 0xF28 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x113E AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0xF49 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x115F JUMP JUMPDEST PUSH2 0x925 DUP3 PUSH1 0x1F PUSH1 0x20 PUSH1 0xFF DUP6 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1126 AND JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x40 DUP1 DUP6 ADD MLOAD PUSH1 0x60 DUP7 DUP2 ADD MLOAD PUSH1 0x80 DUP9 ADD MLOAD MLOAD SWAP4 MLOAD PUSH1 0x0 PUSH1 0x24 DUP3 ADD DUP2 DUP2 MSTORE PUSH1 0x44 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x64 DUP4 ADD DUP11 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x84 DUP5 ADD MSTORE PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP7 AND PUSH1 0xA4 DUP5 ADD MSTORE PUSH1 0xC4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xE4 DUP5 ADD DUP2 SWAP1 MSTORE PUSH2 0x100 PUSH2 0x104 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD PUSH2 0x124 DUP7 ADD MSTORE DUP9 MLOAD SWAP7 SWAP12 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP12 SWAP5 SWAP11 DUP12 SWAP11 SWAP2 SWAP10 SWAP1 SWAP9 SWAP1 SWAP8 SWAP7 SWAP4 SWAP6 SWAP2 SWAP5 SWAP4 PUSH2 0x144 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP15 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1069 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1051 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1096 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 PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP14 AND SWAP13 SWAP1 SWAP13 OR SWAP1 SWAP12 MSTORE POP SWAP9 SWAP10 POP POP POP POP POP POP POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x112E PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x9C1 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1247 JUMP JUMPDEST PUSH2 0x1146 PUSH2 0x1353 JUMP JUMPDEST PUSH2 0x1157 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1292 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1167 PUSH2 0x1353 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x119F JUMPI PUSH2 0x119F DUP6 PUSH2 0x1197 DUP8 PUSH1 0x20 ADD MLOAD DUP8 DUP7 ADD PUSH2 0x12F0 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0x11BE JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST POP POP POP PUSH1 0x20 DUP5 ADD JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x1203 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x11C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x20 DUP7 SWAP1 SUB PUSH2 0x100 EXP ADD SWAP1 DUP2 AND SWAP1 NOT SWAP2 SWAP1 SWAP2 AND OR SWAP1 MSTORE POP DUP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x124F PUSH2 0x1353 JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x126B JUMPI PUSH2 0x126B DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1287 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x129A PUSH2 0x1353 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x12B7 JUMPI PUSH2 0x12B7 DUP6 DUP6 DUP5 ADD PUSH1 0x2 MUL PUSH2 0x1307 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x12E4 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1301 JUMPI POP DUP2 PUSH2 0x9C4 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1313 DUP4 DUP4 PUSH2 0xE04 JUMP JUMPDEST POP PUSH2 0xF3B DUP4 DUP3 PUSH2 0xF41 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x134E PUSH2 0x1353 JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd9 POP DUP2 0xc7 0x22 0xef 0xe5 0xd5 PUSH2 0xF13E DUP1 DUP5 PUSH4 0x5B1857F5 PUSH27 0x7533ABBB2029A2977F411734EF0029000000000000000000000000 ",
"sourceMap": "59:1706:23:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1574:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1574:188:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1574:188:23;;;;;;;;;;890:332;;8:9:-1;5:2;;;30:1;27;20:12;5:2;890:332:23;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;890:332:23;;;;;;;;;;;;;;;;;;;;;;;;;;;429:457;;8:9:-1;5:2;;;30:1;27;20:12;5:2;429:457:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;429:457:23;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;429:457:23;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;429:457:23;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;429:457:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;429:457:23;;-1:-1:-1;;429:457:23;;;-1:-1:-1;;;429:457:23;;;;;;;268:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;268:157:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;268:157:23;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;268:157:23;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;268:157:23;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;268:157:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;268:157:23;;-1:-1:-1;;268:157:23;;;-1:-1:-1;268:157:23;;-1:-1:-1;;268:157:23;1226:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1226:207:23;;;;127:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;127:27:23;;;;;;;;;;;;;;;;;;;;1437:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1437:133:23;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1437:133:23;;;;;;;;;;1574:188;8691:27:1;;;;:15;:27;;;;;;;;;;8677:10;:41;8669:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8788:27;;;;:15;:27;;;;;;8781:34;;;;;;8826:30;8804:10;;8826:30;;;1694:36:23;;1723:6;;1711:10;;1694:36;;;;;-1:-1:-1;1736:12:23;:21;-1:-1:-1;1574:188:23:o;890:332::-;1132:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1118:7;;1132:29;;;;;;:85;;;;;1054:35;;1132:85;;;;;;;;1054:35;1132:29;:85;;;5:2:-1;;;;30:1;27;20:12;5:2;1132:85:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1132:85:23;;;;890:332;;;;;;:::o;429:457::-;544:28;;:::i;:::-;597:6;;575:63;;605:9;616:21;575;:63::i;:::-;544:94;;644:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:89;;;;;:::i;:::-;762:15;;;775:1;762:15;;;;;;;;;739:20;;762:15;;;;;;;;;;;;;;;;;;;;739:38;;793:9;783:4;788:1;783:7;;;;;;;;;;;;;;;;;:19;;;;808:32;;;;;;;;;;;;;;;;;;;835:4;808:3;:18;;:32;;;;;:::i;:::-;846:35;867:3;872:8;846:20;:35::i;:::-;;429:457;;;;;:::o;268:157::-;354:66;385:9;396:8;414:4;354:30;:66::i;:::-;268:157;;:::o;1226:207::-;1263:24;1309:23;:21;:23::i;:::-;1374:30;;;;;;1398:4;1374:30;;;;;;1263:70;;-1:-1:-1;1347:14:23;;;;;;1362:10;;1347:14;;1374:15;;:30;;;;;;;;;;;;;;1347:14;1374:30;;;5:2:-1;;;;30:1;27;20:12;5:2;1374:30:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1374:30:23;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1374:30:23;1347:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1374:30;;1347:58;;;;;;;-1:-1:-1;1347:58:23;;;;5:2:-1;;;;30:1;27;20:12;5:2;1347:58:23;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1347:58:23;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1347:58:23;1339:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1226:207;:::o;127:27::-;;;;:::o;1437:133::-;1517:48;1545:7;1554:10;1517:27;:48::i;1735:295:1:-;1883:24;;:::i;:::-;1915:28;;:::i;:::-;1956:69;:3;1971:7;1980:16;1998:26;1956:69;:14;:69;:::i;:::-;1949:76;1735:295;-1:-1:-1;;;;;1735:295:1:o;1964:169:0:-;2066:8;;;;:27;;2088:4;2066:27;:21;:27;:::i;:::-;2099:8;;;;:29;;2121:6;2099:29;:21;:29;:::i;:::-;1964:169;;;:::o;3476:301::-;3592:8;;;;:27;;3614:4;3592:27;:21;:27;:::i;:::-;3625:21;:4;:8;;;:19;:21::i;:::-;3657:9;3652:93;3676:7;:14;3672:1;:18;3652:93;;;3705:33;3727:7;3735:1;3727:10;;;;;;;;;;;;;;;;;;;3705:8;;;;;:33;:21;:33;:::i;:::-;3692:3;;3652:93;;;;3750:22;:4;:8;;;:20;:22::i;2327:189:1:-;2487:6;;2432:7;;2456:55;;2487:6;;2496:4;2502:8;2456:22;:55::i;:::-;2449:62;;2327:189;;;;;:::o;5241:110::-;5341:4;;;;5241:110;:::o;5864:171::-;9090:1;9051:27;;;:15;:27;;;;;;5973:10;;9051:41;:27;:41;9043:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5993:27:1;;;;:15;:27;;;;;:37;;;;;;;;;;;;;;;5864:171::o;971:366:0:-;1120:24;;:::i;:::-;1152:50;1174:4;:8;;;335:3;1152:21;:50::i;:::-;-1:-1:-1;;1208:13:0;;;1227:39;;:20;;;:39;1272:43;;:23;;;:43;1208:13;971:366::o;2833:198:34:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;3037:135::-;3116:49;3143:3;445:1;3116:26;:49::i;3315:143::-;3395:56;3422:3;595:1;3395:26;:56::i;3020:488:1:-;3216:12;;3193:36;;;3210:4;3193:36;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3193:36:1;;;;;;3183:47;;;;;;;;;3236:10;;;:25;;;;-1:-1:-1;3267:26:1;;;:15;:26;;;;;;:36;;;;3193;3267;;;;;3314:29;;3183:47;;3314:29;;;3357:4;;;;:20;3378:7;3387:8;3397:19;3411:4;3397:13;:19::i;:::-;3357:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;3357:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3357:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3357:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3357:60:1;3349:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3463:12;:17;;3479:1;3463:17;;;3020:488;;;;;:::o;941:395:33:-;1011:13;;:::i;:::-;1047:2;1036:8;:13;:18;1032:71;;1093:2;1082:8;:13;1076:2;:20;1064:32;;;;1032:71;-1:-1:-1;1150:12:33;;;;:23;;;1213:4;1207:11;;1225:16;;;-1:-1:-1;1248:14:33;;1290:18;;;1282:27;1269:41;;1150:12;941:395::o;709:724:34:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:34;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:34;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:34;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:34;:3;1407:5;1414:1;1393:23;:13;:23;:::i;:::-;;709:724;;;:::o;4495:155:33:-;4572:13;;:::i;:::-;4600:45;4606:3;4611;:7;;;:14;4627:4;4633;:11;4600:5;:45::i;1439:155:34:-;1546:41;:3;1583:2;1569:10;;;;;1568:17;1546:41;:15;:41;:::i;7512:527:1:-;7909:7;;7924:20;;;;;7952:23;;;;;7600:12;7983:10;;;;8021:8;;;;:12;7629:405;;7659:6;7629:405;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;;;;;;;;;;;;;;7659:6;7629:405;;;;;;7659:6;7629:405;;;;;;;;;;;;;;7600:12;;7659:29;;:6;;;;7909:7;;7924:20;;7952:23;;7983:10;7659:6;;8021:12;;7629:405;;;;;;;;;;7659:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7629:405:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7629:405:1;;;22:32:-1;26:21;;;22:32;6:49;;7629:405:1;;;49:4:-1;25:18;;61:17;;7629:405:1;182:15:-1;7629:405:1;;;;179:29:-1;;;;160:49;;;-1:-1;7629:405:1;;-1:-1:-1;;;;;;;;;;7512:527:1;;;:::o;5810:144:33:-;5884:13;;:::i;:::-;5912:37;5923:3;5928;:7;;;:14;5944:4;5912:10;:37::i;9502:154::-;9583:13;;:::i;:::-;9611:40;9620:3;9625;:7;;;:14;9641:4;9647:3;9611:8;:40::i;:::-;9604:47;9502:154;-1:-1:-1;;;;9502:154:33:o;2650:1140::-;2745:13;;:::i;:::-;2781:11;;2774:18;;;2766:27;;;;;;2816:3;:12;;;2810:3;2804;:9;:24;2800:90;;;2838:45;2845:3;2850:28;2854:3;:12;;;2874:3;2868;:9;2850:3;:28::i;:::-;2881:1;2850:32;2838:6;:45::i;:::-;2896:9;2911:8;3005:3;2999:10;3076:6;3070:13;3192:3;3187:2;3179:6;3175:15;3171:25;3163:33;;3276:6;3270:3;3265;3261:13;3258:25;3255:2;;;3318:3;3313;3309:13;3301:6;3294:29;3255:2;-1:-1:-1;;;3355:2:33;3345:13;;3416:129;3430:2;3423:9;;3416:129;;3485:10;;3472:24;;3434:9;;;;;3519:2;3511:10;;;;3529:9;3416:129;;;3654:10;3703:11;;3591:21;3599:2;:8;;;3591:3;:17;:21;3699:22;;;3666:9;;3650:26;;;;3741:21;3728:35;;-1:-1:-1;3782:3:33;2650:1140;;;;;;:::o;4944:619::-;5027:13;;:::i;:::-;5059:12;;;;5052:19;;5048:69;;5081:29;5088:3;5093;:12;;;5108:1;5093:16;5081:6;:29::i;:::-;5203:3;5197:10;5274:6;5268:13;5386:2;5380:3;5372:6;5368:16;5364:25;5410:4;5404;5396:19;5481:6;5476:3;5473:15;5470:2;;;5526:1;5518:6;5514:14;5506:6;5499:30;5470:2;-1:-1:-1;5555:3:33;;4944:619;-1:-1:-1;;;;;4944:619:33:o;8609:642::-;8698:13;;:::i;:::-;8735:3;:12;;;8729:3;8723;:9;:24;8719:73;;;8757:28;8764:3;8776;8770;:9;8783:1;8769:15;8757:6;:28::i;:::-;8798:9;8823:1;8817:3;8810;:10;:14;8798:26;;8910:3;8904:10;9025:3;9019;9011:6;9007:16;9003:26;9081:4;9073;9069:9;9062:4;9056:11;9052:27;9049:37;9043:4;9036:51;9169:6;9163:13;9157:3;9152;9148:13;9145:32;9142:2;;;9212:3;9207;9203:13;9195:6;9188:29;9142:2;-1:-1:-1;9243:3:33;;8609:642;-1:-1:-1;;;;;;8609:642:33:o;1888:114::-;1938:4;1958:1;1954;:5;1950:34;;;-1:-1:-1;1976:1:33;1969:8;;1950:34;-1:-1:-1;1996:1:33;1888:114;-1:-1:-1;1888:114:33:o;1731:153::-;1822:7;;1835:19;1822:3;1845:8;1835:4;:19::i;:::-;;1860;1867:3;1872:6;1860;:19::i;59:1706:23:-;;;;;;;;;-1:-1:-1;59:1706:23;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;59:1706:23;;;;;:::o"
},
"methodIdentifiers": {
"addExternalRequest(address,bytes32)": "e8d5359d",
"cancelRequest(address,bytes32,uint256,bytes4,uint256)": "5591a608",
"currentPrice()": "9d1b464a",
"fulfill(bytes32,bytes32)": "042f2b65",
"requestEthereumPrice(string,uint256)": "83db5cbc",
"requestEthereumPriceByCallback(string,uint256,address)": "74961d4d",
"withdrawLink()": "8dc654a2"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_price\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callbackFunctionId\",\"type\":\"bytes4\"},{\"name\":\"_expiration\",\"type\":\"uint256\"}],\"name\":\"cancelRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"},{\"name\":\"_payment\",\"type\":\"uint256\"},{\"name\":\"_callback\",\"type\":\"address\"}],\"name\":\"requestEthereumPriceByCallback\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_currency\",\"type\":\"string\"},{\"name\":\"_payment\",\"type\":\"uint256\"}],\"name\":\"requestEthereumPrice\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"withdrawLink\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"currentPrice\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_requestId\",\"type\":\"bytes32\"}],\"name\":\"addExternalRequest\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"price\",\"type\":\"bytes32\"}],\"name\":\"RequestFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"bytes32\"}],\"name\":\"ChainlinkCancelled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/Consumer.sol\":\"Consumer\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/Chainlink.sol\":{\"keccak256\":\"0x2e22ca7d3cfdca8f53ff01c25460f72c2634fd778746f9ec2e608412d0ab037c\",\"urls\":[\"bzzr://cee187a0a12f045523125e4522ddde4610ea5f000c1f92acbb7be778eaf8a4ed\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/ChainlinkClient.sol\":{\"keccak256\":\"0xf26d2fb1abfa4415c00313dded53fa99e813e06201e970b409aa444154a1c0eb\",\"urls\":[\"bzzr://9b4c84585da86567d244bf59370c53bb5e05b4be73030e86a8b0883329435564\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ChainlinkRequestInterface.sol\":{\"keccak256\":\"0x8871fe810c2efc580e8173e1751df0023b362f4835e44383bd95ee375c4388b9\",\"urls\":[\"bzzr://1c0bdf40cbcbe3fe7491c673d5db4561e85f3f02bd5f3851c857c6d5f7987c45\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/ENSInterface.sol\":{\"keccak256\":\"0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d\",\"urls\":[\"bzzr://10a880076bf0b03ef9bd153e7f6ca18e65f15c9f7bf4b0883e93b8de67dd22c2\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/LinkTokenInterface.sol\":{\"keccak256\":\"0x592d87884106ba82cedbe79922de9cfaf28b211a09f9be243ad767d3baa1cb90\",\"urls\":[\"bzzr://1f4a72f8b790700d839354d412df656d5a59877264c6e126a1deae6164de9e7d\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/interfaces/PointerInterface.sol\":{\"keccak256\":\"0xdc08ab9320d187dbaffa20dc31d331f8067fa534c9a654aab8f9ffa63df450da\",\"urls\":[\"bzzr://7e34f1d953ea72152d9daffea28117d5d31d85891f2cac5f1ded4a589cad4874\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/Consumer.sol\":{\"keccak256\":\"0xd01430ff4d7618f2b59e5f8a6315d5ac5d81a4a5f7529d80840d94ba615abcc2\",\"urls\":[\"bzzr://b935e49145c2de48e923181af0c008af6059006db6119574e240e330324f843c\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/Buffer.sol\":{\"keccak256\":\"0x0a3bc9b2ae59b3a51f85050a85f77611b44d12d0185dc5744db997e15ccc3ef4\",\"urls\":[\"bzzr://f499c6f1912d0fa8a62ce1ef81cf57c25fa9b15f5a1e2aeaf92dc9d2d1916277\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/CBOR.sol\":{\"keccak256\":\"0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d\",\"urls\":[\"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/vendor/ENSResolver.sol\":{\"keccak256\":\"0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e\",\"urls\":[\"bzzr://09e1bdee1831b5e85d3c7b5d96b7c26ad54e96d654cfaf18f58449c4c45961fc\"]}},\"version\":1}",
"userdoc": {
"methods": {}
}
},
"sources": {
"tests/Consumer.sol": {
"id": 23
},
"ChainlinkClient.sol": {
"id": 1
},
"Chainlink.sol": {
"id": 0
},
"vendor/CBOR.sol": {
"id": 34
},
"vendor/Buffer.sol": {
"id": 33
},
"interfaces/ENSInterface.sol": {
"id": 15
},
"interfaces/LinkTokenInterface.sol": {
"id": 17
},
"interfaces/ChainlinkRequestInterface.sol": {
"id": 14
},
"interfaces/PointerInterface.sol": {
"id": 19
},
"vendor/ENSResolver.sol": {
"id": 35
}
},
"sourceCodes": {
"tests/Consumer.sol": "pragma solidity ^0.5.0;\n\nimport \"../ChainlinkClient.sol\";\n\ncontract Consumer is ChainlinkClient {\n bytes32 internal specId;\n bytes32 public currentPrice;\n\n event RequestFulfilled(\n bytes32 indexed requestId, // User-defined ID\n bytes32 indexed price\n );\n\n function requestEthereumPrice(string memory _currency, uint256 _payment) public {\n requestEthereumPriceByCallback(_currency, _payment, address(this));\n }\n\n function requestEthereumPriceByCallback(string memory _currency, uint256 _payment, address _callback) public {\n Chainlink.Request memory req = buildChainlinkRequest(specId, _callback, this.fulfill.selector);\n req.add(\"get\", \"https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD,EUR,JPY\");\n string[] memory path = new string[](1);\n path[0] = _currency;\n req.addStringArray(\"path\", path);\n sendChainlinkRequest(req, _payment);\n }\n\n function cancelRequest(\n address _oracle,\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunctionId,\n uint256 _expiration\n ) public {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(_oracle);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunctionId, _expiration);\n }\n\n function withdrawLink() public {\n LinkTokenInterface _link = LinkTokenInterface(chainlinkTokenAddress());\n require(_link.transfer(msg.sender, _link.balanceOf(address(this))), \"Unable to transfer\");\n }\n\n function addExternalRequest(address _oracle, bytes32 _requestId) external {\n addChainlinkExternalRequest(_oracle, _requestId);\n }\n\n function fulfill(bytes32 _requestId, bytes32 _price)\n public\n recordChainlinkFulfillment(_requestId)\n {\n emit RequestFulfilled(_requestId, _price);\n currentPrice = _price;\n }\n\n}\n",
"ChainlinkClient.sol": "pragma solidity ^0.5.0;\n\nimport \"./Chainlink.sol\";\nimport \"./interfaces/ENSInterface.sol\";\nimport \"./interfaces/LinkTokenInterface.sol\";\nimport \"./interfaces/ChainlinkRequestInterface.sol\";\nimport \"./interfaces/PointerInterface.sol\";\nimport { ENSResolver as ENSResolver_Chainlink } from \"./vendor/ENSResolver.sol\";\n\n/**\n * @title The ChainlinkClient contract\n * @notice Contract writers can inherit this contract in order to create requests for the\n * Chainlink network\n */\ncontract ChainlinkClient {\n using Chainlink for Chainlink.Request;\n\n uint256 constant internal LINK = 10**18;\n uint256 constant private AMOUNT_OVERRIDE = 0;\n address constant private SENDER_OVERRIDE = address(0);\n uint256 constant private ARGS_VERSION = 1;\n bytes32 constant private ENS_TOKEN_SUBNAME = keccak256(\"link\");\n bytes32 constant private ENS_ORACLE_SUBNAME = keccak256(\"oracle\");\n address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;\n\n ENSInterface private ens;\n bytes32 private ensNode;\n LinkTokenInterface private link;\n ChainlinkRequestInterface private oracle;\n uint256 private requestCount = 1;\n mapping(bytes32 => address) private pendingRequests;\n\n event ChainlinkRequested(bytes32 indexed id);\n event ChainlinkFulfilled(bytes32 indexed id);\n event ChainlinkCancelled(bytes32 indexed id);\n\n /**\n * @notice Creates a request that can hold additional parameters\n * @param _specId The Job Specification ID that the request will be created for\n * @param _callbackAddress The callback address that the response will be sent to\n * @param _callbackFunctionSignature The callback function signature to use for the callback address\n * @return A Chainlink Request struct in memory\n */\n function buildChainlinkRequest(\n bytes32 _specId,\n address _callbackAddress,\n bytes4 _callbackFunctionSignature\n ) internal pure returns (Chainlink.Request memory) {\n Chainlink.Request memory req;\n return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature);\n }\n\n /**\n * @notice Creates a Chainlink request to the stored oracle address\n * @dev Calls `chainlinkRequestTo` with the stored oracle address\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32)\n {\n return sendChainlinkRequestTo(address(oracle), _req, _payment);\n }\n\n /**\n * @notice Creates a Chainlink request to the specified oracle address\n * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to\n * send LINK which creates a request on the target oracle contract.\n * Emits ChainlinkRequested event.\n * @param _oracle The address of the oracle for the request\n * @param _req The initialized Chainlink Request\n * @param _payment The amount of LINK to send for the request\n * @return The request ID\n */\n function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment)\n internal\n returns (bytes32 requestId)\n {\n requestId = keccak256(abi.encodePacked(this, requestCount));\n _req.nonce = requestCount;\n pendingRequests[requestId] = _oracle;\n emit ChainlinkRequested(requestId);\n require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), \"unable to transferAndCall to oracle\");\n requestCount += 1;\n\n return requestId;\n }\n\n /**\n * @notice Allows a request to be cancelled if it has not been fulfilled\n * @dev Requires keeping track of the expiration value emitted from the oracle contract.\n * Deletes the request from the `pendingRequests` mapping.\n * Emits ChainlinkCancelled event.\n * @param _requestId The request ID\n * @param _payment The amount of LINK sent for the request\n * @param _callbackFunc The callback function specified for the request\n * @param _expiration The time of the expiration for the request\n */\n function cancelChainlinkRequest(\n bytes32 _requestId,\n uint256 _payment,\n bytes4 _callbackFunc,\n uint256 _expiration\n )\n internal\n {\n ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]);\n delete pendingRequests[_requestId];\n emit ChainlinkCancelled(_requestId);\n requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration);\n }\n\n /**\n * @notice Sets the stored oracle address\n * @param _oracle The address of the oracle contract\n */\n function setChainlinkOracle(address _oracle) internal {\n oracle = ChainlinkRequestInterface(_oracle);\n }\n\n /**\n * @notice Sets the LINK token address\n * @param _link The address of the LINK token contract\n */\n function setChainlinkToken(address _link) internal {\n link = LinkTokenInterface(_link);\n }\n\n /**\n * @notice Sets the Chainlink token address for the public\n * network as given by the Pointer contract\n */\n function setPublicChainlinkToken() internal {\n setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());\n }\n\n /**\n * @notice Retrieves the stored address of the LINK token\n * @return The address of the LINK token\n */\n function chainlinkTokenAddress()\n internal\n view\n returns (address)\n {\n return address(link);\n }\n\n /**\n * @notice Retrieves the stored address of the oracle contract\n * @return The address of the oracle contract\n */\n function chainlinkOracleAddress()\n internal\n view\n returns (address)\n {\n return address(oracle);\n }\n\n /**\n * @notice Allows for a request which was created on another contract to be fulfilled\n * on this contract\n * @param _oracle The address of the oracle contract that will fulfill the request\n * @param _requestId The request ID used for the response\n */\n function addChainlinkExternalRequest(address _oracle, bytes32 _requestId)\n internal\n notPendingRequest(_requestId)\n {\n pendingRequests[_requestId] = _oracle;\n }\n\n /**\n * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS\n * @dev Accounts for subnodes having different resolvers\n * @param _ens The address of the ENS contract\n * @param _node The ENS node hash\n */\n function useChainlinkWithENS(address _ens, bytes32 _node)\n internal\n {\n ens = ENSInterface(_ens);\n ensNode = _node;\n bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode));\n setChainlinkToken(resolver.addr(linkSubnode));\n updateChainlinkOracleWithENS();\n }\n\n /**\n * @notice Sets the stored oracle contract with the address resolved by ENS\n * @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously\n */\n function updateChainlinkOracleWithENS()\n internal\n {\n bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME));\n ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode));\n setChainlinkOracle(resolver.addr(oracleSubnode));\n }\n\n /**\n * @notice Encodes the request to be sent to the oracle contract\n * @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types\n * will be validated in the oracle contract.\n * @param _req The initialized Chainlink Request\n * @return The bytes payload for the `transferAndCall` method\n */\n function encodeRequest(Chainlink.Request memory _req)\n private\n view\n returns (bytes memory)\n {\n return abi.encodeWithSelector(\n oracle.oracleRequest.selector,\n SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address\n AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent\n _req.id,\n _req.callbackAddress,\n _req.callbackFunctionId,\n _req.nonce,\n ARGS_VERSION,\n _req.buf.buf);\n }\n\n /**\n * @notice Ensures that the fulfillment is valid for this contract\n * @dev Use if the contract developer prefers methods instead of modifiers for validation\n * @param _requestId The request ID for fulfillment\n */\n function validateChainlinkCallback(bytes32 _requestId)\n internal\n recordChainlinkFulfillment(_requestId)\n // solhint-disable-next-line no-empty-blocks\n {}\n\n /**\n * @dev Reverts if the sender is not the oracle of the request.\n * Emits ChainlinkFulfilled event.\n * @param _requestId The request ID for fulfillment\n */\n modifier recordChainlinkFulfillment(bytes32 _requestId) {\n require(msg.sender == pendingRequests[_requestId],\n \"Source must be the oracle of the request\");\n delete pendingRequests[_requestId];\n emit ChainlinkFulfilled(_requestId);\n _;\n }\n\n /**\n * @dev Reverts if the request is already pending\n * @param _requestId The request ID for fulfillment\n */\n modifier notPendingRequest(bytes32 _requestId) {\n require(pendingRequests[_requestId] == address(0), \"Request is already pending\");\n _;\n }\n}\n",
"Chainlink.sol": "pragma solidity ^0.5.0;\n\nimport { CBOR as CBOR_Chainlink } from \"./vendor/CBOR.sol\";\nimport { Buffer as Buffer_Chainlink } from \"./vendor/Buffer.sol\";\n\n/**\n * @title Library for common Chainlink functions\n * @dev Uses imported CBOR library for encoding to buffer\n */\nlibrary Chainlink {\n uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase\n\n using CBOR_Chainlink for Buffer_Chainlink.buffer;\n\n struct Request {\n bytes32 id;\n address callbackAddress;\n bytes4 callbackFunctionId;\n uint256 nonce;\n Buffer_Chainlink.buffer buf;\n }\n\n /**\n * @notice Initializes a Chainlink request\n * @dev Sets the ID, callback address, and callback function signature on the request\n * @param self The uninitialized request\n * @param _id The Job Specification ID\n * @param _callbackAddress The callback address\n * @param _callbackFunction The callback function signature\n * @return The initialized request\n */\n function initialize(\n Request memory self,\n bytes32 _id,\n address _callbackAddress,\n bytes4 _callbackFunction\n ) internal pure returns (Chainlink.Request memory) {\n Buffer_Chainlink.init(self.buf, defaultBufferSize);\n self.id = _id;\n self.callbackAddress = _callbackAddress;\n self.callbackFunctionId = _callbackFunction;\n return self;\n }\n\n /**\n * @notice Sets the data for the buffer without encoding CBOR on-chain\n * @dev CBOR can be closed with curly-brackets {} or they can be left off\n * @param self The initialized request\n * @param _data The CBOR data\n */\n function setBuffer(Request memory self, bytes memory _data)\n internal pure\n {\n Buffer_Chainlink.init(self.buf, _data.length);\n Buffer_Chainlink.append(self.buf, _data);\n }\n\n /**\n * @notice Adds a string value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The string value to add\n */\n function add(Request memory self, string memory _key, string memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeString(_value);\n }\n\n /**\n * @notice Adds a bytes value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The bytes value to add\n */\n function addBytes(Request memory self, string memory _key, bytes memory _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeBytes(_value);\n }\n\n /**\n * @notice Adds a int256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The int256 value to add\n */\n function addInt(Request memory self, string memory _key, int256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeInt(_value);\n }\n\n /**\n * @notice Adds a uint256 value to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _value The uint256 value to add\n */\n function addUint(Request memory self, string memory _key, uint256 _value)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.encodeUInt(_value);\n }\n\n /**\n * @notice Adds an array of strings to the request with a given key name\n * @param self The initialized request\n * @param _key The name of the key\n * @param _values The array of string values to add\n */\n function addStringArray(Request memory self, string memory _key, string[] memory _values)\n internal pure\n {\n self.buf.encodeString(_key);\n self.buf.startArray();\n for (uint256 i = 0; i < _values.length; i++) {\n self.buf.encodeString(_values[i]);\n }\n self.buf.endSequence();\n }\n}\n",
"vendor/CBOR.sol": "// SPDX-License-Identifier: MIT\npragma solidity >= 0.4.19 < 0.7.0;\n\nimport { Buffer as BufferChainlink } from \"./Buffer.sol\";\n\nlibrary CBOR {\n using BufferChainlink for BufferChainlink.buffer;\n\n uint8 private constant MAJOR_TYPE_INT = 0;\n uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;\n uint8 private constant MAJOR_TYPE_BYTES = 2;\n uint8 private constant MAJOR_TYPE_STRING = 3;\n uint8 private constant MAJOR_TYPE_ARRAY = 4;\n uint8 private constant MAJOR_TYPE_MAP = 5;\n uint8 private constant MAJOR_TYPE_TAG = 6;\n uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;\n\n uint8 private constant TAG_TYPE_BIGNUM = 2;\n uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;\n\n function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure {\n if(value <= 23) {\n buf.appendUint8(uint8((major << 5) | value));\n } else if(value <= 0xFF) {\n buf.appendUint8(uint8((major << 5) | 24));\n buf.appendInt(value, 1);\n } else if(value <= 0xFFFF) {\n buf.appendUint8(uint8((major << 5) | 25));\n buf.appendInt(value, 2);\n } else if(value <= 0xFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 26));\n buf.appendInt(value, 4);\n } else if(value <= 0xFFFFFFFFFFFFFFFF) {\n buf.appendUint8(uint8((major << 5) | 27));\n buf.appendInt(value, 8);\n }\n }\n\n function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {\n buf.appendUint8(uint8((major << 5) | 31));\n }\n\n function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {\n encodeType(buf, MAJOR_TYPE_INT, value);\n }\n\n function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {\n if(value < -0x10000000000000000) {\n encodeSignedBigNum(buf, value);\n } else if(value > 0xFFFFFFFFFFFFFFFF) {\n encodeBigNum(buf, value);\n } else if(value >= 0) {\n encodeType(buf, MAJOR_TYPE_INT, uint(value));\n } else {\n encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value));\n }\n }\n\n function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_BYTES, value.length);\n buf.append(value);\n }\n\n function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(value)));\n }\n\n function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {\n buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));\n encodeBytes(buf, abi.encode(uint(-1 - input)));\n }\n\n function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {\n encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length);\n buf.append(bytes(value));\n }\n\n function startArray(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);\n }\n\n function startMap(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);\n }\n\n function endSequence(BufferChainlink.buffer memory buf) internal pure {\n encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);\n }\n}\n",
"vendor/Buffer.sol": "pragma solidity ^0.5.0;\n\n/**\n* @dev A library for working with mutable byte buffers in Solidity.\n*\n* Byte buffers are mutable and expandable, and provide a variety of primitives\n* for writing to them. At any time you can fetch a bytes object containing the\n* current contents of the buffer. The bytes object should not be stored between\n* operations, as it may change due to resizing of the buffer.\n*/\nlibrary Buffer {\n /**\n * @dev Represents a mutable buffer. Buffers have a current value (buf) and\n * a capacity. The capacity may be longer than the current value, in\n * which case it can be extended without the need to allocate more memory.\n */\n struct buffer {\n bytes buf;\n uint capacity;\n }\n\n /**\n * @dev Initializes a buffer with an initial capacity.\n * @param buf The buffer to initialize.\n * @param capacity The number of bytes of space to allocate the buffer.\n * @return The buffer, for chaining.\n */\n function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) {\n if (capacity % 32 != 0) {\n capacity += 32 - (capacity % 32);\n }\n // Allocate space for the buffer data\n buf.capacity = capacity;\n assembly {\n let ptr := mload(0x40)\n mstore(buf, ptr)\n mstore(ptr, 0)\n mstore(0x40, add(32, add(ptr, capacity)))\n }\n return buf;\n }\n\n /**\n * @dev Initializes a new buffer from an existing bytes object.\n * Changes to the buffer may mutate the original value.\n * @param b The bytes object to initialize the buffer with.\n * @return A new buffer.\n */\n function fromBytes(bytes memory b) internal pure returns(buffer memory) {\n buffer memory buf;\n buf.buf = b;\n buf.capacity = b.length;\n return buf;\n }\n\n function resize(buffer memory buf, uint capacity) private pure {\n bytes memory oldbuf = buf.buf;\n init(buf, capacity);\n append(buf, oldbuf);\n }\n\n function max(uint a, uint b) private pure returns(uint) {\n if (a > b) {\n return a;\n }\n return b;\n }\n\n /**\n * @dev Sets buffer length to 0.\n * @param buf The buffer to truncate.\n * @return The original buffer, for chaining..\n */\n function truncate(buffer memory buf) internal pure returns (buffer memory) {\n assembly {\n let bufptr := mload(buf)\n mstore(bufptr, 0)\n }\n return buf;\n }\n\n /**\n * @dev Writes a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The start offset to write to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) {\n require(len <= data.length);\n\n if (off + len > buf.capacity) {\n resize(buf, max(buf.capacity, len + off) * 2);\n }\n\n uint dest;\n uint src;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Start address = buffer address + offset + sizeof(buffer length)\n dest := add(add(bufptr, 32), off)\n // Update buffer length if we're extending it\n if gt(add(len, off), buflen) {\n mstore(bufptr, add(len, off))\n }\n src := add(data, 32)\n }\n\n // Copy word-length chunks while possible\n for (; len >= 32; len -= 32) {\n assembly {\n mstore(dest, mload(src))\n }\n dest += 32;\n src += 32;\n }\n\n // Copy remaining bytes\n uint mask = 256 ** (32 - len) - 1;\n assembly {\n let srcpart := and(mload(src), not(mask))\n let destpart := and(mload(dest), mask)\n mstore(dest, or(destpart, srcpart))\n }\n\n return buf;\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @param len The number of bytes to copy.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, len);\n }\n\n /**\n * @dev Appends a byte string to a buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, data.length);\n }\n\n /**\n * @dev Writes a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write the byte at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) {\n if (off >= buf.capacity) {\n resize(buf, buf.capacity * 2);\n }\n\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Length of existing buffer data\n let buflen := mload(bufptr)\n // Address = buffer address + sizeof(buffer length) + off\n let dest := add(add(bufptr, off), 32)\n mstore8(dest, data)\n // Update buffer length if we extended it\n if eq(off, buflen) {\n mstore(bufptr, add(buflen, 1))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) {\n return writeUint8(buf, buf.buf.length, data);\n }\n\n /**\n * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (left-aligned).\n * @return The original buffer, for chaining.\n */\n function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n // Right-align data\n data = data >> (8 * (32 - len));\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + sizeof(buffer length) + off + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the\n * capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, off, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chhaining.\n */\n function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, bytes32(data), 20);\n }\n\n /**\n * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer, for chaining.\n */\n function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) {\n return write(buf, buf.buf.length, data, 32);\n }\n\n /**\n * @dev Writes an integer to the buffer. Resizes if doing so would exceed\n * the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param off The offset to write at.\n * @param data The data to append.\n * @param len The number of bytes to write (right-aligned).\n * @return The original buffer, for chaining.\n */\n function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) {\n if (len + off > buf.capacity) {\n resize(buf, (len + off) * 2);\n }\n\n uint mask = 256 ** len - 1;\n assembly {\n // Memory address of the buffer data\n let bufptr := mload(buf)\n // Address = buffer address + off + sizeof(buffer length) + len\n let dest := add(add(bufptr, off), len)\n mstore(dest, or(and(mload(dest), not(mask)), data))\n // Update buffer length if we extended it\n if gt(add(off, len), mload(bufptr)) {\n mstore(bufptr, add(off, len))\n }\n }\n return buf;\n }\n\n /**\n * @dev Appends a byte to the end of the buffer. Resizes if doing so would\n * exceed the capacity of the buffer.\n * @param buf The buffer to append to.\n * @param data The data to append.\n * @return The original buffer.\n */\n function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) {\n return writeInt(buf, buf.buf.length, data, len);\n }\n}",
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n",
"interfaces/LinkTokenInterface.sol": "pragma solidity ^0.5.0;\n\ninterface LinkTokenInterface {\n function allowance(address owner, address spender) external view returns (uint256 remaining);\n function approve(address spender, uint256 value) external returns (bool success);\n function balanceOf(address owner) external view returns (uint256 balance);\n function decimals() external view returns (uint8 decimalPlaces);\n function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);\n function increaseApproval(address spender, uint256 subtractedValue) external;\n function name() external view returns (string memory tokenName);\n function symbol() external view returns (string memory tokenSymbol);\n function totalSupply() external view returns (uint256 totalTokensIssued);\n function transfer(address to, uint256 value) external returns (bool success);\n function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);\n function transferFrom(address from, address to, uint256 value) external returns (bool success);\n}\n",
"interfaces/ChainlinkRequestInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ChainlinkRequestInterface {\n function oracleRequest(\n address sender,\n uint256 requestPrice,\n bytes32 serviceAgreementID,\n address callbackAddress,\n bytes4 callbackFunctionId,\n uint256 nonce,\n uint256 dataVersion,\n bytes calldata data\n ) external;\n\n function cancelOracleRequest(\n bytes32 requestId,\n uint256 payment,\n bytes4 callbackFunctionId,\n uint256 expiration\n ) external;\n}\n",
"interfaces/PointerInterface.sol": "pragma solidity ^0.5.0;\n\ninterface PointerInterface {\n function getAddress() external view returns (address);\n}\n",
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x361a3ff3cbb19083a57e27504afcb2c9a51fa5972f407d4b142b943e84ddc304",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"schemaVersion": "2.0.0",
"contractName": "CoordinatorInterface",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_aggregatorArgs",
"type": "bytes32"
}
],
"name": "fulfillOracleRequest",
"outputs": [
{
"name": "",
"type": "bool"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_serviceAgreementData",
"type": "bytes"
},
{
"name": "_oracleSignaturesData",
"type": "bytes"
}
],
"name": "initiateServiceAgreement",
"outputs": [
{
"name": "",
"type": "bytes32"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"fulfillOracleRequest(bytes32,bytes32)": "1f8f238c",
"initiateServiceAgreement(bytes,bytes)": "b972d7f8"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"dev/CoordinatorInterface.sol": {
"id": 7
}
},
"sourceCodes": {
"dev/CoordinatorInterface.sol": "pragma solidity 0.5.0;\n\ncontract CoordinatorInterface {\n\n function initiateServiceAgreement(\n bytes memory _serviceAgreementData,\n bytes memory _oracleSignaturesData)\n public returns (bytes32);\n\n function fulfillOracleRequest(\n bytes32 _requestId,\n bytes32 _aggregatorArgs)\n external returns (bool);\n}\n"
},
"sourceTreeHashHex": "0x5e47514ec65553a3cd071eb215a3b70252ac803ed2635140cda3c848265d9ef0",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENSInterface",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "resolver",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "owner",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "label",
"type": "bytes32"
},
{
"name": "_owner",
"type": "address"
}
],
"name": "setSubnodeOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "_ttl",
"type": "uint64"
}
],
"name": "setTTL",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "ttl",
"outputs": [
{
"name": "",
"type": "uint64"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "_resolver",
"type": "address"
}
],
"name": "setResolver",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "node",
"type": "bytes32"
},
{
"name": "_owner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": true,
"name": "label",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "NewOwner",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "owner",
"type": "address"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "resolver",
"type": "address"
}
],
"name": "NewResolver",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"name": "node",
"type": "bytes32"
},
{
"indexed": false,
"name": "ttl",
"type": "uint64"
}
],
"name": "NewTTL",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"owner(bytes32)": "02571be3",
"resolver(bytes32)": "0178b8bf",
"setOwner(bytes32,address)": "5b0fc9c3",
"setResolver(bytes32,address)": "1896f70a",
"setSubnodeOwner(bytes32,bytes32,address)": "06ab5923",
"setTTL(bytes32,uint64)": "14ab9038",
"ttl(bytes32)": "16a25cbd"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"interfaces/ENSInterface.sol": {
"id": 15
}
},
"sourceCodes": {
"interfaces/ENSInterface.sol": "pragma solidity ^0.5.0;\n\ninterface ENSInterface {\n\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n\n function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external;\n function setResolver(bytes32 node, address _resolver) external;\n function setOwner(bytes32 node, address _owner) external;\n function setTTL(bytes32 node, uint64 _ttl) external;\n function owner(bytes32 node) external view returns (address);\n function resolver(bytes32 node) external view returns (address);\n function ttl(bytes32 node) external view returns (uint64);\n\n}\n"
},
"sourceTreeHashHex": "0x87607c12cc84c57afbcb38f00d96ae67c433474c1310a0c2798e2a728f41750d",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "ENSResolver",
"compilerOutput": {
"abi": [
{
"constant": true,
"inputs": [
{
"name": "node",
"type": "bytes32"
}
],
"name": "addr",
"outputs": [
{
"name": "",
"type": "address"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x",
"opcodes": "",
"sourceMap": ""
},
"methodIdentifiers": {
"addr(bytes32)": "3b3b57de"
}
},
"metadata": "",
"userdoc": {
"methods": {}
}
},
"sources": {
"vendor/ENSResolver.sol": {
"id": 35
}
},
"sourceCodes": {
"vendor/ENSResolver.sol": "pragma solidity ^0.5.0;\n\ncontract ENSResolver {\n function addr(bytes32 node) public view returns (address);\n}\n"
},
"sourceTreeHashHex": "0x64fcf7d2fc5efc87eaf7eba4a8f69af4d28986b6e4fb3590f076eb41ce40296e",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
{
"schemaVersion": "2.0.0",
"contractName": "EmptyAggregator",
"compilerOutput": {
"abi": [
{
"constant": false,
"inputs": [
{
"name": "_requestId",
"type": "bytes32"
},
{
"name": "_saId",
"type": "bytes32"
},
{
"name": "_oracle",
"type": "address"
},
{
"name": "_fulfillment",
"type": "bytes32"
}
],
"name": "fulfill",
"outputs": [
{
"name": "success",
"type": "bool"
},
{
"name": "complete",
"type": "bool"
},
{
"name": "response",
"type": "bytes"
},
{
"name": "paymentAmounts",
"type": "int256[]"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "_saId",
"type": "bytes32"
},
{
"name": "_serviceAgreementData",
"type": "bytes"
}
],
"name": "initiateJob",
"outputs": [
{
"name": "success",
"type": "bool"
},
{
"name": "_",
"type": "bytes"
}
],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "said",
"type": "bytes32"
}
],
"name": "InitiatedJob",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"name": "requestId",
"type": "bytes32"
},
{
"indexed": false,
"name": "oracle",
"type": "address"
},
{
"indexed": false,
"name": "success",
"type": "bool"
},
{
"indexed": false,
"name": "complete",
"type": "bool"
},
{
"indexed": false,
"name": "fulfillment",
"type": "bytes"
}
],
"name": "Fulfilled",
"type": "event"
}
],
"devdoc": {
"methods": {}
},
"evm": {
"bytecode": {
"linkReferences": {},
"object": "0x608060405234801561001057600080fd5b50610425806100206000396000f3fe60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639760168f8114610050578063d43a12f614610171575b600080fd5b34801561005c57600080fd5b506100a26004803603608081101561007357600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff60408201351690606001356102ae565b6040518085151515158152602001841515151581526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b83811015610159578181015183820152602001610141565b50505050905001965050505050505060405180910390f35b34801561017d57600080fd5b5061022b6004803603604081101561019457600080fd5b813591908101906040810160208201356401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460018302840111640100000000831117156101ea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103b5945050505050565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561027257818101518382015260200161025a565b50505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6040805160208082018490528251808303820181528284019384905287845273ffffffffffffffffffffffffffffffffffffffff861660608481019190915260016080850181905260a080860182905260c08601908152835160e0870152835191968796949593947f56e3e982f891af88c0faacff5062ae928b6bdeab4073240eb1ae9451b77a54b8948d948c948a9485948b9491936101009091019185019080838360005b8381101561036c578181015183820152602001610354565b50505050905090810190601f1680156103995780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1945094509450949050565b6040805183815290516000916060917f5d3501b519fbd1e8d168f391246ff9ea5621f7d81712c6fc42d23e380b80a8119181900360200190a160019150925092905056fea165627a7a7230582007d97c4effa377438ab50673dee12e8e9e324327efd3575615dce43a7bfa28860029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x425 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x9760168F DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xD43A12F6 EQ PUSH2 0x171 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP5 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP1 DUP8 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x141 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x3B5 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x272 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x25A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F 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 SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE DUP3 DUP5 ADD SWAP4 DUP5 SWAP1 MSTORE DUP8 DUP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x60 DUP5 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x80 DUP6 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP7 ADD SWAP1 DUP2 MSTORE DUP4 MLOAD PUSH1 0xE0 DUP8 ADD MSTORE DUP4 MLOAD SWAP2 SWAP7 DUP8 SWAP7 SWAP5 SWAP6 SWAP4 SWAP5 PUSH32 0x56E3E982F891AF88C0FAACFF5062AE928B6BDEAB4073240EB1AE9451B77A54B8 SWAP5 DUP14 SWAP5 DUP13 SWAP5 DUP11 SWAP5 DUP6 SWAP5 DUP12 SWAP5 SWAP2 SWAP4 PUSH2 0x100 SWAP1 SWAP2 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x36C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x354 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x399 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 SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH32 0x5D3501B519FBD1E8D168F391246FF9EA5621F7D81712C6FC42D23E380B80A811 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 PUSH1 0x1 SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 SMOD 0xd9 PUSH29 0x4EFFA377438AB50673DEE12E8E9E324327EFD3575615DCE43A7BFA2886 STOP 0x29 ",
"sourceMap": "202:755:24:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;202:755:24;;;;;;;"
},
"deployedBytecode": {
"linkReferences": {},
"object": "0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639760168f8114610050578063d43a12f614610171575b600080fd5b34801561005c57600080fd5b506100a26004803603608081101561007357600080fd5b5080359060208101359073ffffffffffffffffffffffffffffffffffffffff60408201351690606001356102ae565b6040518085151515158152602001841515151581526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b508381038252845181528451602091820191808701910280838360005b83811015610159578181015183820152602001610141565b50505050905001965050505050505060405180910390f35b34801561017d57600080fd5b5061022b6004803603604081101561019457600080fd5b813591908101906040810160208201356401000000008111156101b657600080fd5b8201836020820111156101c857600080fd5b803590602001918460018302840111640100000000831117156101ea57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506103b5945050505050565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561027257818101518382015260200161025a565b50505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6040805160208082018490528251808303820181528284019384905287845273ffffffffffffffffffffffffffffffffffffffff861660608481019190915260016080850181905260a080860182905260c08601908152835160e0870152835191968796949593947f56e3e982f891af88c0faacff5062ae928b6bdeab4073240eb1ae9451b77a54b8948d948c948a9485948b9491936101009091019185019080838360005b8381101561036c578181015183820152602001610354565b50505050905090810190601f1680156103995780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1945094509450949050565b6040805183815290516000916060917f5d3501b519fbd1e8d168f391246ff9ea5621f7d81712c6fc42d23e380b80a8119181900360200190a160019150925092905056fea165627a7a7230582007d97c4effa377438ab50673dee12e8e9e324327efd3575615dce43a7bfa28860029",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x9760168F DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xD43A12F6 EQ PUSH2 0x171 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 DUP2 ADD CALLDATALOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x40 DUP3 ADD CALLDATALOAD AND SWAP1 PUSH1 0x60 ADD CALLDATALOAD PUSH2 0x2AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP5 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF7 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x124 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 DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP1 DUP8 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x159 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x141 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x17D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x194 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH1 0x40 DUP2 ADD PUSH1 0x20 DUP3 ADD CALLDATALOAD PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP SWAP3 SWAP6 POP PUSH2 0x3B5 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x272 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x25A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F 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 SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 ADD DUP5 SWAP1 MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP3 ADD DUP2 MSTORE DUP3 DUP5 ADD SWAP4 DUP5 SWAP1 MSTORE DUP8 DUP5 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND PUSH1 0x60 DUP5 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x80 DUP6 ADD DUP2 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP7 ADD DUP3 SWAP1 MSTORE PUSH1 0xC0 DUP7 ADD SWAP1 DUP2 MSTORE DUP4 MLOAD PUSH1 0xE0 DUP8 ADD MSTORE DUP4 MLOAD SWAP2 SWAP7 DUP8 SWAP7 SWAP5 SWAP6 SWAP4 SWAP5 PUSH32 0x56E3E982F891AF88C0FAACFF5062AE928B6BDEAB4073240EB1AE9451B77A54B8 SWAP5 DUP14 SWAP5 DUP13 SWAP5 DUP11 SWAP5 DUP6 SWAP5 DUP12 SWAP5 SWAP2 SWAP4 PUSH2 0x100 SWAP1 SWAP2 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x36C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x354 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x399 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 SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP4 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x60 SWAP2 PUSH32 0x5D3501B519FBD1E8D168F391246FF9EA5621F7D81712C6FC42D23E380B80A811 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 PUSH1 0x1 SWAP2 POP SWAP3 POP SWAP3 SWAP1 POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 SMOD 0xd9 PUSH29 0x4EFFA377438AB50673DEE12E8E9E324327EFD3575615DCE43A7BFA2886 STOP 0x29 ",
"sourceMap": "202:755:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;585:370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;585:370:24;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;585:370:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;585:370:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;585:370:24;;;;;;;;;;;;;;;;;;;;;;;;23: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;585:370:24;;;;;;;;;;;;;;;;;;;;;269:188;;8:9:-1;5:2;;;30:1;27;20:12;5:2;269:188:24;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;269:188:24;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;269:188:24;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;269:188:24;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;269:188:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;269:188:24;;-1:-1:-1;269:188:24;;-1:-1:-1;;;;;269:188:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23: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;269:188:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;585:370;852:24;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;852:24:24;;;;;;;889:59;;;;;;729:21;889:59;;;;;;;806:4;889:59;;;;;;;;;;;;;;;;;;;;;;;;;;;806:4;;;;852:24;;729:21;;889:59;;899:10;;911:7;;806:4;;;;852:24;;;;889:59;;;;;;;;;;;700:12;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;889:59:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;585:370;;;;;;;;;:::o;269:188::-;409:19;;;;;;;;366:12;;380:14;;409:19;;;;;;;;;446:4;436:14;;269:188;;;;;:::o"
},
"methodIdentifiers": {
"fulfill(bytes32,bytes32,address,bytes32)": "9760168f",
"initiateJob(bytes32,bytes)": "d43a12f6"
}
},
"metadata": "{\"compiler\":{\"version\":\"0.5.0+commit.1d4f565a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":false,\"inputs\":[{\"name\":\"_requestId\",\"type\":\"bytes32\"},{\"name\":\"_saId\",\"type\":\"bytes32\"},{\"name\":\"_oracle\",\"type\":\"address\"},{\"name\":\"_fulfillment\",\"type\":\"bytes32\"}],\"name\":\"fulfill\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"},{\"name\":\"complete\",\"type\":\"bool\"},{\"name\":\"response\",\"type\":\"bytes\"},{\"name\":\"paymentAmounts\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_saId\",\"type\":\"bytes32\"},{\"name\":\"_serviceAgreementData\",\"type\":\"bytes\"}],\"name\":\"initiateJob\",\"outputs\":[{\"name\":\"success\",\"type\":\"bool\"},{\"name\":\"_\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"said\",\"type\":\"bytes32\"}],\"name\":\"InitiatedJob\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"requestId\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"oracle\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"complete\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"fulfillment\",\"type\":\"bytes\"}],\"name\":\"Fulfilled\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{},\"notice\":\"Used to check the basic aggregator/coordinator interactions. It does nothing but emit its messages as certain types of events.\"}},\"settings\":{\"compilationTarget\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/EmptyAggregator.sol\":\"EmptyAggregator\"},\"evmVersion\":\"byzantium\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/dev/CoordinatorInterface.sol\":{\"keccak256\":\"0x5e47514ec65553a3cd071eb215a3b70252ac803ed2635140cda3c848265d9ef0\",\"urls\":[\"bzzr://aab94dbeb95e865cfc0f5a8808ce5bc5529e0105a53290b03ee6ccd83430d450\"]},\"/home/thomas/workspace/chainlink/evm-contracts/src/v0.5/tests/EmptyAggregator.sol\":{\"keccak256\":\"0x952e461308e0889cd12613aeb21642b1bc1ed7762939a23eda8dafabce012fda\",\"urls\":[\"bzzr://e0769b23c56bc1d2e9f0600daff1e5367145e1d18a98ac4731a51baaac2afe74\"]}},\"version\":1}",
"userdoc": {
"methods": {},
"notice": "Used to check the basic aggregator/coordinator interactions. It does nothing but emit its messages as certain types of events."
}
},
"sources": {
"tests/EmptyAggregator.sol": {
"id": 24
},
"dev/CoordinatorInterface.sol": {
"id": 7
}
},
"sourceCodes": {
"tests/EmptyAggregator.sol": "pragma solidity 0.5.0;\n\nimport \"../dev/CoordinatorInterface.sol\";\n\n/// Used to check the basic aggregator/coordinator interactions. It does nothing\n/// but emit its messages as certain types of events.\ncontract EmptyAggregator {\n\n event InitiatedJob(bytes32 said);\n\n function initiateJob(\n bytes32 _saId, bytes memory _serviceAgreementData)\n public returns (bool success, bytes memory _) {\n emit InitiatedJob(_saId);\n success = true;\n }\n\n event Fulfilled(\n bytes32 requestId,\n address oracle,\n bool success,\n bool complete,\n bytes fulfillment);\n\n function fulfill(bytes32 _requestId, bytes32 _saId, address _oracle,\n bytes32 _fulfillment)\n public returns (bool success, bool complete, bytes memory response,\n int256[] memory paymentAmounts) {\n success = true;\n complete = true;\n response = abi.encode(_fulfillment);\n emit Fulfilled(_requestId, _oracle, success, complete, response);\n }\n}\n",
"dev/CoordinatorInterface.sol": "pragma solidity 0.5.0;\n\ncontract CoordinatorInterface {\n\n function initiateServiceAgreement(\n bytes memory _serviceAgreementData,\n bytes memory _oracleSignaturesData)\n public returns (bytes32);\n\n function fulfillOracleRequest(\n bytes32 _requestId,\n bytes32 _aggregatorArgs)\n external returns (bool);\n}\n"
},
"sourceTreeHashHex": "0x1e27c17fc0f213b38a27259e15d4b917da7778bd0fe099f09cf36d83c728e501",
"compiler": {
"name": "solc",
"version": "soljson-v0.5.0+commit.1d4f565a.js",
"settings": {
"optimizer": {
"runs": 1000000,
"enabled": true
},
"outputSelection": {
"*": {
"*": [
"abi",
"devdoc",
"userdoc",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap",
"evm.methodIdentifiers",
"metadata"
]
}
},
"metadata": {
"bytecodeHash": "none"
},
"remappings": []
}
},
"chains": {}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment