diff --git a/contracts/utils/CHANGELOG.json b/contracts/utils/CHANGELOG.json index 27e8d1387c..f3b4c95b34 100644 --- a/contracts/utils/CHANGELOG.json +++ b/contracts/utils/CHANGELOG.json @@ -9,11 +9,6 @@ { "note": "Added tests for decoding log arguments when artifact dependencies are included/excluded.", "pr": 1995 - }, - - { - "note": "Added tests for`getABIDecodedTransactionData` and `getABIDecodedReturnData` in contract wrappers.", - "pr": 2018 } ] }, diff --git a/contracts/utils/compiler.json b/contracts/utils/compiler.json index b0857f00ba..01ab211056 100644 --- a/contracts/utils/compiler.json +++ b/contracts/utils/compiler.json @@ -30,7 +30,6 @@ "src/ReentrancyGuard.sol", "src/SafeMath.sol", "src/interfaces/IOwnable.sol", - "test/TestAbi.sol", "test/TestConstants.sol", "test/TestLibAddressArray.sol", "test/TestLibBytes.sol", diff --git a/contracts/utils/contracts/test/TestAbi.sol b/contracts/utils/contracts/test/TestAbi.sol deleted file mode 100644 index 54a7f742a7..0000000000 --- a/contracts/utils/contracts/test/TestAbi.sol +++ /dev/null @@ -1,154 +0,0 @@ -/* - - Copyright 2018 ZeroEx Intl. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -*/ - -pragma solidity ^0.5.5; -pragma experimental ABIEncoderV2; - - -contract TestAbi { - - /// @dev complex input is dynamic and more difficult to decode than simple input. - struct ComplexInput { - uint256 foo; - bytes bar; - string car; - } - - /// @dev complex input is dynamic and more difficult to decode than simple input. - struct ComplexOutput { - ComplexInput input; - bytes lorem; - bytes ipsum; - string dolor; - } - - /// @dev The fallback function calls into this contract and executes one of the above functions. - /// This allows us to test `getABIDecodedTransactionData` and `getABIDecodedReturnData` that is - /// include in contract wrappers. - // solhint-disable no-complex-fallback - function () - external - payable - { - address addr = address(this); - assembly { - // copy calldata to memory - calldatacopy( - 0x0, - 0x0, - calldatasize() - ) - // execute transaction - let success := call( - gas, // send all gas. - addr, // call into this contract. - 0, // don't send any ether. - 0x0, // input is `txData`. - calldatasize(), // input length is that of `txData`. - 0x0, // any return data goes at mem address 0x0. - 0 // there is no fixed return value size. - ) - - // copy return data to memory - returndatacopy( - 0x0, - 0x0, - returndatasize() - ) - - // rethrow any exceptions - if iszero(success) { - revert(0, returndatasize()) - } - - // return call results - return(0, returndatasize()) - } - } - - /// @dev Tests decoding when both input and output are empty. - function noInputNoOutput() - public - pure - { - // NOP - require(true == true); - } - - /// @dev Tests decoding when input is empty and output is non-empty. - function noInputSimpleOutput() - public - pure - returns (uint256) - { - return 1991; - } - - /// @dev Tests decoding when input is not empty but output is empty. - function simpleInputNoOutput(uint256) - public - pure - { - // NOP - require(true == true); - } - - /// @dev Tests decoding when both input and output are non-empty. - function simpleInputSimpleOutput(uint256) - public - pure - returns (uint256) - { - return 1991; - } - - /// @dev Tests decoding when the input and output are complex. - function complexInputComplexOutput(ComplexInput memory complexInput) - public - pure - returns (ComplexOutput memory) - { - return ComplexOutput({ - input: complexInput, - lorem: hex'12345678', - ipsum: hex'87654321', - dolor: "amet" - }); - } - - /// @dev Tests decoding when the input and output are complex and have more than one argument. - function multiInputMultiOutput( - uint256, - bytes memory, - string memory - ) - public - pure - returns ( - bytes memory, - bytes memory, - string memory - ) - { - return ( - hex'12345678', - hex'87654321', - "amet" - ); - } -} diff --git a/contracts/utils/package.json b/contracts/utils/package.json index 136fa66eba..0b11673348 100644 --- a/contracts/utils/package.json +++ b/contracts/utils/package.json @@ -34,7 +34,7 @@ "lint-contracts": "solhint -c ../.solhint.json contracts/**/**/**/**/*.sol" }, "config": { - "abis": "./generated-artifacts/@(Address|IOwnable|LibBytes|Ownable|ReentrancyGuard|SafeMath|TestAbi|TestConstants|TestLibAddressArray|TestLibBytes|TestLogDecoding|TestLogDecodingDownstream).json", + "abis": "./generated-artifacts/@(Address|IOwnable|LibBytes|Ownable|ReentrancyGuard|SafeMath|TestConstants|TestLibAddressArray|TestLibBytes|TestLogDecoding|TestLogDecodingDownstream).json", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually." }, "repository": { diff --git a/contracts/utils/src/artifacts.ts b/contracts/utils/src/artifacts.ts index 99bc3cf7e6..e2b2104257 100644 --- a/contracts/utils/src/artifacts.ts +++ b/contracts/utils/src/artifacts.ts @@ -11,7 +11,6 @@ import * as LibBytes from '../generated-artifacts/LibBytes.json'; import * as Ownable from '../generated-artifacts/Ownable.json'; import * as ReentrancyGuard from '../generated-artifacts/ReentrancyGuard.json'; import * as SafeMath from '../generated-artifacts/SafeMath.json'; -import * as TestAbi from '../generated-artifacts/TestAbi.json'; import * as TestConstants from '../generated-artifacts/TestConstants.json'; import * as TestLibAddressArray from '../generated-artifacts/TestLibAddressArray.json'; import * as TestLibBytes from '../generated-artifacts/TestLibBytes.json'; @@ -29,5 +28,4 @@ export const artifacts = { TestLibBytes: TestLibBytes as ContractArtifact, TestLogDecoding: TestLogDecoding as ContractArtifact, TestLogDecodingDownstream: TestLogDecodingDownstream as ContractArtifact, - TestAbi: TestAbi as ContractArtifact, }; diff --git a/contracts/utils/src/wrappers.ts b/contracts/utils/src/wrappers.ts index 0439bc28b1..be616b060f 100644 --- a/contracts/utils/src/wrappers.ts +++ b/contracts/utils/src/wrappers.ts @@ -9,7 +9,6 @@ export * from '../generated-wrappers/lib_bytes'; export * from '../generated-wrappers/ownable'; export * from '../generated-wrappers/reentrancy_guard'; export * from '../generated-wrappers/safe_math'; -export * from '../generated-wrappers/test_abi'; export * from '../generated-wrappers/test_constants'; export * from '../generated-wrappers/test_lib_address_array'; export * from '../generated-wrappers/test_lib_bytes'; diff --git a/contracts/utils/test/abi.ts b/contracts/utils/test/abi.ts deleted file mode 100644 index 28709a3914..0000000000 --- a/contracts/utils/test/abi.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { chaiSetup, provider, txDefaults, web3Wrapper } from '@0x/contracts-test-utils'; -import { BlockchainLifecycle } from '@0x/dev-utils'; -import { BigNumber } from '@0x/utils'; -import * as chai from 'chai'; - -import { artifacts, TestAbiContract } from '../src'; - -chaiSetup.configure(); -const expect = chai.expect; - -const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); - -describe('TestAbi', () => { - let testAbi: TestAbiContract; - const runTestAsync = async (contractMethod: any, input: any, output: any) => { - const transaction = contractMethod.getABIEncodedTransactionData(input); - // try decoding transaction - const decodedInput = contractMethod.getABIDecodedTransactionData(transaction); - expect(decodedInput, 'decoded input').to.be.deep.equal(input); - // execute transaction - const rawOutput = await web3Wrapper.callAsync({ - to: testAbi.address, - data: transaction, - }); - // try decoding output - const decodedOutput = contractMethod.getABIDecodedReturnData(rawOutput); - expect(decodedOutput, 'decoded output').to.be.deep.equal(output); - }; - before(async () => { - testAbi = await TestAbiContract.deployFrom0xArtifactAsync(artifacts.TestAbi, provider, txDefaults, artifacts); - }); - beforeEach(async () => { - await blockchainLifecycle.startAsync(); - }); - afterEach(async () => { - await blockchainLifecycle.revertAsync(); - }); - describe('Encoding/Decoding Transaction Data and Return Values', () => { - it('should successfully encode/decode (no input / no output)', async () => { - const input = undefined; - const output = undefined; - await runTestAsync(testAbi.noInputNoOutput, input, output); - }); - it('should successfully encode/decode (no input / simple output)', async () => { - const input = undefined; - const output = new BigNumber(1991); - await runTestAsync(testAbi.noInputSimpleOutput, input, output); - }); - it('should successfully encode/decode (simple input / no output)', async () => { - const input = new BigNumber(1991); - const output = undefined; - await runTestAsync(testAbi.simpleInputNoOutput, input, output); - }); - it('should successfully encode/decode (simple input / simple output)', async () => { - const input = new BigNumber(16); - const output = new BigNumber(1991); - await runTestAsync(testAbi.simpleInputSimpleOutput, input, output); - }); - it('should successfully encode/decode (complex input / complex output)', async () => { - const input = { - foo: new BigNumber(1991), - bar: '0x1234', - car: 'zoom zoom', - }; - const output = { - input, - lorem: '0x12345678', - ipsum: '0x87654321', - dolor: 'amet', - }; - await runTestAsync(testAbi.complexInputComplexOutput, input, output); - }); - it('should successfully encode/decode (multi-input / multi-output)', async () => { - const input = [new BigNumber(1991), '0x1234', 'zoom zoom']; - const output = ['0x12345678', '0x87654321', 'amet']; - const transaction = testAbi.multiInputMultiOutput.getABIEncodedTransactionData( - input[0] as BigNumber, - input[1] as string, - input[2] as string, - ); - // try decoding transaction - const decodedInput = testAbi.multiInputMultiOutput.getABIDecodedTransactionData(transaction); - expect(decodedInput, 'decoded input').to.be.deep.equal(input); - // execute transaction - const rawOutput = await web3Wrapper.callAsync({ - to: testAbi.address, - data: transaction, - }); - // try decoding output - const decodedOutput = testAbi.multiInputMultiOutput.getABIDecodedReturnData(rawOutput); - expect(decodedOutput, 'decoded output').to.be.deep.equal(output); - }); - }); -}); diff --git a/contracts/utils/tsconfig.json b/contracts/utils/tsconfig.json index a339d3631a..bb3f9566be 100644 --- a/contracts/utils/tsconfig.json +++ b/contracts/utils/tsconfig.json @@ -9,7 +9,6 @@ "generated-artifacts/Ownable.json", "generated-artifacts/ReentrancyGuard.json", "generated-artifacts/SafeMath.json", - "generated-artifacts/TestAbi.json", "generated-artifacts/TestConstants.json", "generated-artifacts/TestLibAddressArray.json", "generated-artifacts/TestLibBytes.json", diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json index 186ff675e8..4e4b43b62b 100644 --- a/packages/abi-gen/CHANGELOG.json +++ b/packages/abi-gen/CHANGELOG.json @@ -5,6 +5,10 @@ { "note": "Updated expected typescript output for cli tests to include `getABIDecodedTransactionData` and `getABIDecodedReturnData`", "pr": 2018 + }, + { + "note": "Added tests for`getABIDecodedTransactionData` and `getABIDecodedReturnData` in contract wrappers.", + "pr": 2018 } ] }, diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md index d5df7ab450..87637f3214 100644 --- a/packages/abi-gen/README.md +++ b/packages/abi-gen/README.md @@ -110,7 +110,7 @@ The files in `test-cli/` are used to test the CLI output against a set of dummy Compile dummy contracts and generate wrappers: ``` -yarn test_cli:prebuild +yarn compile:sol ``` Build generated wrappers and unit tests: diff --git a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py index 0b33e533be..b8b2c7da51 100644 --- a/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py +++ b/packages/abi-gen/test-cli/expected-output/python/abi_gen_dummy/__init__.py @@ -101,6 +101,52 @@ class Tuple0xcf8ad995(TypedDict): aString: str +class Tuple0xf95128ef(TypedDict): + """Python representation of a tuple or struct. + + A tuple found in an ABI may have been written in Solidity as a literal + tuple, or it may have been written as a parameter with a Solidity + `struct`:code: data type; there's no way to tell which, based solely on the + ABI, and the name of a Solidity `struct`:code: is not conveyed through the + ABI. This class represents a tuple that appeared in a method definition. + Its name is derived from a hash of that tuple's field names, and every + method whose ABI refers to a tuple with that same list of field names will + have a generated wrapper method that refers to this class. + + Any members of type `bytes`:code: should be encoded as UTF-8, which can be + accomplished via `str.encode("utf_8")`:code: + """ + + foo: int + + bar: bytes + + car: str + +class Tuple0xa057bf41(TypedDict): + """Python representation of a tuple or struct. + + A tuple found in an ABI may have been written in Solidity as a literal + tuple, or it may have been written as a parameter with a Solidity + `struct`:code: data type; there's no way to tell which, based solely on the + ABI, and the name of a Solidity `struct`:code: is not conveyed through the + ABI. This class represents a tuple that appeared in a method definition. + Its name is derived from a hash of that tuple's field names, and every + method whose ABI refers to a tuple with that same list of field names will + have a generated wrapper method that refers to this class. + + Any members of type `bytes`:code: should be encoded as UTF-8, which can be + accomplished via `str.encode("utf_8")`:code: + """ + + input: Tuple0xf95128ef + + lorem: bytes + + ipsum: bytes + + dolor: str + # pylint: disable=too-many-public-methods class AbiGenDummy(BaseContractWrapper): @@ -197,6 +243,36 @@ def accepts_an_array_of_bytes( view_only=True ) + def simple_input_simple_output( + self, + index_0: int, + tx_params: Optional[TxParams] = None, + ) -> int: + """Execute underlying, same-named contract method. + + Tests decoding when both input and output are non-empty. + + :param tx_params: transaction parameters + + """ + self.validator.assert_valid( + method_name='simpleInputSimpleOutput', + parameter_name='index_0', + argument_value=index_0, + ) + # safeguard against fractional inputs + index_0 = int(index_0) + func = self._get_contract_instance( + self.contract_address + ).functions.simpleInputSimpleOutput( + index_0 + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) + def withdraw( self, wad: int, @@ -230,6 +306,53 @@ def withdraw( view_only=view_only ) + def multi_input_multi_output( + self, + index_0: int, + index_1: bytes, + index_2: str, + tx_params: Optional[TxParams] = None, + ) -> [bytes, bytes, str] +: + """Execute underlying, same-named contract method. + + Tests decoding when the input and output are complex and have more than + one argument. + + :param tx_params: transaction parameters + + """ + self.validator.assert_valid( + method_name='multiInputMultiOutput', + parameter_name='index_0', + argument_value=index_0, + ) + # safeguard against fractional inputs + index_0 = int(index_0) + self.validator.assert_valid( + method_name='multiInputMultiOutput', + parameter_name='index_1', + argument_value=index_1, + ) + index_1 = bytes.fromhex(index_1.decode("utf-8")) + self.validator.assert_valid( + method_name='multiInputMultiOutput', + parameter_name='index_2', + argument_value=index_2, + ) + func = self._get_contract_instance( + self.contract_address + ).functions.multiInputMultiOutput( + index_0, + index_1, + index_2 + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) + def ecrecover_fn( self, _hash: bytes, @@ -304,6 +427,27 @@ def accepts_bytes( view_only=True ) + def no_input_simple_output( + self, + tx_params: Optional[TxParams] = None, + ) -> int: + """Execute underlying, same-named contract method. + + Tests decoding when input is empty and output is non-empty. + + :param tx_params: transaction parameters + + """ + func = self._get_contract_instance( + self.contract_address + ).functions.noInputSimpleOutput( + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) + def revert_with_constant( self, tx_params: Optional[TxParams] = None, @@ -492,6 +636,55 @@ def non_pure_method( view_only=view_only ) + def complex_input_complex_output( + self, + complex_input: Tuple0xf95128ef, + tx_params: Optional[TxParams] = None, + ) -> Tuple0xa057bf41: + """Execute underlying, same-named contract method. + + Tests decoding when the input and output are complex. + + :param tx_params: transaction parameters + + """ + self.validator.assert_valid( + method_name='complexInputComplexOutput', + parameter_name='complexInput', + argument_value=complex_input, + ) + func = self._get_contract_instance( + self.contract_address + ).functions.complexInputComplexOutput( + complex_input + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) + + def no_input_no_output( + self, + tx_params: Optional[TxParams] = None, + ) -> None: + """Execute underlying, same-named contract method. + + Tests decoding when both input and output are empty. + + :param tx_params: transaction parameters + + """ + func = self._get_contract_instance( + self.contract_address + ).functions.noInputNoOutput( + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) + def simple_pure_function_with_input( self, x: int, @@ -628,6 +821,36 @@ def pure_function_with_constant( tx_params=tx_params, view_only=True ) + + def simple_input_no_output( + self, + index_0: int, + tx_params: Optional[TxParams] = None, + ) -> None: + """Execute underlying, same-named contract method. + + Tests decoding when input is not empty but output is empty. + + :param tx_params: transaction parameters + + """ + self.validator.assert_valid( + method_name='simpleInputNoOutput', + parameter_name='index_0', + argument_value=index_0, + ) + # safeguard against fractional inputs + index_0 = int(index_0) + func = self._get_contract_instance( + self.contract_address + ).functions.simpleInputNoOutput( + index_0 + ) + return self._invoke_function_call( + func=func, + tx_params=tx_params, + view_only=True + ) def get_withdrawal_event( self, tx_hash: Union[HexBytes, bytes] ) -> Tuple[AttributeDict]: @@ -659,7 +882,7 @@ def get_an_event_event( def abi(): """Return the ABI to the underlying contract.""" return json.loads( - '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"address"},{"name":"a","type":"uint256"},{"name":"b","type":"uint256"},{"name":"y","type":"address"},{"name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) + '[{"constant":true,"inputs":[],"name":"simpleRequire","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes[]"}],"name":"acceptsAnArrayOfBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"}],"name":"simpleInputSimpleOutput","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"},{"name":"index_1","type":"bytes"},{"name":"index_2","type":"string"}],"name":"multiInputMultiOutput","outputs":[{"name":"","type":"bytes"},{"name":"","type":"bytes"},{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"ecrecoverFn","outputs":[{"name":"signerAddress","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"a","type":"bytes"}],"name":"acceptsBytes","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputSimpleOutput","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"revertWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"simpleRevert","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"nestedStructOutput","outputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"requireWithConstant","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"address"},{"name":"a","type":"uint256"},{"name":"b","type":"uint256"},{"name":"y","type":"address"},{"name":"c","type":"uint256"}],"name":"withAddressInput","outputs":[{"name":"z","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"name":"structInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"foo","type":"uint256"},{"name":"bar","type":"bytes"},{"name":"car","type":"string"}],"name":"complexInput","type":"tuple"}],"name":"complexInputComplexOutput","outputs":[{"components":[{"components":[{"name":"foo","type":"uint256"},{"name":"bar","type":"bytes"},{"name":"car","type":"string"}],"name":"input","type":"tuple"},{"name":"lorem","type":"bytes"},{"name":"ipsum","type":"bytes"},{"name":"dolor","type":"string"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"noInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"simplePureFunctionWithInput","outputs":[{"name":"sum","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"nonPureMethodThatReturnsNothing","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simplePureFunction","outputs":[{"name":"result","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"innerStruct","type":"tuple"},{"name":"description","type":"string"}],"name":"n","type":"tuple"}],"name":"nestedStructInput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"structOutput","outputs":[{"components":[{"name":"someBytes","type":"bytes"},{"name":"anInteger","type":"uint32"},{"name":"aDynamicArrayOfBytes","type":"bytes[]"},{"name":"aString","type":"string"}],"name":"s","type":"tuple"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pureFunctionWithConstant","outputs":[{"name":"someConstant","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"index_0","type":"uint256"}],"name":"simpleInputNoOutput","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"param","type":"uint8"}],"name":"AnEvent","type":"event"}]' # noqa: E501 (line-too-long) ) # pylint: disable=too-many-lines diff --git a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts index 878fc99b90..634b05bb29 100644 --- a/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts +++ b/packages/abi-gen/test-cli/expected-output/typescript/abi_gen_dummy.ts @@ -157,6 +157,66 @@ export class AbiGenDummyContract extends BaseContract { return abiDecodedReturnData; }, }; + public simpleInputSimpleOutput = { + async callAsync( + index_0: BigNumber, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isBigNumber('index_0', index_0); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('simpleInputSimpleOutput(uint256)', [index_0]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('simpleInputSimpleOutput(uint256)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(index_0: BigNumber): string { + assert.isBigNumber('index_0', index_0); + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments('simpleInputSimpleOutput(uint256)', [ + index_0, + ]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(returnData: string): BigNumber { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('simpleInputSimpleOutput(uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData(returnData: string): BigNumber { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('simpleInputSimpleOutput(uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; public withdraw = { async sendTransactionAsync(wad: BigNumber, txData?: Partial | undefined): Promise { assert.isBigNumber('wad', wad); @@ -271,6 +331,77 @@ export class AbiGenDummyContract extends BaseContract { return abiDecodedReturnData; }, }; + public multiInputMultiOutput = { + async callAsync( + index_0: BigNumber, + index_1: string, + index_2: string, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<[string, string, string]> { + assert.isBigNumber('index_0', index_0); + assert.isString('index_1', index_1); + assert.isString('index_2', index_2); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('multiInputMultiOutput(uint256,bytes,string)', [ + index_0, + index_1, + index_2, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('multiInputMultiOutput(uint256,bytes,string)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<[string, string, string]>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(index_0: BigNumber, index_1: string, index_2: string): string { + assert.isBigNumber('index_0', index_0); + assert.isString('index_1', index_1); + assert.isString('index_2', index_2); + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'multiInputMultiOutput(uint256,bytes,string)', + [index_0, index_1, index_2], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(returnData: string): [string, string, string] { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('multiInputMultiOutput(uint256,bytes,string)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode<[string, string, string]>(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData(returnData: string): [string, string, string] { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('multiInputMultiOutput(uint256,bytes,string)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<[string, string, string]>(returnData); + return abiDecodedReturnData; + }, + }; public ecrecoverFn = { async callAsync( hash: string, @@ -400,6 +531,58 @@ export class AbiGenDummyContract extends BaseContract { return abiDecodedReturnData; }, }; + public noInputSimpleOutput = { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('noInputSimpleOutput()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('noInputSimpleOutput()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(): string { + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments('noInputSimpleOutput()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(returnData: string): BigNumber { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('noInputSimpleOutput()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData(returnData: string): BigNumber { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('noInputSimpleOutput()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; public revertWithConstant = { async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ @@ -881,6 +1064,143 @@ export class AbiGenDummyContract extends BaseContract { return abiDecodedReturnData; }, }; + public complexInputComplexOutput = { + async callAsync( + complexInput: { foo: BigNumber; bar: string; car: string }, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise<{ + input: { foo: BigNumber; bar: string; car: string }; + lorem: string; + ipsum: string; + dolor: string; + }> { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('complexInputComplexOutput((uint256,bytes,string))', [ + complexInput, + ]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('complexInputComplexOutput((uint256,bytes,string))'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue<{ + input: { foo: BigNumber; bar: string; car: string }; + lorem: string; + ipsum: string; + dolor: string; + }>(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(complexInput: { foo: BigNumber; bar: string; car: string }): string { + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments( + 'complexInputComplexOutput((uint256,bytes,string))', + [complexInput], + ); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData( + returnData: string, + ): { input: { foo: BigNumber; bar: string; car: string }; lorem: string; ipsum: string; dolor: string } { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('complexInputComplexOutput((uint256,bytes,string))'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode<{ + input: { foo: BigNumber; bar: string; car: string }; + lorem: string; + ipsum: string; + dolor: string; + }>(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData( + returnData: string, + ): { input: { foo: BigNumber; bar: string; car: string }; lorem: string; ipsum: string; dolor: string } { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('complexInputComplexOutput((uint256,bytes,string))'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue<{ + input: { foo: BigNumber; bar: string; car: string }; + lorem: string; + ipsum: string; + dolor: string; + }>(returnData); + return abiDecodedReturnData; + }, + }; + public noInputNoOutput = { + async callAsync(callData: Partial = {}, defaultBlock?: BlockParam): Promise { + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('noInputNoOutput()', []); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('noInputNoOutput()'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(): string { + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments('noInputNoOutput()', []); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(returnData: string): void { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('noInputNoOutput()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData(returnData: string): void { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('noInputNoOutput()'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; public simplePureFunctionWithInput = { async callAsync(x: BigNumber, callData: Partial = {}, defaultBlock?: BlockParam): Promise { assert.isBigNumber('x', x); @@ -1299,6 +1619,64 @@ export class AbiGenDummyContract extends BaseContract { return abiDecodedReturnData; }, }; + public simpleInputNoOutput = { + async callAsync( + index_0: BigNumber, + callData: Partial = {}, + defaultBlock?: BlockParam, + ): Promise { + assert.isBigNumber('index_0', index_0); + assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [ + schemas.addressSchema, + schemas.numberSchema, + schemas.jsNumber, + ]); + if (defaultBlock !== undefined) { + assert.isBlockParam('defaultBlock', defaultBlock); + } + const self = (this as any) as AbiGenDummyContract; + const encodedData = self._strictEncodeArguments('simpleInputNoOutput(uint256)', [index_0]); + const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync( + { + to: self.address, + ...callData, + data: encodedData, + }, + self._web3Wrapper.getContractDefaults(), + ); + callDataWithDefaults.from = callDataWithDefaults.from + ? callDataWithDefaults.from.toLowerCase() + : callDataWithDefaults.from; + + const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock); + BaseContract._throwIfRevertWithReasonCallResult(rawCallResult); + const abiEncoder = self._lookupAbiEncoder('simpleInputNoOutput(uint256)'); + // tslint:disable boolean-naming + const result = abiEncoder.strictDecodeReturnValue(rawCallResult); + // tslint:enable boolean-naming + return result; + }, + getABIEncodedTransactionData(index_0: BigNumber): string { + assert.isBigNumber('index_0', index_0); + const self = (this as any) as AbiGenDummyContract; + const abiEncodedTransactionData = self._strictEncodeArguments('simpleInputNoOutput(uint256)', [index_0]); + return abiEncodedTransactionData; + }, + getABIDecodedTransactionData(returnData: string): void { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('simpleInputNoOutput(uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecode(returnData); + return abiDecodedReturnData; + }, + getABIDecodedReturnData(returnData: string): void { + const self = (this as any) as AbiGenDummyContract; + const abiEncoder = self._lookupAbiEncoder('simpleInputNoOutput(uint256)'); + // tslint:disable boolean-naming + const abiDecodedReturnData = abiEncoder.strictDecodeReturnValue(returnData); + return abiDecodedReturnData; + }, + }; private readonly _subscriptionManager: SubscriptionManager; public static async deployFrom0xArtifactAsync( artifact: ContractArtifact | SimpleContractArtifact, @@ -1390,6 +1768,25 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'index_0', + type: 'uint256', + }, + ], + name: 'simpleInputSimpleOutput', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, { constant: false, inputs: [ @@ -1404,6 +1801,41 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'nonpayable', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'index_0', + type: 'uint256', + }, + { + name: 'index_1', + type: 'bytes', + }, + { + name: 'index_2', + type: 'string', + }, + ], + name: 'multiInputMultiOutput', + outputs: [ + { + name: '', + type: 'bytes', + }, + { + name: '', + type: 'bytes', + }, + { + name: '', + type: 'string', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, { constant: true, inputs: [ @@ -1449,6 +1881,20 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: true, + inputs: [], + name: 'noInputSimpleOutput', + outputs: [ + { + name: '', + type: 'uint256', + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, { constant: true, inputs: [], @@ -1599,6 +2045,80 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'nonpayable', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'complexInput', + type: 'tuple', + components: [ + { + name: 'foo', + type: 'uint256', + }, + { + name: 'bar', + type: 'bytes', + }, + { + name: 'car', + type: 'string', + }, + ], + }, + ], + name: 'complexInputComplexOutput', + outputs: [ + { + name: '', + type: 'tuple', + components: [ + { + name: 'input', + type: 'tuple', + components: [ + { + name: 'foo', + type: 'uint256', + }, + { + name: 'bar', + type: 'bytes', + }, + { + name: 'car', + type: 'string', + }, + ], + }, + { + name: 'lorem', + type: 'bytes', + }, + { + name: 'ipsum', + type: 'bytes', + }, + { + name: 'dolor', + type: 'string', + }, + ], + }, + ], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + constant: true, + inputs: [], + name: 'noInputNoOutput', + outputs: [], + payable: false, + stateMutability: 'pure', + type: 'function', + }, { constant: true, inputs: [ @@ -1729,6 +2249,27 @@ export class AbiGenDummyContract extends BaseContract { stateMutability: 'pure', type: 'function', }, + { + constant: true, + inputs: [ + { + name: 'index_0', + type: 'uint256', + }, + ], + name: 'simpleInputNoOutput', + outputs: [], + payable: false, + stateMutability: 'pure', + type: 'function', + }, + { + inputs: [], + outputs: [], + payable: true, + stateMutability: 'payable', + type: 'fallback', + }, { anonymous: false, inputs: [ diff --git a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json index 6150aefefa..490740a071 100644 --- a/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json +++ b/packages/abi-gen/test-cli/fixtures/artifacts/AbiGenDummy.json @@ -26,6 +26,25 @@ "stateMutability": "pure", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "simpleInputSimpleOutput", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": false, "inputs": [ @@ -40,6 +59,41 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + }, + { + "name": "", + "type": "bytes" + }, + { + "name": "", + "type": "string" + } + ], + "name": "multiInputMultiOutput", + "outputs": [ + { + "name": "", + "type": "bytes" + }, + { + "name": "", + "type": "bytes" + }, + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ @@ -85,6 +139,20 @@ "stateMutability": "pure", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "noInputSimpleOutput", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [], @@ -235,6 +303,80 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "components": [ + { + "name": "foo", + "type": "uint256" + }, + { + "name": "bar", + "type": "bytes" + }, + { + "name": "car", + "type": "string" + } + ], + "name": "complexInput", + "type": "tuple" + } + ], + "name": "complexInputComplexOutput", + "outputs": [ + { + "components": [ + { + "components": [ + { + "name": "foo", + "type": "uint256" + }, + { + "name": "bar", + "type": "bytes" + }, + { + "name": "car", + "type": "string" + } + ], + "name": "input", + "type": "tuple" + }, + { + "name": "lorem", + "type": "bytes" + }, + { + "name": "ipsum", + "type": "bytes" + }, + { + "name": "dolor", + "type": "string" + } + ], + "name": "", + "type": "tuple" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "noInputNoOutput", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, { "constant": true, "inputs": [ @@ -365,6 +507,25 @@ "stateMutability": "pure", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "simpleInputNoOutput", + "outputs": [], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, { "anonymous": false, "inputs": [ @@ -403,6 +564,24 @@ "a": "the array of bytes being accepted" } }, + "complexInputComplexOutput((uint256,bytes,string))": { + "details": "Tests decoding when the input and output are complex." + }, + "multiInputMultiOutput(uint256,bytes,string)": { + "details": "Tests decoding when the input and output are complex and have more than one argument." + }, + "noInputNoOutput()": { + "details": "Tests decoding when both input and output are empty." + }, + "noInputSimpleOutput()": { + "details": "Tests decoding when input is empty and output is non-empty." + }, + "simpleInputNoOutput(uint256)": { + "details": "Tests decoding when input is not empty but output is empty." + }, + "simpleInputSimpleOutput(uint256)": { + "details": "Tests decoding when both input and output are non-empty." + }, "structOutput()": { "details": "a method that returns a struct", "return": "a Struct struct" @@ -412,15 +591,15 @@ "evm": { "bytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50610c17806100206000396000f3fe608060405234801561001057600080fd5b50600436106101355760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae1714610227578063d6d7618c14610235578063d88be12f1461024a57610135565b80639a3b618514610217578063a3c2f6b61461021f57610135565b806363d69c88146101ce578063647341eb146101e157806376f15d5b146101ef5780638ee52b4e1461020457610135565b80633e9ef66a1161010957806345fdbdb7116100ee57806345fdbdb7146101a957806359c28add146101b15780635ba3c7c0146101c657610135565b80633e9ef66a146101935780634582eab2146101a157610135565b806209e4371461013a5780630527c28f146101445780632e1a7d4d1461015757806336b323961461016a575b600080fd5b610142610252565b005b610142610152366004610756565b61028d565b6101426101653660046108d0565b610290565b61017d610178366004610793565b6102e1565b60405161018a9190610a18565b60405180910390f35b6101426101523660046107d6565b6101426103c3565b610142610428565b6101b961045a565b60405161018a9190610adf565b610142610465565b61017d6101dc366004610704565b6104ca565b61014261015236600461089b565b6101f76104d3565b60405161018a9190610b52565b6101f76102123660046108d0565b6104e1565b6101426104e7565b6101f76104f2565b61014261015236600461080b565b61023d6104f7565b60405161018a9190610b3f565b6101f76104ff565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610aa8565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516102d69190610b52565b60405180910390a250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016103329291906109f6565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161036d9493929190610a39565b6020604051602081039080840390855afa15801561038f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610a71565b610462610505565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b610462610525565b6104d290565b6040518060a00160405280610518610525565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f830112610563578081fd5b813567ffffffffffffffff811115610579578182fd5b60206105888182840201610b5b565b828152925080830184820160005b848110156105bf576105ad888584358a01016105ca565b83529183019190830190600101610596565b505050505092915050565b600082601f8301126105da578081fd5b813567ffffffffffffffff8111156105f0578182fd5b61062160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5b565b915080825283602082850101111561063857600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610662578081fd5b61066c6080610b5b565b90506000823567ffffffffffffffff80821115610687578283fd5b610693868387016105ca565b84526020850135915063ffffffff821682146106ad578283fd5b81602085015260408501359150808211156106c6578283fd5b6106d286838701610553565b604085015260608501359150808211156106ea578283fd5b506106f7858286016105ca565b6060840152505092915050565b600080600080600060a0868803121561071c57600080fd5b853561072781610bb2565b94506020860135935060408601359250606086013561074581610bb2565b949793965091946080013592915050565b60006020828403121561076857600080fd5b813567ffffffffffffffff81111561077f57600080fd5b61078b84828501610553565b949350505050565b600080600080608085870312156107a957600080fd5b84359350602085013560ff811681146107c157600080fd5b93969395505050506040820135916060013590565b6000602082840312156107e857600080fd5b813567ffffffffffffffff8111156107ff57600080fd5b61078b848285016105ca565b60006020828403121561081c578081fd5b813567ffffffffffffffff80821115610833578283fd5b81840160408187031215610845578384fd5b61084f6040610b5b565b925080358281111561085f578485fd5b61086b87828401610651565b84525060208101358281111561087f578485fd5b61088b878284016105ca565b6020850152509195945050505050565b6000602082840312156108ad57600080fd5b813567ffffffffffffffff8111156108c457600080fd5b61078b84828501610651565b6000602082840312156108e257600080fd5b5035919050565b60008151808452610901816020860160208601610b82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516080845261094860808501826108e9565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b828510156109cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030184526109bb8282516108e9565b600195909501949387019391508601610981565b506060880151955088810360608a01526109e981876108e9565b9998505050505050505050565b60008351610a08818460208801610b82565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610a6a60208301846108e9565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610afb6060840182610933565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610b3681836108e9565b95945050505050565b600060208252610a6a6020830184610933565b90815260200190565b60405181810167ffffffffffffffff81118282101715610b7a57600080fd5b604052919050565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461028d57600080fdfea365627a7a723058201a16b3cd19a115b5cfe3a42e5ddcd7a41b75f4a376a121a647cd429cbbf546266c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC17 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x135 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x24A JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x21F JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x204 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x109 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x1C6 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x1A1 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x157 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x16A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x142 PUSH2 0x252 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x756 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST PUSH2 0x142 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x178 CALLDATASIZE PUSH1 0x4 PUSH2 0x793 JUMP JUMPDEST PUSH2 0x2E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x3C3 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x428 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x142 PUSH2 0x465 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x1DC CALLDATASIZE PUSH1 0x4 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4CA JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x212 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4F2 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x80B JUMP JUMPDEST PUSH2 0x23D PUSH2 0x4F7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB3F JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2D6 SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x332 SWAP3 SWAP2 SWAP1 PUSH2 0x9F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x36D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xA71 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x505 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x525 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x518 PUSH2 0x525 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x563 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x579 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x588 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xB5B JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH2 0x5AD DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x5CA JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x596 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x621 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xB5B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x662 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x66C PUSH1 0x80 PUSH2 0xB5B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x687 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x693 DUP7 DUP4 DUP8 ADD PUSH2 0x5CA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x6AD JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6C6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x6D2 DUP7 DUP4 DUP8 ADD PUSH2 0x553 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6EA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x6F7 DUP6 DUP3 DUP7 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x71C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x727 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x745 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x77F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x553 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x81C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x833 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x845 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x84F PUSH1 0x40 PUSH2 0xB5B JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x85F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x86B DUP8 DUP3 DUP5 ADD PUSH2 0x651 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x87F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x88B DUP8 DUP3 DUP5 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x651 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x901 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x948 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x9CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x9BB DUP3 DUP3 MLOAD PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x981 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x9E9 DUP2 DUP8 PUSH2 0x8E9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xA08 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8E9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xAFB PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x933 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xB36 DUP2 DUP4 PUSH2 0x8E9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x933 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB85 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBAC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 BYTE AND 0xb3 0xcd NOT LOG1 ISZERO 0xb5 0xcf 0xe3 LOG4 0x2e 0x5d 0xdc 0xd7 LOG4 SHL PUSH22 0xF4A376A121A647CD429CBBF546266C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050A00400000000000000000000000 ", - "sourceMap": "641:2908:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2908:0;;;;;;;" + "object": "0x608060405234801561001057600080fd5b50611223806100206000396000f3fe60806040526004361061018a5760003560e01c806363d69c88116100d65780639a3b61851161007f578063d6d7618c11610059578063d6d7618c14610420578063d88be12f14610442578063ee8b86fb146104575761018a565b80639a3b6185146103db578063a3c2f6b6146103f0578063ae2dae17146104055761018a565b80637833bec0116100b05780637833bec0146103795780637a791e6e146103a65780638ee52b4e146103bb5761018a565b806363d69c8814610329578063647341eb1461034957806376f15d5b146103645761018a565b80633e9ef66a1161013857806345fdbdb71161011257806345fdbdb7146102dd57806359c28add146102f25780635ba3c7c0146103145761018a565b80633e9ef66a146102985780634303a542146102b35780634582eab2146102c85761018a565b80632e1a7d4d116101695780632e1a7d4d1461021c5780633687617d1461023c57806336b323961461026b5761018a565b806209e437146101af5780630527c28f146101c65780631310e444146101e6575b30366000803760008036600080855af13d6000803e806101a9573d6000fd5b503d6000f35b3480156101bb57600080fd5b506101c4610477565b005b3480156101d257600080fd5b506101c46101e1366004610b39565b6104b4565b3480156101f257600080fd5b50610206610201366004610d4d565b6104b7565b604051610213919061115e565b60405180910390f35b34801561022857600080fd5b506101c4610237366004610d4d565b6104be565b34801561024857600080fd5b5061025c610257366004610d66565b61050f565b60405161021393929190610f3e565b34801561027757600080fd5b5061028b610286366004610b76565b6105af565b6040516102139190610eff565b3480156102a457600080fd5b506101c46101e1366004610bb9565b3480156102bf57600080fd5b50610206610691565b3480156102d457600080fd5b506101c4610698565b3480156102e957600080fd5b506101c46106fd565b3480156102fe57600080fd5b5061030761072f565b60405161021391906110f4565b34801561032057600080fd5b506101c4610737565b34801561033557600080fd5b5061028b610344366004610ae7565b61079c565b34801561035557600080fd5b506101c46101e1366004610d18565b34801561037057600080fd5b506102066107a5565b34801561038557600080fd5b50610399610394366004610bee565b6107b3565b6040516102139190611008565b3480156103b257600080fd5b506101c4610870565b3480156103c757600080fd5b506102066103d6366004610d4d565b610875565b3480156103e757600080fd5b506101c461087b565b3480156103fc57600080fd5b50610206610886565b34801561041157600080fd5b506101c46101e1366004610c88565b34801561042c57600080fd5b5061043561088b565b604051610213919061114b565b34801561044e57600080fd5b50610206610893565b34801561046357600080fd5b506101c4610472366004610d4d565b6101e1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a990610fd1565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610504919061115e565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001610600929190610edd565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161063b9493929190610f20565b6020604051602081039080840390855afa15801561065d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526104a99190600401610f80565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a990610f9a565b610695610899565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526104a99190600401610f80565b50929392505050565b600080546001019081905590565b6107bb6108b9565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6104b2565b60010190565b600080546001019055565b600190565b6106956108e7565b6104d290565b6040518060a001604052806108ac6108e7565b8152602001606081525090565b6040518060c001604052806108cc610915565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610946578081fd5b813567ffffffffffffffff81111561095c578182fd5b602061096b8182840201611167565b828152925080830184820160005b848110156109a257610990888584358a01016109ad565b83529183019190830190600101610979565b505050505092915050565b600082601f8301126109bd578081fd5b813567ffffffffffffffff8111156109d3578182fd5b610a0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611167565b9150808252836020828501011115610a1b57600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610a45578081fd5b610a4f6080611167565b90506000823567ffffffffffffffff80821115610a6a578283fd5b610a76868387016109ad565b84526020850135915063ffffffff82168214610a90578283fd5b8160208501526040850135915080821115610aa9578283fd5b610ab586838701610936565b60408501526060850135915080821115610acd578283fd5b50610ada858286016109ad565b6060840152505092915050565b600080600080600060a08688031215610aff57600080fd5b8535610b0a816111be565b945060208601359350604086013592506060860135610b28816111be565b949793965091946080013592915050565b600060208284031215610b4b57600080fd5b813567ffffffffffffffff811115610b6257600080fd5b610b6e84828501610936565b949350505050565b60008060008060808587031215610b8c57600080fd5b84359350602085013560ff81168114610ba457600080fd5b93969395505050506040820135916060013590565b600060208284031215610bcb57600080fd5b813567ffffffffffffffff811115610be257600080fd5b610b6e848285016109ad565b600060208284031215610bff578081fd5b813567ffffffffffffffff80821115610c16578283fd5b81840160608187031215610c28578384fd5b610c326060611167565b925080358352602081013582811115610c49578485fd5b610c55878284016109ad565b602085015250604081013582811115610c6c578485fd5b610c78878284016109ad565b6040850152509195945050505050565b600060208284031215610c99578081fd5b813567ffffffffffffffff80821115610cb0578283fd5b81840160408187031215610cc2578384fd5b610ccc6040611167565b9250803582811115610cdc578485fd5b610ce887828401610a34565b845250602081013582811115610cfc578485fd5b610d08878284016109ad565b6020850152509195945050505050565b600060208284031215610d2a57600080fd5b813567ffffffffffffffff811115610d4157600080fd5b610b6e84828501610a34565b600060208284031215610d5f57600080fd5b5035919050565b600080600060608486031215610d7a578081fd5b83359250602084013567ffffffffffffffff80821115610d98578283fd5b610da4878388016109ad565b93506040860135915080821115610db9578283fd5b50610dc6868287016109ad565b9150509250925092565b60008151808452610de881602086016020860161118e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610e2f6080850182610dd0565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610eb6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610ea2828251610dd0565b600195909501949387019391508601610e68565b506060880151955088810360608a0152610ed08187610dd0565b9998505050505050505050565b60008351610eef81846020880161118e565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060608252610f516060830186610dd0565b8281036020840152610f638186610dd0565b8381036040850152610f758186610dd0565b979650505050505050565b600060208252610f936020830184610dd0565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c0850152611038610100850182610dd0565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526110738183610dd0565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160408601526110b18383610dd0565b60408701519350818682030160608701526110cc8185610dd0565b9250506060860151925080858303016080860152506110eb8183610dd0565b95945050505050565b6000602082528251604060208401526111106060840182610e1a565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526110eb8183610dd0565b600060208252610f936020830184610e1a565b90815260200190565b60405181810167ffffffffffffffff8111828210171561118657600080fd5b604052919050565b60005b838110156111a9578181015183820152602001611191565b838111156111b8576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146104b457600080fdfea365627a7a72305820214ed1004da86e532abdc631c468eb8b4c65f3074a142b32dbb702a7fe6b9cdf6c6578706572696d656e74616cf564736f6c634300050a0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1223 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18A JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD6D7618C GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x420 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x457 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x405 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x7833BEC0 GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x379 JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x3BB JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x329 JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x364 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x314 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0x4303A542 EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x2C8 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x26B JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1E6 JUMPI JUMPDEST ADDRESS CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP1 DUP6 GAS CALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x1A9 JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x477 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xB39 JUMP JUMPDEST PUSH2 0x4B4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x4B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x115E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x4BE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25C PUSH2 0x257 CALLDATASIZE PUSH1 0x4 PUSH2 0xD66 JUMP JUMPDEST PUSH2 0x50F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF3E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0xB76 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0xEFF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xBB9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x691 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x698 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x6FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x72F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x10F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x320 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x737 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x344 CALLDATASIZE PUSH1 0x4 PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x79C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x7A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x385 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x399 PUSH2 0x394 CALLDATASIZE PUSH1 0x4 PUSH2 0xBEE JUMP JUMPDEST PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x1008 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x870 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3D6 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x875 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x87B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x886 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xC88 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x435 PUSH2 0x88B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x114B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x893 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x472 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4A9 SWAP1 PUSH2 0xFD1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x504 SWAP2 SWAP1 PUSH2 0x115E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x600 SWAP3 SWAP2 SWAP1 PUSH2 0xEDD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x63B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF20 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x65D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x4A9 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xF80 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4A9 SWAP1 PUSH2 0xF9A JUMP JUMPDEST PUSH2 0x695 PUSH2 0x899 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x4A9 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xF80 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x7BB PUSH2 0x8B9 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x4B2 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x695 PUSH2 0x8E7 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x8AC PUSH2 0x8E7 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x8CC PUSH2 0x915 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x946 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x95C JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x96B DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1167 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x9A2 JUMPI PUSH2 0x990 DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x9AD JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x979 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x9BD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9D3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xA04 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1167 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xA1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA45 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xA4F PUSH1 0x80 PUSH2 0x1167 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA6A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xA76 DUP7 DUP4 DUP8 ADD PUSH2 0x9AD JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xA90 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xAA9 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xAB5 DUP7 DUP4 DUP8 ADD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xACD JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xADA DUP6 DUP3 DUP7 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xAFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xB0A DUP2 PUSH2 0x11BE JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xB28 DUP2 PUSH2 0x11BE JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0x936 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xB8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBFF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC16 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xC28 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xC32 PUSH1 0x60 PUSH2 0x1167 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xC49 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xC55 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xC6C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xC78 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC99 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xCB0 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xCC2 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xCCC PUSH1 0x40 PUSH2 0x1167 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xCDC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xCE8 DUP8 DUP3 DUP5 ADD PUSH2 0xA34 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xCFC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD08 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xD7A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD98 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xDA4 DUP8 DUP4 DUP9 ADD PUSH2 0x9AD JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xDB9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xDC6 DUP7 DUP3 DUP8 ADD PUSH2 0x9AD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xDE8 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x118E JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xE2F PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xEB6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xEA2 DUP3 DUP3 MLOAD PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xE68 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xED0 DUP2 DUP8 PUSH2 0xDD0 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xEEF DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x118E JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0xF51 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xDD0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xF63 DUP2 DUP7 PUSH2 0xDD0 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xF75 DUP2 DUP7 PUSH2 0xDD0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xF93 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xDD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x1038 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x1073 DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x10B1 DUP4 DUP4 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x10CC DUP2 DUP6 PUSH2 0xDD0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x10EB DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1110 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10EB DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xF93 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xE1A JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1191 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11B8 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 0x21 0x4e 0xd1 STOP 0x4d 0xa8 PUSH15 0x532ABDC631C468EB8B4C65F3074A14 0x2b ORIGIN 0xdb 0xb7 MUL 0xa7 INVALID PUSH12 0x9CDF6C6578706572696D656E PUSH21 0x616CF564736F6C634300050A004000000000000000 ", + "sourceMap": "641:6433:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:6433:0;;;;;;;" }, "deployedBytecode": { "linkReferences": {}, - "object": "0x608060405234801561001057600080fd5b50600436106101355760003560e01c806363d69c88116100b25780639a3b618511610081578063ae2dae1711610066578063ae2dae1714610227578063d6d7618c14610235578063d88be12f1461024a57610135565b80639a3b618514610217578063a3c2f6b61461021f57610135565b806363d69c88146101ce578063647341eb146101e157806376f15d5b146101ef5780638ee52b4e1461020457610135565b80633e9ef66a1161010957806345fdbdb7116100ee57806345fdbdb7146101a957806359c28add146101b15780635ba3c7c0146101c657610135565b80633e9ef66a146101935780634582eab2146101a157610135565b806209e4371461013a5780630527c28f146101445780632e1a7d4d1461015757806336b323961461016a575b600080fd5b610142610252565b005b610142610152366004610756565b61028d565b6101426101653660046108d0565b610290565b61017d610178366004610793565b6102e1565b60405161018a9190610a18565b60405180910390f35b6101426101523660046107d6565b6101426103c3565b610142610428565b6101b961045a565b60405161018a9190610adf565b610142610465565b61017d6101dc366004610704565b6104ca565b61014261015236600461089b565b6101f76104d3565b60405161018a9190610b52565b6101f76102123660046108d0565b6104e1565b6101426104e7565b6101f76104f2565b61014261015236600461080b565b61023d6104f7565b60405161018a9190610b3f565b6101f76104ff565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610aa8565b60405180910390fd5b50565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040516102d69190610b52565b60405180910390a250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081876040516020016103329291906109f6565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161036d9493929190610a39565b6020604051602081039080840390855afa15801561038f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028490610a71565b610462610505565b90565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526102849190600401610a57565b50929392505050565b600080546001019081905590565b60010190565b600080546001019055565b600190565b610462610525565b6104d290565b6040518060a00160405280610518610525565b8152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b600082601f830112610563578081fd5b813567ffffffffffffffff811115610579578182fd5b60206105888182840201610b5b565b828152925080830184820160005b848110156105bf576105ad888584358a01016105ca565b83529183019190830190600101610596565b505050505092915050565b600082601f8301126105da578081fd5b813567ffffffffffffffff8111156105f0578182fd5b61062160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610b5b565b915080825283602082850101111561063857600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610662578081fd5b61066c6080610b5b565b90506000823567ffffffffffffffff80821115610687578283fd5b610693868387016105ca565b84526020850135915063ffffffff821682146106ad578283fd5b81602085015260408501359150808211156106c6578283fd5b6106d286838701610553565b604085015260608501359150808211156106ea578283fd5b506106f7858286016105ca565b6060840152505092915050565b600080600080600060a0868803121561071c57600080fd5b853561072781610bb2565b94506020860135935060408601359250606086013561074581610bb2565b949793965091946080013592915050565b60006020828403121561076857600080fd5b813567ffffffffffffffff81111561077f57600080fd5b61078b84828501610553565b949350505050565b600080600080608085870312156107a957600080fd5b84359350602085013560ff811681146107c157600080fd5b93969395505050506040820135916060013590565b6000602082840312156107e857600080fd5b813567ffffffffffffffff8111156107ff57600080fd5b61078b848285016105ca565b60006020828403121561081c578081fd5b813567ffffffffffffffff80821115610833578283fd5b81840160408187031215610845578384fd5b61084f6040610b5b565b925080358281111561085f578485fd5b61086b87828401610651565b84525060208101358281111561087f578485fd5b61088b878284016105ca565b6020850152509195945050505050565b6000602082840312156108ad57600080fd5b813567ffffffffffffffff8111156108c457600080fd5b61078b84828501610651565b6000602082840312156108e257600080fd5b5035919050565b60008151808452610901816020860160208601610b82565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600081516080845261094860808501826108e9565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b828510156109cf577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030184526109bb8282516108e9565b600195909501949387019391508601610981565b506060880151955088810360608a01526109e981876108e9565b9998505050505050505050565b60008351610a08818460208801610b82565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610a6a60208301846108e9565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160406020840152610afb6060840182610933565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152610b3681836108e9565b95945050505050565b600060208252610a6a6020830184610933565b90815260200190565b60405181810167ffffffffffffffff81118282101715610b7a57600080fd5b604052919050565b60005b83811015610b9d578181015183820152602001610b85565b83811115610bac576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461028d57600080fdfea365627a7a723058201a16b3cd19a115b5cfe3a42e5ddcd7a41b75f4a376a121a647cd429cbbf546266c6578706572696d656e74616cf564736f6c634300050a0040", - "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x135 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xB2 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x81 JUMPI DUP1 PUSH4 0xAE2DAE17 GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x235 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x24A JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x21F JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x1CE JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x1EF JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x204 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x109 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0xEE JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x1B1 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x1C6 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x1A1 JUMPI PUSH2 0x135 JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x13A JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x144 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x157 JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x16A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x142 PUSH2 0x252 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x756 JUMP JUMPDEST PUSH2 0x28D JUMP JUMPDEST PUSH2 0x142 PUSH2 0x165 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x290 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x178 CALLDATASIZE PUSH1 0x4 PUSH2 0x793 JUMP JUMPDEST PUSH2 0x2E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xA18 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x7D6 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x3C3 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x428 JUMP JUMPDEST PUSH2 0x1B9 PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xADF JUMP JUMPDEST PUSH2 0x142 PUSH2 0x465 JUMP JUMPDEST PUSH2 0x17D PUSH2 0x1DC CALLDATASIZE PUSH1 0x4 PUSH2 0x704 JUMP JUMPDEST PUSH2 0x4CA JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x89B JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4D3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x212 CALLDATASIZE PUSH1 0x4 PUSH2 0x8D0 JUMP JUMPDEST PUSH2 0x4E1 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x4E7 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4F2 JUMP JUMPDEST PUSH2 0x142 PUSH2 0x152 CALLDATASIZE PUSH1 0x4 PUSH2 0x80B JUMP JUMPDEST PUSH2 0x23D PUSH2 0x4F7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x18A SWAP2 SWAP1 PUSH2 0xB3F JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x4FF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xAA8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x2D6 SWAP2 SWAP1 PUSH2 0xB52 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x332 SWAP3 SWAP2 SWAP1 PUSH2 0x9F6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x36D SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xA39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x38F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x284 SWAP1 PUSH2 0xA71 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x505 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x284 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xA57 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x462 PUSH2 0x525 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x518 PUSH2 0x525 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x563 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x579 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x588 DUP2 DUP3 DUP5 MUL ADD PUSH2 0xB5B JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x5BF JUMPI PUSH2 0x5AD DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x5CA JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x596 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x5DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5F0 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x621 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0xB5B JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x662 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x66C PUSH1 0x80 PUSH2 0xB5B JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x687 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x693 DUP7 DUP4 DUP8 ADD PUSH2 0x5CA JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0x6AD JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6C6 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x6D2 DUP7 DUP4 DUP8 ADD PUSH2 0x553 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x6EA JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0x6F7 DUP6 DUP3 DUP7 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x71C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0x727 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0x745 DUP2 PUSH2 0xBB2 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x77F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x553 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x7C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x7E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x7FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x81C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x833 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0x845 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x84F PUSH1 0x40 PUSH2 0xB5B JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x85F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x86B DUP8 DUP3 DUP5 ADD PUSH2 0x651 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0x87F JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0x88B DUP8 DUP3 DUP5 ADD PUSH2 0x5CA JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x78B DUP5 DUP3 DUP6 ADD PUSH2 0x651 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x8E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x901 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xB82 JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0x948 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0x9CF JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0x9BB DUP3 DUP3 MLOAD PUSH2 0x8E9 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0x981 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0x9E9 DUP2 DUP8 PUSH2 0x8E9 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xA08 DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0xB82 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x8E9 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xAFB PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0x933 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xB36 DUP2 DUP4 PUSH2 0x8E9 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xA6A PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x933 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xB7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB85 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xBAC JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 BYTE AND 0xb3 0xcd NOT LOG1 ISZERO 0xb5 0xcf 0xe3 LOG4 0x2e 0x5d 0xdc 0xd7 LOG4 SHL PUSH22 0xF4A376A121A647CD429CBBF546266C6578706572696D PUSH6 0x6E74616CF564 PUSH20 0x6F6C634300050A00400000000000000000000000 ", - "sourceMap": "641:2908:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;641:2908:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:107;;;:::i;:::-;;2732:63;;;;;;;;;:::i;2127:84::-;;;;;;;;;:::i;1726:334::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2570:52;;;;;;;1389:101;;;:::i;1286:97::-;;;:::i;3302:73::-;;;:::i;:::-;;;;;;;;1609:111;;;:::i;2365:166::-;;;;;;;;;:::i;2941:52::-;;;;;;;3401:72;;;:::i;:::-;;;;;;;;989:140;;;;;;;;;:::i;3478:69::-;;;:::i;862:121::-;;;:::i;3233:64::-;;;;;;;3075:63;;;:::i;:::-;;;;;;;;1135:145;;;:::i;1496:107::-;1564:32;;;;;;;;;;;;;;;;;;;2732:63;;:::o;2127:84::-;2188:10;2177:27;;;2200:3;2177:27;;;;;;;;;;;;;;;2127:84;:::o;1726:334::-;1837:21;1874:19;:56;;;;;;;;;;;;;;;;;;;1940:20;1990:6;1998:4;1973:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1973:30:0;;;1963:41;;;;;;1940:64;;2021:32;2031:12;2045:1;2048;2051;2021:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2021:32:0;;;;;;1726:334;-1:-1:-1;;;;;;;;1726:334:0:o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;3302:73;3352:19;;:::i;:::-;3302:73;:::o;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2365:166;-1:-1:-1;2523:1:0;;2365:166;-1:-1:-1;;;2365:166:0:o;3401:72::-;3441:4;3456:14;;3469:1;3456:14;;;;;3401:72;:::o;989:140::-;1117:1;:5;;989:140::o;3478:69::-;3530:9;:14;;3543:1;3530:14;;;3478:69::o;862:121::-;975:1;862:121;:::o;3075:63::-;3119:15;;:::i;1135:145::-;711:4;1135:145;:::o;641:2908::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;20177:18;20169:6;20166:30;20163:2;;;-1:-1;;20199:12;20163:2;20244:4;353:81;20307:4;20244;20236:6;20232:17;20297:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;20784:18;20776:6;20773:30;20770:2;;;-1:-1;;20806:12;20770:2;1880:60;20947:4;20879:9;1796:4;20864:6;20860:17;20856:33;20937:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;20947:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;23898:6;20947:4;1988:6;1984:17;20947:4;2022:5;2018:16;23875:30;23954:1;23936:16;;;20947:4;23936:16;23929:27;2022:5;1763:375;-1:-1;;1763:375;3796:1071;;3904:4;3892:9;3887:3;3883:19;3879:30;3876:2;;;-1:-1;;3912:12;3876:2;3940:20;3904:4;3940:20;;;3931:29;;4043:1;4028:17;4015:31;4066:18;;4058:6;4055:30;4052:2;;;4098:1;4095;4088:12;4052:2;4132:54;4182:3;4173:6;4162:9;4158:22;4132:54;;;4115:15;4108:79;4253:2;4310:9;4306:22;6191:20;6182:29;;23705:10;24890:5;23694:22;24866:5;24863:34;24853:2;;24911:1;24908;24901:12;24853:2;4286:48;4253:2;4272:5;4268:16;4261:74;4440:2;4429:9;4425:18;4412:32;4398:46;;4464:18;4456:6;4453:30;4450:2;;;4496:1;4493;4486:12;4450:2;4531:75;4602:3;4593:6;4582:9;4578:22;4531:75;;;4440:2;4517:5;4513:16;4506:101;4699:2;4688:9;4684:18;4671:32;4657:46;;4723:18;4715:6;4712:30;4709:2;;;4755:1;4752;4745:12;4709:2;;4790:55;4841:3;4832:6;4821:9;4817:22;4790:55;;;4699:2;4776:5;4772:16;4765:81;;;3870:997;;;;;6393:743;;;;;;6565:3;6553:9;6544:7;6540:23;6536:33;6533:2;;;-1:-1;;6572:12;6533:2;85:6;72:20;97:33;124:5;97:33;;;6624:63;-1:-1;6724:2;6763:22;;6055:20;;-1:-1;6832:2;6871:22;;6055:20;;-1:-1;6940:2;6979:22;;72:20;97:33;72:20;97:33;;;6527:609;;;;-1:-1;6527:609;;7048:3;7088:22;6055:20;;6527:609;-1:-1;;6527:609;7143:387;;7277:2;7265:9;7256:7;7252:23;7248:32;7245:2;;;-1:-1;;7283:12;7245:2;7341:17;7328:31;7379:18;7371:6;7368:30;7365:2;;;-1:-1;;7401:12;7365:2;7431:83;7506:7;7497:6;7486:9;7482:22;7431:83;;;7421:93;7239:291;-1:-1;;;;7239:291;7537:613;;;;;7690:3;7678:9;7669:7;7665:23;7661:33;7658:2;;;-1:-1;;7697:12;7658:2;1648:6;1635:20;7749:63;;7849:2;7890:9;7886:22;6325:20;23799:4;25010:5;23788:16;24987:5;24984:33;24974:2;;-1:-1;;25021:12;24974:2;7652:498;;7857:61;;-1:-1;;;;7955:2;7994:22;;1635:20;;8063:2;8102:22;1635:20;;7652:498;8157:345;;8270:2;8258:9;8249:7;8245:23;8241:32;8238:2;;;-1:-1;;8276:12;8238:2;8334:17;8321:31;8372:18;8364:6;8361:30;8358:2;;;-1:-1;;8394:12;8358:2;8424:62;8478:7;8469:6;8458:9;8454:22;8424:62;;8509:385;;8642:2;8630:9;8621:7;8617:23;8613:32;8610:2;;;8658:1;8655;8648:12;8610:2;8706:17;8693:31;8744:18;;8736:6;8733:30;8730:2;;;8776:1;8773;8766:12;8730:2;8861:6;8850:9;8846:22;3194:4;3182:9;3177:3;3173:19;3169:30;3166:2;;;3212:1;3209;3202:12;3166:2;3230:20;3194:4;3230:20;;;3221:29;;3320:17;3307:31;3358:18;3350:6;3347:30;3344:2;;;3390:1;3387;3380:12;3344:2;3424:68;3488:3;3479:6;3468:9;3464:22;3424:68;;;3407:15;3400:93;;8642:2;3578:9;3574:18;3561:32;3613:18;3605:6;3602:30;3599:2;;;3645:1;3642;3635:12;3599:2;3680:55;3731:3;3722:6;3711:9;3707:22;3680:55;;;8642:2;3662:16;;3655:81;-1:-1;3666:5;;8604:290;-1:-1;;;;;8604:290;8901:373;;9028:2;9016:9;9007:7;9003:23;8999:32;8996:2;;;-1:-1;;9034:12;8996:2;9092:17;9079:31;9130:18;9122:6;9119:30;9116:2;;;-1:-1;;9152:12;9116:2;9182:76;9250:7;9241:6;9230:9;9226:22;9182:76;;9281:241;;9385:2;9373:9;9364:7;9360:23;9356:32;9353:2;;;-1:-1;;9391:12;9353:2;-1:-1;6055:20;;9347:175;-1:-1;9347:175;11364:315;;11488:5;21885:12;22545:6;22540:3;22533:19;11571:52;11616:6;22582:4;22577:3;22573:14;22582:4;11597:5;11593:16;11571:52;;;24416:2;24396:14;24412:7;24392:28;11635:39;;;;22582:4;11635:39;;11440:239;-1:-1;;11440:239;13930:1078;;14154:15;14148:22;14077:4;14190:13;14183:37;14235:67;14077:4;14072:3;14068:14;14283:12;14235:67;;;14392:4;;;23705:10;14392:4;14385:5;14381:16;14375:23;23694:22;14459:4;14454:3;14450:14;16326:36;14560:4;14553:5;14549:16;14543:23;14612:3;14606:4;14602:14;14560:4;14590:3;14586:14;14579:38;14632:109;10052:5;21885:12;22545:6;22540:3;22533:19;22582:4;22577:3;22573:14;10064:88;;14392:4;10217;10209:6;10205:17;22577:3;10196:27;;21747:4;10295:5;21738:14;-1:-1;10340:10;;10334:341;10359:6;10356:1;10353:13;10334:341;;;10411:20;22577:3;10415:4;10411:20;;10406:3;10399:33;9641:60;9697:3;10466:6;10460:13;9641:60;;;10381:1;10374:9;;;;;10654:14;;;;10480:82;-1:-1;22393:14;;10334:341;;;10338:14;14829:4;14822:5;14818:16;14812:23;14792:43;;14881:3;14875:4;14871:14;14829:4;14859:3;14855:14;14848:38;14901:69;14965:4;14951:12;14901:69;;;14992:11;14050:958;-1:-1;;;;;;;;;14050:958;16488:401;;11161:5;21885:12;11272:52;11317:6;11312:3;11305:4;11298:5;11294:16;11272:52;;;11336:16;;;;10793:37;;;-1:-1;11305:4;16852:12;;16641:248;-1:-1;16641:248;16896:213;23499:42;23488:54;;;;9786:37;;17014:2;16999:18;;16985:124;17116:539;10793:37;;;23799:4;23788:16;;;;17475:2;17460:18;;16441:35;17558:2;17543:18;;10793:37;17641:2;17626:18;;10793:37;17314:3;17299:19;;17285:370;17662:293;;17796:2;17817:17;17810:47;17871:74;17796:2;17785:9;17781:18;17931:6;17871:74;;;17863:82;17767:188;-1:-1;;;17767:188;17962:407;18153:2;18167:47;;;12583:2;18138:18;;;22533:19;12619:66;22573:14;;;12599:87;12705:12;;;18124:245;18376:407;18567:2;18581:47;;;12956:2;18552:18;;;22533:19;12992:66;22573:14;;;12972:87;13078:12;;;18538:245;18790:377;;18966:2;18987:17;18980:47;13415:15;13409:22;13336:4;18966:2;18955:9;18951:18;13444:37;13496:95;13327:14;18955:9;13327:14;13572:12;13496:95;;;18966:2;13676:5;13672:16;13666:23;13646:43;;13725:14;18955:9;13729:4;13725:14;;13336:4;18955:9;13709:14;13702:38;13755:69;13819:4;13805:12;13755:69;;;19033:124;18937:230;-1:-1;;;;;18937:230;19174:353;;19338:2;19359:17;19352:47;19413:104;19338:2;19327:9;19323:18;19503:6;19413:104;;19534:213;10793:37;;;19652:2;19637:18;;19623:124;19754:256;19816:2;19810:9;19842:17;;;19917:18;19902:34;;19938:22;;;19899:62;19896:2;;;19974:1;;19964:12;19896:2;19816;19983:22;19794:216;;-1:-1;19794:216;23971:268;24036:1;24043:101;24057:6;24054:1;24051:13;24043:101;;;24124:11;;;24118:18;24105:11;;;24098:39;24079:2;24072:10;24043:101;;;24159:6;24156:1;24153:13;24150:2;;;24036:1;24215:6;24210:3;24206:16;24199:27;24150:2;;24020:219;;;;24433:117;23499:42;24520:5;23488:54;24495:5;24492:35;24482:2;;24541:1;;24531:12" + "object": "0x60806040526004361061018a5760003560e01c806363d69c88116100d65780639a3b61851161007f578063d6d7618c11610059578063d6d7618c14610420578063d88be12f14610442578063ee8b86fb146104575761018a565b80639a3b6185146103db578063a3c2f6b6146103f0578063ae2dae17146104055761018a565b80637833bec0116100b05780637833bec0146103795780637a791e6e146103a65780638ee52b4e146103bb5761018a565b806363d69c8814610329578063647341eb1461034957806376f15d5b146103645761018a565b80633e9ef66a1161013857806345fdbdb71161011257806345fdbdb7146102dd57806359c28add146102f25780635ba3c7c0146103145761018a565b80633e9ef66a146102985780634303a542146102b35780634582eab2146102c85761018a565b80632e1a7d4d116101695780632e1a7d4d1461021c5780633687617d1461023c57806336b323961461026b5761018a565b806209e437146101af5780630527c28f146101c65780631310e444146101e6575b30366000803760008036600080855af13d6000803e806101a9573d6000fd5b503d6000f35b3480156101bb57600080fd5b506101c4610477565b005b3480156101d257600080fd5b506101c46101e1366004610b39565b6104b4565b3480156101f257600080fd5b50610206610201366004610d4d565b6104b7565b604051610213919061115e565b60405180910390f35b34801561022857600080fd5b506101c4610237366004610d4d565b6104be565b34801561024857600080fd5b5061025c610257366004610d66565b61050f565b60405161021393929190610f3e565b34801561027757600080fd5b5061028b610286366004610b76565b6105af565b6040516102139190610eff565b3480156102a457600080fd5b506101c46101e1366004610bb9565b3480156102bf57600080fd5b50610206610691565b3480156102d457600080fd5b506101c4610698565b3480156102e957600080fd5b506101c46106fd565b3480156102fe57600080fd5b5061030761072f565b60405161021391906110f4565b34801561032057600080fd5b506101c4610737565b34801561033557600080fd5b5061028b610344366004610ae7565b61079c565b34801561035557600080fd5b506101c46101e1366004610d18565b34801561037057600080fd5b506102066107a5565b34801561038557600080fd5b50610399610394366004610bee565b6107b3565b6040516102139190611008565b3480156103b257600080fd5b506101c4610870565b3480156103c757600080fd5b506102066103d6366004610d4d565b610875565b3480156103e757600080fd5b506101c461087b565b3480156103fc57600080fd5b50610206610886565b34801561041157600080fd5b506101c46101e1366004610c88565b34801561042c57600080fd5b5061043561088b565b604051610213919061114b565b34801561044e57600080fd5b50610206610893565b34801561046357600080fd5b506101c4610472366004610d4d565b6101e1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a990610fd1565b60405180910390fd5b565b50565b506107c790565b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610504919061115e565b60405180910390a250565b505060408051808201825260048082527f1234567800000000000000000000000000000000000000000000000000000000602080840191909152835180850185528281527f87654321000000000000000000000000000000000000000000000000000000008183015284518086019095529184527f616d657400000000000000000000000000000000000000000000000000000000908401529093909250565b600060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250905060008187604051602001610600929190610edd565b6040516020818303038152906040528051906020012090506001818787876040516000815260200160405260405161063b9493929190610f20565b6020604051602081039080840390855afa15801561065d573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015198975050505050505050565b6107c75b90565b604080518082018252601481527f5245564552545f574954485f434f4e5354414e54000000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526104a99190600401610f80565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104a990610f9a565b610695610899565b604080518082018252601581527f524551554952455f574954485f434f4e5354414e540000000000000000000000602082015290517f08c379a00000000000000000000000000000000000000000000000000000000081526104a99190600401610f80565b50929392505050565b600080546001019081905590565b6107bb6108b9565b50604080516080810182529182528051808201825260048082527f123456780000000000000000000000000000000000000000000000000000000060208381019190915280850192909252825180840184528181527f87654321000000000000000000000000000000000000000000000000000000008184015284840152825180840190935282527f616d65740000000000000000000000000000000000000000000000000000000090820152606082015290565b6104b2565b60010190565b600080546001019055565b600190565b6106956108e7565b6104d290565b6040518060a001604052806108ac6108e7565b8152602001606081525090565b6040518060c001604052806108cc610915565b81526020016060815260200160608152602001606081525090565b604051806080016040528060608152602001600063ffffffff16815260200160608152602001606081525090565b60405180606001604052806000815260200160608152602001606081525090565b600082601f830112610946578081fd5b813567ffffffffffffffff81111561095c578182fd5b602061096b8182840201611167565b828152925080830184820160005b848110156109a257610990888584358a01016109ad565b83529183019190830190600101610979565b505050505092915050565b600082601f8301126109bd578081fd5b813567ffffffffffffffff8111156109d3578182fd5b610a0460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611167565b9150808252836020828501011115610a1b57600080fd5b8060208401602084013760009082016020015292915050565b600060808284031215610a45578081fd5b610a4f6080611167565b90506000823567ffffffffffffffff80821115610a6a578283fd5b610a76868387016109ad565b84526020850135915063ffffffff82168214610a90578283fd5b8160208501526040850135915080821115610aa9578283fd5b610ab586838701610936565b60408501526060850135915080821115610acd578283fd5b50610ada858286016109ad565b6060840152505092915050565b600080600080600060a08688031215610aff57600080fd5b8535610b0a816111be565b945060208601359350604086013592506060860135610b28816111be565b949793965091946080013592915050565b600060208284031215610b4b57600080fd5b813567ffffffffffffffff811115610b6257600080fd5b610b6e84828501610936565b949350505050565b60008060008060808587031215610b8c57600080fd5b84359350602085013560ff81168114610ba457600080fd5b93969395505050506040820135916060013590565b600060208284031215610bcb57600080fd5b813567ffffffffffffffff811115610be257600080fd5b610b6e848285016109ad565b600060208284031215610bff578081fd5b813567ffffffffffffffff80821115610c16578283fd5b81840160608187031215610c28578384fd5b610c326060611167565b925080358352602081013582811115610c49578485fd5b610c55878284016109ad565b602085015250604081013582811115610c6c578485fd5b610c78878284016109ad565b6040850152509195945050505050565b600060208284031215610c99578081fd5b813567ffffffffffffffff80821115610cb0578283fd5b81840160408187031215610cc2578384fd5b610ccc6040611167565b9250803582811115610cdc578485fd5b610ce887828401610a34565b845250602081013582811115610cfc578485fd5b610d08878284016109ad565b6020850152509195945050505050565b600060208284031215610d2a57600080fd5b813567ffffffffffffffff811115610d4157600080fd5b610b6e84828501610a34565b600060208284031215610d5f57600080fd5b5035919050565b600080600060608486031215610d7a578081fd5b83359250602084013567ffffffffffffffff80821115610d98578283fd5b610da4878388016109ad565b93506040860135915080821115610db9578283fd5b50610dc6868287016109ad565b9150509250925092565b60008151808452610de881602086016020860161118e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815160808452610e2f6080850182610dd0565b6020915063ffffffff82850151168286015260408401518582036040870152818151808452848401915084858202850101858401600094505b82851015610eb6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868303018452610ea2828251610dd0565b600195909501949387019391508601610e68565b506060880151955088810360608a0152610ed08187610dd0565b9998505050505050505050565b60008351610eef81846020880161118e565b9190910191825250602001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b93845260ff9290921660208401526040830152606082015260800190565b600060608252610f516060830186610dd0565b8281036020840152610f638186610dd0565b8381036040850152610f758186610dd0565b979650505050505050565b600060208252610f936020830184610dd0565b9392505050565b6020808252600d908201527f53494d504c455f52455645525400000000000000000000000000000000000000604082015260600190565b6020808252600e908201527f53494d504c455f52455155495245000000000000000000000000000000000000604082015260600190565b600060208252825160806020840152805160a08401526020810151606060c0850152611038610100850182610dd0565b604083015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160e08601526110738183610dd0565b9250505060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808584030160408601526110b18383610dd0565b60408701519350818682030160608701526110cc8185610dd0565b9250506060860151925080858303016080860152506110eb8183610dd0565b95945050505050565b6000602082528251604060208401526111106060840182610e1a565b602085015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08482030160408501526110eb8183610dd0565b600060208252610f936020830184610e1a565b90815260200190565b60405181810167ffffffffffffffff8111828210171561118657600080fd5b604052919050565b60005b838110156111a9578181015183820152602001611191565b838111156111b8576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff811681146104b457600080fdfea365627a7a72305820214ed1004da86e532abdc631c468eb8b4c65f3074a142b32dbb702a7fe6b9cdf6c6578706572696d656e74616cf564736f6c634300050a0040", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18A JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x63D69C88 GT PUSH2 0xD6 JUMPI DUP1 PUSH4 0x9A3B6185 GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD6D7618C GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD6D7618C EQ PUSH2 0x420 JUMPI DUP1 PUSH4 0xD88BE12F EQ PUSH2 0x442 JUMPI DUP1 PUSH4 0xEE8B86FB EQ PUSH2 0x457 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x9A3B6185 EQ PUSH2 0x3DB JUMPI DUP1 PUSH4 0xA3C2F6B6 EQ PUSH2 0x3F0 JUMPI DUP1 PUSH4 0xAE2DAE17 EQ PUSH2 0x405 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x7833BEC0 GT PUSH2 0xB0 JUMPI DUP1 PUSH4 0x7833BEC0 EQ PUSH2 0x379 JUMPI DUP1 PUSH4 0x7A791E6E EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x8EE52B4E EQ PUSH2 0x3BB JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x63D69C88 EQ PUSH2 0x329 JUMPI DUP1 PUSH4 0x647341EB EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x76F15D5B EQ PUSH2 0x364 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A GT PUSH2 0x138 JUMPI DUP1 PUSH4 0x45FDBDB7 GT PUSH2 0x112 JUMPI DUP1 PUSH4 0x45FDBDB7 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0x59C28ADD EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0x5BA3C7C0 EQ PUSH2 0x314 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x3E9EF66A EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0x4303A542 EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x4582EAB2 EQ PUSH2 0x2C8 JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH4 0x2E1A7D4D GT PUSH2 0x169 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x3687617D EQ PUSH2 0x23C JUMPI DUP1 PUSH4 0x36B32396 EQ PUSH2 0x26B JUMPI PUSH2 0x18A JUMP JUMPDEST DUP1 PUSH3 0x9E437 EQ PUSH2 0x1AF JUMPI DUP1 PUSH4 0x527C28F EQ PUSH2 0x1C6 JUMPI DUP1 PUSH4 0x1310E444 EQ PUSH2 0x1E6 JUMPI JUMPDEST ADDRESS CALLDATASIZE PUSH1 0x0 DUP1 CALLDATACOPY PUSH1 0x0 DUP1 CALLDATASIZE PUSH1 0x0 DUP1 DUP6 GAS CALL RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY DUP1 PUSH2 0x1A9 JUMPI RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP RETURNDATASIZE PUSH1 0x0 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x477 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xB39 JUMP JUMPDEST PUSH2 0x4B4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x201 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x4B7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x115E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x4BE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x248 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25C PUSH2 0x257 CALLDATASIZE PUSH1 0x4 PUSH2 0xD66 JUMP JUMPDEST PUSH2 0x50F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF3E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x286 CALLDATASIZE PUSH1 0x4 PUSH2 0xB76 JUMP JUMPDEST PUSH2 0x5AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0xEFF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xBB9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x691 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x698 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x6FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x307 PUSH2 0x72F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x10F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x320 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x737 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x335 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28B PUSH2 0x344 CALLDATASIZE PUSH1 0x4 PUSH2 0xAE7 JUMP JUMPDEST PUSH2 0x79C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x7A5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x385 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x399 PUSH2 0x394 CALLDATASIZE PUSH1 0x4 PUSH2 0xBEE JUMP JUMPDEST PUSH2 0x7B3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x1008 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x870 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x3D6 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x875 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x87B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x886 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x1E1 CALLDATASIZE PUSH1 0x4 PUSH2 0xC88 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x435 PUSH2 0x88B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x213 SWAP2 SWAP1 PUSH2 0x114B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x206 PUSH2 0x893 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C4 PUSH2 0x472 CALLDATASIZE PUSH1 0x4 PUSH2 0xD4D JUMP JUMPDEST PUSH2 0x1E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4A9 SWAP1 PUSH2 0xFD1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST POP JUMP JUMPDEST POP PUSH2 0x7C7 SWAP1 JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD PUSH2 0x504 SWAP2 SWAP1 PUSH2 0x115E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE DUP3 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP4 ADD MSTORE DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SWAP2 DUP5 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP5 ADD MSTORE SWAP1 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x1C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP SWAP1 POP PUSH1 0x0 DUP2 DUP8 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x600 SWAP3 SWAP2 SWAP1 PUSH2 0xEDD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x1 DUP2 DUP8 DUP8 DUP8 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x63B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0xF20 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x65D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x7C7 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH32 0x5245564552545F574954485F434F4E5354414E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x4A9 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xF80 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x4A9 SWAP1 PUSH2 0xF9A JUMP JUMPDEST PUSH2 0x695 PUSH2 0x899 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x524551554952455F574954485F434F4E5354414E540000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH2 0x4A9 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0xF80 JUMP JUMPDEST POP SWAP3 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 DUP2 SWAP1 SSTORE SWAP1 JUMP JUMPDEST PUSH2 0x7BB PUSH2 0x8B9 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE SWAP2 DUP3 MSTORE DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x1234567800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP4 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP1 DUP6 ADD SWAP3 SWAP1 SWAP3 MSTORE DUP3 MLOAD DUP1 DUP5 ADD DUP5 MSTORE DUP2 DUP2 MSTORE PUSH32 0x8765432100000000000000000000000000000000000000000000000000000000 DUP2 DUP5 ADD MSTORE DUP5 DUP5 ADD MSTORE DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE DUP3 MSTORE PUSH32 0x616D657400000000000000000000000000000000000000000000000000000000 SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH2 0x4B2 JUMP JUMPDEST PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 SWAP1 JUMP JUMPDEST PUSH2 0x695 PUSH2 0x8E7 JUMP JUMPDEST PUSH2 0x4D2 SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x8AC PUSH2 0x8E7 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xC0 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x8CC PUSH2 0x915 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH4 0xFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x946 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x95C JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 PUSH2 0x96B DUP2 DUP3 DUP5 MUL ADD PUSH2 0x1167 JUMP JUMPDEST DUP3 DUP2 MSTORE SWAP3 POP DUP1 DUP4 ADD DUP5 DUP3 ADD PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x9A2 JUMPI PUSH2 0x990 DUP9 DUP6 DUP5 CALLDATALOAD DUP11 ADD ADD PUSH2 0x9AD JUMP JUMPDEST DUP4 MSTORE SWAP2 DUP4 ADD SWAP2 SWAP1 DUP4 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x979 JUMP JUMPDEST POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x9BD JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x9D3 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0xA04 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND ADD PUSH2 0x1167 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0xA1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP5 ADD CALLDATACOPY PUSH1 0x0 SWAP1 DUP3 ADD PUSH1 0x20 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xA45 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0xA4F PUSH1 0x80 PUSH2 0x1167 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xA6A JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xA76 DUP7 DUP4 DUP8 ADD PUSH2 0x9AD JUMP JUMPDEST DUP5 MSTORE PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP2 POP PUSH4 0xFFFFFFFF DUP3 AND DUP3 EQ PUSH2 0xA90 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xAA9 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xAB5 DUP7 DUP4 DUP8 ADD PUSH2 0x936 JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP6 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xACD JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xADA DUP6 DUP3 DUP7 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x60 DUP5 ADD MSTORE POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0xAFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH2 0xB0A DUP2 PUSH2 0x11BE JUMP JUMPDEST SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP3 POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH2 0xB28 DUP2 PUSH2 0x11BE JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP2 SWAP5 PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xB62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0x936 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0xB8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0xBA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP7 SWAP4 SWAP6 POP POP POP POP PUSH1 0x40 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x60 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xBE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xBFF JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xC16 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x60 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xC28 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xC32 PUSH1 0x60 PUSH2 0x1167 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP4 MSTORE PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xC49 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xC55 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xC6C JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xC78 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xC99 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xCB0 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD PUSH1 0x40 DUP2 DUP8 SUB SLT ISZERO PUSH2 0xCC2 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0xCCC PUSH1 0x40 PUSH2 0x1167 JUMP JUMPDEST SWAP3 POP DUP1 CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xCDC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xCE8 DUP8 DUP3 DUP5 ADD PUSH2 0xA34 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 DUP2 ADD CALLDATALOAD DUP3 DUP2 GT ISZERO PUSH2 0xCFC JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH2 0xD08 DUP8 DUP3 DUP5 ADD PUSH2 0x9AD JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MSTORE POP SWAP2 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xD41 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6E DUP5 DUP3 DUP6 ADD PUSH2 0xA34 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xD7A JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0xD98 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0xDA4 DUP8 DUP4 DUP9 ADD PUSH2 0x9AD JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0xDB9 JUMPI DUP3 DUP4 REVERT JUMPDEST POP PUSH2 0xDC6 DUP7 DUP3 DUP8 ADD PUSH2 0x9AD JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0xDE8 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x118E JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD PUSH1 0x80 DUP5 MSTORE PUSH2 0xE2F PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x20 SWAP2 POP PUSH4 0xFFFFFFFF DUP3 DUP6 ADD MLOAD AND DUP3 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD DUP6 DUP3 SUB PUSH1 0x40 DUP8 ADD MSTORE DUP2 DUP2 MLOAD DUP1 DUP5 MSTORE DUP5 DUP5 ADD SWAP2 POP DUP5 DUP6 DUP3 MUL DUP6 ADD ADD DUP6 DUP5 ADD PUSH1 0x0 SWAP5 POP JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xEB6 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP7 DUP4 SUB ADD DUP5 MSTORE PUSH2 0xEA2 DUP3 DUP3 MLOAD PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x1 SWAP6 SWAP1 SWAP6 ADD SWAP5 SWAP4 DUP8 ADD SWAP4 SWAP2 POP DUP7 ADD PUSH2 0xE68 JUMP JUMPDEST POP PUSH1 0x60 DUP9 ADD MLOAD SWAP6 POP DUP9 DUP2 SUB PUSH1 0x60 DUP11 ADD MSTORE PUSH2 0xED0 DUP2 DUP8 PUSH2 0xDD0 JUMP JUMPDEST SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 MLOAD PUSH2 0xEEF DUP2 DUP5 PUSH1 0x20 DUP9 ADD PUSH2 0x118E JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP2 DUP3 MSTORE POP PUSH1 0x20 ADD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP4 DUP5 MSTORE PUSH1 0xFF SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 DUP5 ADD MSTORE PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP3 MSTORE PUSH2 0xF51 PUSH1 0x60 DUP4 ADD DUP7 PUSH2 0xDD0 JUMP JUMPDEST DUP3 DUP2 SUB PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0xF63 DUP2 DUP7 PUSH2 0xDD0 JUMP JUMPDEST DUP4 DUP2 SUB PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0xF75 DUP2 DUP7 PUSH2 0xDD0 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xF93 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xDD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xD SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455645525400000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xE SWAP1 DUP3 ADD MSTORE PUSH32 0x53494D504C455F52455155495245000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x80 PUSH1 0x20 DUP5 ADD MSTORE DUP1 MLOAD PUSH1 0xA0 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD MLOAD PUSH1 0x60 PUSH1 0xC0 DUP6 ADD MSTORE PUSH2 0x1038 PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 DUP6 DUP3 SUB ADD PUSH1 0xE0 DUP7 ADD MSTORE PUSH2 0x1073 DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST SWAP3 POP POP POP PUSH1 0x20 DUP5 ADD MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP1 DUP6 DUP5 SUB ADD PUSH1 0x40 DUP7 ADD MSTORE PUSH2 0x10B1 DUP4 DUP4 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x40 DUP8 ADD MLOAD SWAP4 POP DUP2 DUP7 DUP3 SUB ADD PUSH1 0x60 DUP8 ADD MSTORE PUSH2 0x10CC DUP2 DUP6 PUSH2 0xDD0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP7 ADD MLOAD SWAP3 POP DUP1 DUP6 DUP4 SUB ADD PUSH1 0x80 DUP7 ADD MSTORE POP PUSH2 0x10EB DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE DUP3 MLOAD PUSH1 0x40 PUSH1 0x20 DUP5 ADD MSTORE PUSH2 0x1110 PUSH1 0x60 DUP5 ADD DUP3 PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP2 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP5 DUP3 SUB ADD PUSH1 0x40 DUP6 ADD MSTORE PUSH2 0x10EB DUP2 DUP4 PUSH2 0xDD0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0xF93 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0xE1A JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x1186 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11A9 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1191 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x11B8 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x4B4 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG3 PUSH6 0x627A7A723058 KECCAK256 0x21 0x4e 0xd1 STOP 0x4d 0xa8 PUSH15 0x532ABDC631C468EB8B4C65F3074A14 0x2b ORIGIN 0xdb 0xb7 MUL 0xa7 INVALID PUSH12 0x9CDF6C6578706572696D656E PUSH21 0x616CF564736F6C634300050A004000000000000000 ", + "sourceMap": "641:6433:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4308:4;4457:14;4285:12;;4385:100;4983:1;4899:3;4822:14;4760:3;4695:1;4627:4;4570:3;4548:512;5190:16;5169:3;5148;5116:104;5282:7;5272:2;;5319:16;5316:1;5309:27;5272:2;;5409:16;5406:1;5399:27;1496:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1496:107:0;;;:::i;:::-;;2732:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2732:63:0;;;;;;;;:::i;6104:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6104:128:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2127:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2127:84:0;;;;;;;;:::i;6727:345::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6727:345:0;;;;;;;;:::i;:::-;;;;;;;;;;1726:334;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1726:334:0;;;;;;;;:::i;:::-;;;;;;;;2570:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2570:52:0;;;;;;5709:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5709:117:0;;;:::i;1389:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1389:101:0;;;:::i;1286:97::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1286:97:0;;;:::i;3302:73::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3302:73:0;;;:::i;:::-;;;;;;;;1609:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1609:111:0;;;:::i;2365:166::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2365:166:0;;;;;;;;:::i;2941:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2941:52:0;;;;;;3401:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3401:72:0;;;:::i;6305:317::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6305:317:0;;;;;;;;:::i;:::-;;;;;;;;5518:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5518:112:0;;;:::i;989:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;989:140:0;;;;;;;;:::i;3478:69::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3478:69:0;;;:::i;862:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;862:121:0;;;:::i;3233:64::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3233:64:0;;;;;;3075:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3075:63:0;;;:::i;:::-;;;;;;;;1135:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1135:145:0;;;:::i;5905:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5905:123:0;;;;;;;;:::i;1496:107::-;1564:32;;;;;;;;;;;;;;;;;;;;1496:107::o;2732:63::-;;:::o;6104:128::-;-1:-1:-1;6221:4:0;;6104:128::o;2127:84::-;2188:10;2177:27;;;2200:3;2177:27;;;;;;;;;;;;;;;2127:84;:::o;6727:345::-;-1:-1:-1;;6974:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6727:345:0:o;1726:334::-;1837:21;1874:19;:56;;;;;;;;;;;;;;;;;;;1940:20;1990:6;1998:4;1973:30;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1973:30:0;;;1963:41;;;;;;1940:64;;2021:32;2031:12;2045:1;2048;2051;2021:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;2021:32:0;;;;;;1726:334;-1:-1:-1;;;;;;;;1726:334:0:o;5709:117::-;5815:4;5709:117;;:::o;1389:101::-;1469:13;;;;;;;;;;;;;;;;1462:21;;;;;;;1469:13;1462:21;;;;1286:97;1353:23;;;;;;;;;;;3302:73;3352:19;;:::i;1609:111::-;1698:14;;;;;;;;;;;;;;;;1683:30;;;;;;;1698:14;1683:30;;;;2365:166;-1:-1:-1;2523:1:0;;2365:166;-1:-1:-1;;;2365:166:0:o;3401:72::-;3441:4;3456:14;;3469:1;3456:14;;;;;3401:72;:::o;6305:317::-;6419:20;;:::i;:::-;-1:-1:-1;6462:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6305:317::o;5518:112::-;5602:21;;989:140;1117:1;:5;;989:140::o;3478:69::-;3530:9;:14;;3543:1;3530:14;;;3478:69::o;862:121::-;975:1;862:121;:::o;3075:63::-;3119:15;;:::i;1135:145::-;711:4;1135:145;:::o;641:6433::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:685:-1:-;;276:3;269:4;261:6;257:17;253:27;243:2;;-1:-1;;284:12;243:2;331:6;318:20;26546:18;26538:6;26535:30;26532:2;;;-1:-1;;26568:12;26532:2;26613:4;353:81;26676:4;26613;26605:6;26601:17;26666:15;353:81;;;462:21;;;344:90;-1:-1;519:14;;;494:17;;;614:1;599:238;624:6;621:1;618:13;599:238;;;731:42;769:3;506:4;707:3;694:17;498:6;682:30;;731:42;;;719:55;;788:14;;;;816;;;;646:1;639:9;599:238;;;603:14;;;;;236:607;;;;;1706:432;;1803:3;1796:4;1788:6;1784:17;1780:27;1770:2;;-1:-1;;1811:12;1770:2;1858:6;1845:20;27153:18;27145:6;27142:30;27139:2;;;-1:-1;;27175:12;27139:2;1880:60;27316:4;27248:9;1796:4;27233:6;27229:17;27225:33;27306:15;1880:60;;;1871:69;;1960:6;1953:5;1946:21;2064:3;27316:4;2055:6;1988;2046:16;;2043:25;2040:2;;;2081:1;;2071:12;2040:2;30896:6;27316:4;1988:6;1984:17;27316:4;2022:5;2018:16;30873:30;30952:1;30934:16;;;27316:4;30934:16;30927:27;2022:5;1763:375;-1:-1;;1763:375;5086:1071;;5194:4;5182:9;5177:3;5173:19;5169:30;5166:2;;;-1:-1;;5202:12;5166:2;5230:20;5194:4;5230:20;;;5221:29;;5333:1;5318:17;5305:31;5356:18;;5348:6;5345:30;5342:2;;;5388:1;5385;5378:12;5342:2;5422:54;5472:3;5463:6;5452:9;5448:22;5422:54;;;5405:15;5398:79;5543:2;5600:9;5596:22;7481:20;7472:29;;30703:10;31888:5;30692:22;31864:5;31861:34;31851:2;;31909:1;31906;31899:12;31851:2;5576:48;5543:2;5562:5;5558:16;5551:74;5730:2;5719:9;5715:18;5702:32;5688:46;;5754:18;5746:6;5743:30;5740:2;;;5786:1;5783;5776:12;5740:2;5821:75;5892:3;5883:6;5872:9;5868:22;5821:75;;;5730:2;5807:5;5803:16;5796:101;5989:2;5978:9;5974:18;5961:32;5947:46;;6013:18;6005:6;6002:30;5999:2;;;6045:1;6042;6035:12;5999:2;;6080:55;6131:3;6122:6;6111:9;6107:22;6080:55;;;5989:2;6066:5;6062:16;6055:81;;;5160:997;;;;;7683:743;;;;;;7855:3;7843:9;7834:7;7830:23;7826:33;7823:2;;;-1:-1;;7862:12;7823:2;85:6;72:20;97:33;124:5;97:33;;;7914:63;-1:-1;8014:2;8053:22;;7345:20;;-1:-1;8122:2;8161:22;;7345:20;;-1:-1;8230:2;8269:22;;72:20;97:33;72:20;97:33;;;7817:609;;;;-1:-1;7817:609;;8338:3;8378:22;7345:20;;7817:609;-1:-1;;7817:609;8433:387;;8567:2;8555:9;8546:7;8542:23;8538:32;8535:2;;;-1:-1;;8573:12;8535:2;8631:17;8618:31;8669:18;8661:6;8658:30;8655:2;;;-1:-1;;8691:12;8655:2;8721:83;8796:7;8787:6;8776:9;8772:22;8721:83;;;8711:93;8529:291;-1:-1;;;;8529:291;8827:613;;;;;8980:3;8968:9;8959:7;8955:23;8951:33;8948:2;;;-1:-1;;8987:12;8948:2;1648:6;1635:20;9039:63;;9139:2;9180:9;9176:22;7615:20;30797:4;32008:5;30786:16;31985:5;31982:33;31972:2;;-1:-1;;32019:12;31972:2;8942:498;;9147:61;;-1:-1;;;;9245:2;9284:22;;1635:20;;9353:2;9392:22;1635:20;;8942:498;9447:345;;9560:2;9548:9;9539:7;9535:23;9531:32;9528:2;;;-1:-1;;9566:12;9528:2;9624:17;9611:31;9662:18;9654:6;9651:30;9648:2;;;-1:-1;;9684:12;9648:2;9714:62;9768:7;9759:6;9748:9;9744:22;9714:62;;9799:385;;9932:2;9920:9;9911:7;9907:23;9903:32;9900:2;;;9948:1;9945;9938:12;9900:2;9996:17;9983:31;10034:18;;10026:6;10023:30;10020:2;;;10066:1;10063;10056:12;10020:2;10151:6;10140:9;10136:22;3645:4;3633:9;3628:3;3624:19;3620:30;3617:2;;;3663:1;3660;3653:12;3617:2;3681:20;3645:4;3681:20;;;3672:29;;7358:6;7345:20;3764:15;3757:74;9932:2;3908:9;3904:18;3891:32;3943:18;3935:6;3932:30;3929:2;;;3975:1;3972;3965:12;3929:2;4010:54;4060:3;4051:6;4040:9;4036:22;4010:54;;;9932:2;3996:5;3992:16;3985:80;;4153:2;4142:9;4138:18;4125:32;4177:18;4169:6;4166:30;4163:2;;;4209:1;4206;4199:12;4163:2;4244:55;4295:3;4286:6;4275:9;4271:22;4244:55;;;4153:2;4226:16;;4219:81;-1:-1;4230:5;;9894:290;-1:-1;;;;;9894:290;10191:385;;10324:2;10312:9;10303:7;10299:23;10295:32;10292:2;;;10340:1;10337;10330:12;10292:2;10388:17;10375:31;10426:18;;10418:6;10415:30;10412:2;;;10458:1;10455;10448:12;10412:2;10543:6;10532:9;10528:22;4484:4;4472:9;4467:3;4463:19;4459:30;4456:2;;;4502:1;4499;4492:12;4456:2;4520:20;4484:4;4520:20;;;4511:29;;4610:17;4597:31;4648:18;4640:6;4637:30;4634:2;;;4680:1;4677;4670:12;4634:2;4714:68;4778:3;4769:6;4758:9;4754:22;4714:68;;;4697:15;4690:93;;10324:2;4868:9;4864:18;4851:32;4903:18;4895:6;4892:30;4889:2;;;4935:1;4932;4925:12;4889:2;4970:55;5021:3;5012:6;5001:9;4997:22;4970:55;;;10324:2;4952:16;;4945:81;-1:-1;4956:5;;10286:290;-1:-1;;;;;10286:290;10583:373;;10710:2;10698:9;10689:7;10685:23;10681:32;10678:2;;;-1:-1;;10716:12;10678:2;10774:17;10761:31;10812:18;10804:6;10801:30;10798:2;;;-1:-1;;10834:12;10798:2;10864:76;10932:7;10923:6;10912:9;10908:22;10864:76;;10963:241;;11067:2;11055:9;11046:7;11042:23;11038:32;11035:2;;;-1:-1;;11073:12;11035:2;-1:-1;7345:20;;11029:175;-1:-1;11029:175;11211:701;;;;11368:2;11356:9;11347:7;11343:23;11339:32;11336:2;;;11384:1;11381;11374:12;11336:2;7358:6;7345:20;11426:63;;11554:2;11543:9;11539:18;11526:32;11578:18;;11570:6;11567:30;11564:2;;;11610:1;11607;11600:12;11564:2;11630:62;11684:7;11675:6;11664:9;11660:22;11630:62;;;11620:72;;11757:2;11746:9;11742:18;11729:32;11715:46;;11781:18;11773:6;11770:30;11767:2;;;11813:1;11810;11803:12;11767:2;;11833:63;11888:7;11879:6;11868:9;11864:22;11833:63;;;11823:73;;;11330:582;;;;;;13391:343;;13533:5;28583:12;29372:6;29367:3;29360:19;13626:52;13671:6;29409:4;29404:3;29400:14;29409:4;13652:5;13648:16;13626:52;;;31414:2;31394:14;31410:7;31390:28;13690:39;;;;29409:4;13690:39;;13481:253;-1:-1;;13481:253;19103:1078;;19327:15;19321:22;19250:4;19363:13;19356:37;19408:67;19250:4;19245:3;19241:14;19456:12;19408:67;;;19565:4;;;30703:10;19565:4;19558:5;19554:16;19548:23;30692:22;19632:4;19627:3;19623:14;21609:36;19733:4;19726:5;19722:16;19716:23;19785:3;19779:4;19775:14;19733:4;19763:3;19759:14;19752:38;19805:109;12442:5;28583:12;29372:6;29367:3;29360:19;29409:4;29404:3;29400:14;12454:88;;19565:4;12607;12599:6;12595:17;29404:3;12586:27;;28445:4;12685:5;28436:14;-1:-1;12730:10;;12724:341;12749:6;12746:1;12743:13;12724:341;;;12801:20;29404:3;12805:4;12801:20;;12796:3;12789:33;12031:60;12087:3;12856:6;12850:13;12031:60;;;12771:1;12764:9;;;;;13044:14;;;;12870:82;-1:-1;29220:14;;12724:341;;;12728:14;20002:4;19995:5;19991:16;19985:23;19965:43;;20054:3;20048:4;20044:14;20002:4;20032:3;20028:14;20021:38;20074:69;20138:4;20124:12;20074:69;;;20165:11;19223:958;-1:-1;;;;;;;;;19223:958;21771:401;;13901:5;28583:12;14012:52;14057:6;14052:3;14045:4;14038:5;14034:16;14012:52;;;14076:16;;;;13183:37;;;-1:-1;14045:4;22135:12;;21924:248;-1:-1;21924:248;22179:213;30497:42;30486:54;;;;12176:37;;22297:2;22282:18;;22268:124;22399:539;13183:37;;;30797:4;30786:16;;;;22758:2;22743:18;;21724:35;22841:2;22826:18;;13183:37;22924:2;22909:18;;13183:37;22597:3;22582:19;;22568:370;22945:691;;23175:2;23196:17;23189:47;23250:76;23175:2;23164:9;23160:18;23312:6;23250:76;;;23374:9;23368:4;23364:20;23359:2;23348:9;23344:18;23337:48;23399:76;23470:4;23461:6;23399:76;;;23523:9;23517:4;23513:20;23508:2;23497:9;23493:18;23486:48;23548:78;23621:4;23612:6;23548:78;;;23540:86;23146:490;-1:-1;;;;;;;23146:490;23643:293;;23777:2;23798:17;23791:47;23852:74;23777:2;23766:9;23762:18;23912:6;23852:74;;;23844:82;23748:188;-1:-1;;;23748:188;23943:407;24134:2;24148:47;;;15677:2;24119:18;;;29360:19;15713:66;29400:14;;;15693:87;15799:12;;;24105:245;24357:407;24548:2;24562:47;;;16050:2;24533:18;;;29360:19;16086:66;29400:14;;;16066:87;16172:12;;;24519:245;24771:381;;24949:2;24970:17;24963:47;17367:15;17361:22;17294:4;24949:2;24938:9;24934:18;17396:37;16487:15;16481:22;17285:14;24938:9;17285:14;13183:37;24949:2;16642:5;16638:16;16632:23;16416:4;16675:14;24938:9;16675:14;16668:38;16721:67;16407:14;24938:9;16407:14;16769:12;16721:67;;;16872:4;16865:5;16861:16;16855:23;16835:43;;16914:14;24938:9;16918:4;16914:14;;16898;24938:9;16898:14;16891:38;16944:69;17008:4;16994:12;16944:69;;;17035:11;;;;24949:2;17634:5;17630:16;17624:23;17683:14;;24938:9;17687:4;17683:14;;16872:4;24938:9;17667:14;17660:38;17713:67;17775:4;17761:12;17713:67;;;16872:4;17859:5;17855:16;17849:23;17829:43;;17908:14;24938:9;17912:4;17908:14;;16416:4;24938:9;17892:14;17885:38;17938:67;18000:4;17986:12;17938:67;;;17930:75;;;16416:4;18084:5;18080:16;18074:23;18054:43;;18133:14;24938:9;18137:4;18133:14;;17294:4;24938:9;18117:14;18110:38;;18163:69;18227:4;18213:12;18163:69;;;25016:126;24920:232;-1:-1;;;;;24920:232;25159:377;;25335:2;25356:17;25349:47;18588:15;18582:22;18509:4;25335:2;25324:9;25320:18;18617:37;18669:95;18500:14;25324:9;18500:14;18745:12;18669:95;;;25335:2;18849:5;18845:16;18839:23;18819:43;;18898:14;25324:9;18902:4;18898:14;;18509:4;25324:9;18882:14;18875:38;18928:69;18992:4;18978:12;18928:69;;25543:353;;25707:2;25728:17;25721:47;25782:104;25707:2;25696:9;25692:18;25872:6;25782:104;;25903:213;13183:37;;;26021:2;26006:18;;25992:124;26123:256;26185:2;26179:9;26211:17;;;26286:18;26271:34;;26307:22;;;26268:62;26265:2;;;26343:1;;26333:12;26265:2;26185;26352:22;26163:216;;-1:-1;26163:216;30969:268;31034:1;31041:101;31055:6;31052:1;31049:13;31041:101;;;31122:11;;;31116:18;31103:11;;;31096:39;31077:2;31070:10;31041:101;;;31157:6;31154:1;31151:13;31148:2;;;31034:1;31213:6;31208:3;31204:16;31197:27;31148:2;;31018:219;;;;31431:117;30497:42;31518:5;30486:54;31493:5;31490:35;31480:2;;31539:1;;31529:12" } } }, @@ -430,9 +609,9 @@ } }, "sourceCodes": { - "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n event Withdrawal(address indexed _owner, uint _value);\n\n function withdraw(uint wad) public {\n emit Withdrawal(msg.sender, wad);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n}\n" + "AbiGenDummy.sol": "/*\n\n Copyright 2018 ZeroEx Intl.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma experimental ABIEncoderV2;\n\npragma solidity ^0.5.5;\n\n\ncontract AbiGenDummy\n{\n\n uint256 constant internal SOME_CONSTANT = 1234;\n string constant internal REVERT_REASON = \"REVERT_WITH_CONSTANT\";\n string constant internal REQUIRE_REASON = \"REQUIRE_WITH_CONSTANT\";\n\n function simplePureFunction ()\n public\n pure\n returns (uint256 result)\n {\n return 1;\n }\n\n function simplePureFunctionWithInput (uint256 x)\n public\n pure\n returns (uint256 sum)\n {\n return 1 + x;\n }\n\n function pureFunctionWithConstant ()\n public\n pure\n returns (uint256 someConstant)\n {\n return SOME_CONSTANT;\n }\n\n function simpleRevert ()\n public\n pure\n {\n revert(\"SIMPLE_REVERT\");\n }\n\n function revertWithConstant ()\n public\n pure\n {\n revert(REVERT_REASON);\n }\n\n function simpleRequire ()\n public\n pure\n {\n require(0 > 1, \"SIMPLE_REQUIRE\");\n }\n\n function requireWithConstant ()\n public\n pure\n {\n require(0 > 1, REQUIRE_REASON);\n }\n\n function ecrecoverFn(bytes32 hash, uint8 v, bytes32 r, bytes32 s)\n public\n pure\n returns (address signerAddress)\n {\n bytes memory prefix = \"\\x19Ethereum Signed Message:\\n32\";\n bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, hash));\n return ecrecover(prefixedHash, v, r, s);\n }\n\n event Withdrawal(address indexed _owner, uint _value);\n\n function withdraw(uint wad) public {\n emit Withdrawal(msg.sender, wad);\n }\n\n // test: generated code should normalize address inputs to lowercase\n // add extra inputs to make sure it works with address in any position\n function withAddressInput(address x, uint256 a, uint256 b, address y, uint256 c)\n public\n pure\n returns (address z)\n {\n return x;\n }\n\n event AnEvent(uint8 param);\n\n function acceptsBytes(bytes memory a) public pure {}\n\n /// @dev a method that accepts an array of bytes\n /// @param a the array of bytes being accepted\n function acceptsAnArrayOfBytes(bytes[] memory a) public pure {}\n\n struct Struct {\n bytes someBytes;\n uint32 anInteger;\n bytes[] aDynamicArrayOfBytes;\n string aString;\n }\n\n function structInput(Struct memory s) public pure {}\n\n /// @dev a method that returns a struct\n /// @return a Struct struct\n function structOutput() public pure returns(Struct memory s) {}\n\n struct NestedStruct {\n Struct innerStruct;\n string description;\n }\n\n function nestedStructInput(NestedStruct memory n) public pure {}\n function nestedStructOutput() public pure returns(NestedStruct memory) {}\n\n uint someState;\n function nonPureMethod() public returns(uint) { return someState += 1; }\n function nonPureMethodThatReturnsNothing() public { someState += 1; }\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexInput {\n uint256 foo;\n bytes bar;\n string car;\n }\n\n /// @dev complex input is dynamic and more difficult to decode than simple input.\n struct ComplexOutput {\n ComplexInput input;\n bytes lorem;\n bytes ipsum;\n string dolor;\n }\n\n /// @dev The fallback function calls into this contract and executes one of the above functions.\n /// This allows us to test `getABIDecodedTransactionData` and `getABIDecodedReturnData` that is\n /// include in contract wrappers.\n // solhint-disable no-complex-fallback\n function ()\n external\n payable\n {\n address addr = address(this);\n assembly {\n // copy calldata to memory\n calldatacopy(\n 0x0,\n 0x0,\n calldatasize()\n )\n // execute transaction\n let success := call(\n gas, // send all gas.\n addr, // call into this contract.\n 0, // don't send any ether.\n 0x0, // input is `txData`.\n calldatasize(), // input length is that of `txData`.\n 0x0, // any return data goes at mem address 0x0.\n 0 // there is no fixed return value size.\n )\n\n // copy return data to memory\n returndatacopy(\n 0x0,\n 0x0,\n returndatasize()\n )\n\n // rethrow any exceptions\n if iszero(success) {\n revert(0, returndatasize())\n }\n\n // return call results\n return(0, returndatasize())\n }\n }\n \n /// @dev Tests decoding when both input and output are empty.\n function noInputNoOutput()\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when input is empty and output is non-empty.\n function noInputSimpleOutput()\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when input is not empty but output is empty.\n function simpleInputNoOutput(uint256)\n public\n pure\n {\n // NOP\n require(true == true);\n }\n\n /// @dev Tests decoding when both input and output are non-empty.\n function simpleInputSimpleOutput(uint256)\n public\n pure\n returns (uint256)\n {\n return 1991;\n }\n\n /// @dev Tests decoding when the input and output are complex.\n function complexInputComplexOutput(ComplexInput memory complexInput)\n public\n pure\n returns (ComplexOutput memory)\n {\n return ComplexOutput({\n input: complexInput,\n lorem: hex'12345678',\n ipsum: hex'87654321',\n dolor: \"amet\"\n });\n }\n\n /// @dev Tests decoding when the input and output are complex and have more than one argument.\n function multiInputMultiOutput(\n uint256,\n bytes memory,\n string memory\n )\n public\n pure\n returns (\n bytes memory,\n bytes memory,\n string memory\n )\n {\n return (\n hex'12345678',\n hex'87654321',\n \"amet\"\n );\n }\n}\n" }, - "sourceTreeHashHex": "0xaeec8bc1cd7fb6274f7bf4e0ea5117961795285e57c882a62c375e14f59f1bab", + "sourceTreeHashHex": "0xb10ac3e0b1355e92b13a32c7baa61c664eb906640672630a2fd14c3570985b2b", "compiler": { "name": "solc", "version": "soljson-v0.5.10+commit.5a6ea5b1.js", diff --git a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol index 4531338200..66c9e1507f 100644 --- a/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol +++ b/packages/abi-gen/test-cli/fixtures/contracts/AbiGenDummy.sol @@ -138,4 +138,134 @@ contract AbiGenDummy uint someState; function nonPureMethod() public returns(uint) { return someState += 1; } function nonPureMethodThatReturnsNothing() public { someState += 1; } + + /// @dev complex input is dynamic and more difficult to decode than simple input. + struct ComplexInput { + uint256 foo; + bytes bar; + string car; + } + + /// @dev complex input is dynamic and more difficult to decode than simple input. + struct ComplexOutput { + ComplexInput input; + bytes lorem; + bytes ipsum; + string dolor; + } + + /// @dev The fallback function calls into this contract and executes one of the above functions. + /// This allows us to test `getABIDecodedTransactionData` and `getABIDecodedReturnData` that is + /// include in contract wrappers. + // solhint-disable no-complex-fallback + function () + external + payable + { + address addr = address(this); + assembly { + // copy calldata to memory + calldatacopy( + 0x0, + 0x0, + calldatasize() + ) + // execute transaction + let success := call( + gas, // send all gas. + addr, // call into this contract. + 0, // don't send any ether. + 0x0, // input is `txData`. + calldatasize(), // input length is that of `txData`. + 0x0, // any return data goes at mem address 0x0. + 0 // there is no fixed return value size. + ) + + // copy return data to memory + returndatacopy( + 0x0, + 0x0, + returndatasize() + ) + + // rethrow any exceptions + if iszero(success) { + revert(0, returndatasize()) + } + + // return call results + return(0, returndatasize()) + } + } + + /// @dev Tests decoding when both input and output are empty. + function noInputNoOutput() + public + pure + { + // NOP + require(true == true); + } + + /// @dev Tests decoding when input is empty and output is non-empty. + function noInputSimpleOutput() + public + pure + returns (uint256) + { + return 1991; + } + + /// @dev Tests decoding when input is not empty but output is empty. + function simpleInputNoOutput(uint256) + public + pure + { + // NOP + require(true == true); + } + + /// @dev Tests decoding when both input and output are non-empty. + function simpleInputSimpleOutput(uint256) + public + pure + returns (uint256) + { + return 1991; + } + + /// @dev Tests decoding when the input and output are complex. + function complexInputComplexOutput(ComplexInput memory complexInput) + public + pure + returns (ComplexOutput memory) + { + return ComplexOutput({ + input: complexInput, + lorem: hex'12345678', + ipsum: hex'87654321', + dolor: "amet" + }); + } + + /// @dev Tests decoding when the input and output are complex and have more than one argument. + function multiInputMultiOutput( + uint256, + bytes memory, + string memory + ) + public + pure + returns ( + bytes memory, + bytes memory, + string memory + ) + { + return ( + hex'12345678', + hex'87654321', + "amet" + ); + } } diff --git a/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts b/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts index b33bb5a57a..c2cabb8047 100644 --- a/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts +++ b/packages/abi-gen/test-cli/test_typescript/test/abi_gen_dummy_test.ts @@ -28,6 +28,20 @@ const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper); describe('AbiGenDummy Contract', () => { let abiGenDummy: AbiGenDummyContract; + const runTestAsync = async (contractMethod: any, input: any, output: any) => { + const transaction = contractMethod.getABIEncodedTransactionData(input); + // try decoding transaction + const decodedInput = contractMethod.getABIDecodedTransactionData(transaction); + expect(decodedInput, 'decoded input').to.be.deep.equal(input); + // execute transaction + const rawOutput = await web3Wrapper.callAsync({ + to: abiGenDummy.address, + data: transaction, + }); + // try decoding output + const decodedOutput = contractMethod.getABIDecodedReturnData(rawOutput); + expect(decodedOutput, 'decoded output').to.be.deep.equal(output); + }; before(async () => { providerUtils.startProviderEngine(provider); abiGenDummy = await AbiGenDummyContract.deployFrom0xArtifactAsync( @@ -140,6 +154,63 @@ describe('AbiGenDummy Contract', () => { expect(output).to.equal(xAddress.toLowerCase()); }); }); + + describe('Encoding/Decoding Transaction Data and Return Values', () => { + it('should successfully encode/decode (no input / no output)', async () => { + const input = undefined; + const output = undefined; + await runTestAsync(abiGenDummy.noInputNoOutput, input, output); + }); + it('should successfully encode/decode (no input / simple output)', async () => { + const input = undefined; + const output = new BigNumber(1991); + await runTestAsync(abiGenDummy.noInputSimpleOutput, input, output); + }); + it('should successfully encode/decode (simple input / no output)', async () => { + const input = new BigNumber(1991); + const output = undefined; + await runTestAsync(abiGenDummy.simpleInputNoOutput, input, output); + }); + it('should successfully encode/decode (simple input / simple output)', async () => { + const input = new BigNumber(16); + const output = new BigNumber(1991); + await runTestAsync(abiGenDummy.simpleInputSimpleOutput, input, output); + }); + it('should successfully encode/decode (complex input / complex output)', async () => { + const input = { + foo: new BigNumber(1991), + bar: '0x1234', + car: 'zoom zoom', + }; + const output = { + input, + lorem: '0x12345678', + ipsum: '0x87654321', + dolor: 'amet', + }; + await runTestAsync(abiGenDummy.complexInputComplexOutput, input, output); + }); + it('should successfully encode/decode (multi-input / multi-output)', async () => { + const input = [new BigNumber(1991), '0x1234', 'zoom zoom']; + const output = ['0x12345678', '0x87654321', 'amet']; + const transaction = abiGenDummy.multiInputMultiOutput.getABIEncodedTransactionData( + input[0] as BigNumber, + input[1] as string, + input[2] as string, + ); + // try decoding transaction + const decodedInput = abiGenDummy.multiInputMultiOutput.getABIDecodedTransactionData(transaction); + expect(decodedInput, 'decoded input').to.be.deep.equal(input); + // execute transaction + const rawOutput = await web3Wrapper.callAsync({ + to: abiGenDummy.address, + data: transaction, + }); + // try decoding output + const decodedOutput = abiGenDummy.multiInputMultiOutput.getABIDecodedReturnData(rawOutput); + expect(decodedOutput, 'decoded output').to.be.deep.equal(output); + }); + }); }); describe('Lib dummy contract', () => {