From 360a55fa7c1e007bf9cfadb8a47334f28b34efb7 Mon Sep 17 00:00:00 2001 From: Nick Gheorghita Date: Fri, 26 Jul 2019 13:51:33 -0600 Subject: [PATCH 1/2] Add simple registry implementation to ethpm assets --- ethpm/assets/simple-registry/2.0.0a1.json | 1 + .../simple-registry/contracts/Ownable.sol | 63 +++ .../contracts/PackageRegistry.sol | 373 ++++++++++++++++++ .../contracts/PackageRegistryInterface.sol | 96 +++++ ethpm/assets/simple-registry/solc_input.json | 33 ++ ethpm/assets/simple-registry/solc_output.json | 1 + web3/pm.py | 2 +- 7 files changed, 568 insertions(+), 1 deletion(-) create mode 100644 ethpm/assets/simple-registry/2.0.0a1.json create mode 100644 ethpm/assets/simple-registry/contracts/Ownable.sol create mode 100644 ethpm/assets/simple-registry/contracts/PackageRegistry.sol create mode 100644 ethpm/assets/simple-registry/contracts/PackageRegistryInterface.sol create mode 100644 ethpm/assets/simple-registry/solc_input.json create mode 100644 ethpm/assets/simple-registry/solc_output.json diff --git a/ethpm/assets/simple-registry/2.0.0a1.json b/ethpm/assets/simple-registry/2.0.0a1.json new file mode 100644 index 0000000000..3d0a43d71c --- /dev/null +++ b/ethpm/assets/simple-registry/2.0.0a1.json @@ -0,0 +1 @@ +{"contract_types":{"Ownable":{"abi":[{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}],"compiler":{"name":"solc","settings":{"optimize":false},"version":"0.5.10+commit.5a6ea5b1"},"deployment_bytecode":{"bytecode":"0x"},"natspec":{"details":"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.","methods":{"constructor":{"details":"Initializes the contract setting the deployer as the initial owner."},"isOwner()":{"details":"Returns true if the caller is the current owner."},"owner()":{"details":"Returns the address of the current owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"runtime_bytecode":{"bytecode":"0x"}},"PackageRegistry":{"abi":[{"constant":true,"inputs":[{"name":"packageId","type":"bytes32"}],"name":"getPackageName","outputs":[{"name":"packageName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"getReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"name":"release","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllPackageIds","outputs":[{"name":"packageIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"releaseId","type":"bytes32"}],"name":"getReleaseData","outputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"packages","outputs":[{"name":"exists","type":"bool"},{"name":"createdAt","type":"uint256"},{"name":"updatedAt","type":"uint256"},{"name":"releaseCount","type":"uint256"},{"name":"name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"string"}],"name":"validateStringIdentifier","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"packageExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"string"}],"name":"validatePackageName","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"numPackageIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"string"}],"name":"generatePackageId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"generateReleaseId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllReleaseIds","outputs":[{"name":"releaseIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"numReleaseIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"packageCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"releaseExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"releases","outputs":[{"name":"exists","type":"bool"},{"name":"createdAt","type":"uint256"},{"name":"packageId","type":"bytes32"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"packageName","type":"string"},{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"manifestURI","type":"string"}],"name":"VersionRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"PackageTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}],"compiler":{"name":"solc","settings":{"optimize":false},"version":"0.5.10+commit.5a6ea5b1"},"deployment_bytecode":{"bytecode":"0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3612a21806100cf6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063938b056e116100b8578063c999a3b21161007c578063c999a3b214610d76578063eb8cc47c14610ea1578063ee0ebe0c14610f70578063efae87d714610f8e578063f2fde38b146110f8578063f491a84c1461113c57610137565b8063938b056e14610a32578063a54fb68514610b05578063abe827f214610b23578063b4b42e3514610bf2578063b8d08db214610d5857610137565b806371102819116100ff578063711028191461075957806382ee976f1461082057806383ea0620146108f35780638da5cb5b146109c65780638f32d59b14610a1057610137565b806306fe1fd71461013c5780631fb1c6c0146101e3578063379037dc1461034957806343212cf1146105465780634c4aea87146105da575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050611268565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a857808201518184015260208101905061018d565b50505050905090810190601f1680156101d55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610333600480360360408110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102ad57600080fd5b8201836020820111156102bf57600080fd5b803590602001918460018302840111640100000000831117156102e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113f8565b6040518082815260200191505060405180910390f35b6105306004803603606081101561035f57600080fd5b810190808035906020019064010000000081111561037c57600080fd5b82018360208201111561038e57600080fd5b803590602001918460018302840111640100000000831117156103b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561041357600080fd5b82018360208201111561042557600080fd5b8035906020019184600183028401116401000000008311171561044757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460018302840111640100000000831117156104de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611509565b6040518082815260200191505060405180910390f35b61057c6004803603604081101561055c57600080fd5b81019080803590602001909291908035906020019092919050505061169a565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156105c55780820151818401526020810190506105aa565b50505050905001935050505060405180910390f35b610606600480360360208110156105f057600080fd5b810190808035906020019092919050505061175c565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561064e578082015181840152602081019050610633565b50505050905090810190601f16801561067b5780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b838110156106b4578082015181840152602081019050610699565b50505050905090810190601f1680156106e15780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b8381101561071a5780820151818401526020810190506106ff565b50505050905090810190601f1680156107475780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6107856004803603602081101561076f57600080fd5b8101908080359060200190929190505050611a2a565b604051808615151515815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107e15780820151818401526020810190506107c6565b50505050905090810190601f16801561080e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6108d96004803603602081101561083657600080fd5b810190808035906020019064010000000081111561085357600080fd5b82018360208201111561086557600080fd5b8035906020019184600183028401116401000000008311171561088757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b05565b604051808215151515815260200191505060405180910390f35b6109ac6004803603602081101561090957600080fd5b810190808035906020019064010000000081111561092657600080fd5b82018360208201111561093857600080fd5b8035906020019184600183028401116401000000008311171561095a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b83565b604051808215151515815260200191505060405180910390f35b6109ce611bbd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a18611be6565b604051808215151515815260200191505060405180910390f35b610aeb60048036036020811015610a4857600080fd5b8101908080359060200190640100000000811115610a6557600080fd5b820183602082011115610a7757600080fd5b80359060200191846001830284011164010000000083111715610a9957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c3d565b604051808215151515815260200191505060405180910390f35b610b0d611cc8565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610b3957600080fd5b8101908080359060200190640100000000811115610b5657600080fd5b820183602082011115610b6857600080fd5b80359060200191846001830284011164010000000083111715610b8a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cd2565b6040518082815260200191505060405180910390f35b610d4260048036036040811015610c0857600080fd5b8101908080359060200190640100000000811115610c2557600080fd5b820183602082011115610c3757600080fd5b80359060200191846001830284011164010000000083111715610c5957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610cbc57600080fd5b820183602082011115610cce57600080fd5b80359060200191846001830284011164010000000083111715610cf057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d4d565b6040518082815260200191505060405180910390f35b610d60611e1c565b6040518082815260200191505060405180910390f35b610e4360048036036060811015610d8c57600080fd5b8101908080359060200190640100000000811115610da957600080fd5b820183602082011115610dbb57600080fd5b80359060200191846001830284011164010000000083111715610ddd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611e22565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015610e8c578082015181840152602081019050610e71565b50505050905001935050505060405180910390f35b610f5a60048036036020811015610eb757600080fd5b8101908080359060200190640100000000811115610ed457600080fd5b820183602082011115610ee657600080fd5b80359060200191846001830284011164010000000083111715610f0857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f9c565b6040518082815260200191505060405180910390f35b610f7861204d565b6040518082815260200191505060405180910390f35b6110de60048036036040811015610fa457600080fd5b8101908080359060200190640100000000811115610fc157600080fd5b820183602082011115610fd357600080fd5b80359060200191846001830284011164010000000083111715610ff557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105857600080fd5b82018360208201111561106a57600080fd5b8035906020019184600183028401116401000000008311171561108c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612053565b604051808215151515815260200191505060405180910390f35b61113a6004803603602081101561110e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612113565b005b6111686004803603602081101561115257600080fd5b8101908080359060200190929190505050612199565b60405180861515151581526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156111c25780820151818401526020810190506111a7565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561122857808201518184015260208101905061120d565b50505050905090810190601f1680156112555780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6060611272612835565b600160008481526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b50505050508152505090506001151581600001511515146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b8060800151915050919050565b60008261140481611b83565b611476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b83836114828282612053565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6114fe8686611d4d565b935050505092915050565b6000611513611be6565b611585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61158e84611c3d565b5061159883611b05565b506115a282611b05565b5060006115ae85611cd2565b905060006115bc8686611d4d565b90506000600160008481526020019081526020016000209050600015158160000160009054906101000a900460ff16151514156116765760018160000160006101000a81548160ff0219169083151502179055504281600101819055504281600201819055508681600401908051906020019061163a929190612866565b50600081600301819055508260046000600654815260200190815260200160002081905550600660008154809291906001019190505550611680565b4281600201819055505b61168d838389898961230c565b8193505050509392505050565b6060600060606000859050600060065482101561174c5781600654039050858111156116c4578590505b806040519080825280602002602001820160405280156116f35781602001602082028038833980820191505090505b5092505b600081111561174b576000600460008481526020019081526020016000205490508084600184038151811061172857fe5b6020026020010181815250508180600190039250508280600101935050506116f7565b5b8282945094505050509250929050565b60608060606117696128e6565b600260008681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050815250509050611904612835565b60016000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505081525050905080608001518260600151836080015182925081915080905094509450945050509193909250565b60016020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003015490806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b5050505050905085565b60008082511415611b7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e76616c69642d737472696e672d6964656e7469666965720000000000000081525060200191505060405180910390fd5b919050565b600080611b8f83611cd2565b90506001600082815260200190815260200160002060000160009054906101000a900460ff16915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600060028251118015611c51575060ff8251105b611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e76616c69642d7061636b6167652d6e616d6500000000000000000000000081525060200191505060405180910390fd5b919050565b6000600654905090565b6000816040516020018082805190602001908083835b60208310611d0b5780518252602082019150602081019050602083039250611ce8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050919050565b600082826040516020018083805190602001908083835b60208310611d875780518252602082019150602081019050602083039250611d64565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310611dd85780518252602082019150602081019050602083039250611db5565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405280519060200120905092915050565b60075481565b6060600084611e3081611b83565b611ea2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6000611ead87611cd2565b90506000600160008381526020019081526020016000209050606060008890506000808460030154905080831015611f8757828103915089821115611ef0578991505b81604051908082528060200260200182016040528015611f1f5781602001602082028038833980820191505090505b5093505b6000821115611f86576000611f3887856126b8565b905060006003600083815260200190815260200160002054905080866001860381518110611f6257fe5b60200260200101818152505083806001900394505084806001019550505050611f23565b5b83839850985050505050505050935093915050565b600081611fa881611b83565b61201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b600061202584611cd2565b9050600060016000838152602001908152602001600020905080600301549350505050919050565b60065481565b60008261205f81611b83565b6120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b60006120dd8585611d4d565b905060006002600083815260200190815260200160002090508060000160009054906101000a900460ff16935050505092915050565b61211b611be6565b61218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612196816126f1565b50565b60026020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123025780601f106122d757610100808354040283529160200191612302565b820191906000526020600020905b8154815290600101906020018083116122e557829003601f168201915b5050505050905085565b6000600260008681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d616c72656164792d6578697374730000000000000000000081525060200191505060405180910390fd5b60018160000160006101000a81548160ff021916908315150217905550428160010181905550858160020181905550828160030190805190602001906123f5929190612866565b508181600401908051906020019061240e929190612866565b5080600260008781526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff02191690831515021790555060018201548160010155600282015481600201556003820181600301908054600181600116156101000203166002900461248b92919061291a565b50600482018160040190805460018160011615610100020316600290046124b392919061291a565b5090505084600560006007548152602001908152602001600020819055506007600081548092919060010191905055506000600160008881526020019081526020016000209050600061250a8883600301546126b8565b905086600360008381526020019081526020016000208190555081600301600081548092919060010191905055507f489d8cf08b449d77a8953441a8d402a675aef55ac2fe367ca5b6b587737341c386868660405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156125a4578082015181840152602081019050612589565b50505050905090810190601f1680156125d15780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b8381101561260a5780820151818401526020810190506125ef565b50505050905090810190601f1680156126375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612670578082015181840152602081019050612655565b50505050905090810190601f16801561269d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15050505050505050565b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806129c76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060a00160405280600015158152602001600081526020016000815260200160008152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128a757805160ff19168380011785556128d5565b828001600101855582156128d5579182015b828111156128d45782518255916020019190600101906128b9565b5b5090506128e291906129a1565b5090565b6040518060a00160405280600015158152602001600081526020016000801916815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129535780548555612990565b8280016001018555821561299057600052602060002091601f016020900482015b8281111561298f578254825591600101919060010190612974565b5b50905061299d91906129a1565b5090565b6129c391905b808211156129bf5760008160009055506001016129a7565b5090565b9056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a265627a7a723058203303a3448bda11fd26ce9bcffb213dfc2b3f1a692632415c26340a9162d15e9c64736f6c634300050a0032"},"natspec":{"author":"Nick Gheorghita ","methods":{"generatePackageId(string)":{"details":"Returns name hash for a given package name.","params":{"name":"Package name"}},"getAllPackageIds(uint256,uint256)":{"details":"Returns a slice of the array of all package ids for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice."}},"getAllReleaseIds(string,uint256,uint256)":{"details":"Returns a slice of the array of all release hashes for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice.","packageName":"Package name"}},"getPackageName(bytes32)":{"details":"Returns the string name of the package associated with a package id","params":{"packageId":"The package id to look up"}},"getReleaseData(bytes32)":{"details":"Returns the package data for a release.","params":{"releaseId":"Release id"}},"getReleaseId(string,string)":{"details":"Returns the release id for a given name and version pair if present on registry.","params":{"packageName":"Package name","version":"Version string(ex: '1.0.0')"}},"isOwner()":{"details":"Returns true if the caller is the current owner."},"numPackageIds()":{"details":"Returns the number of packages stored on the registry"},"numReleaseIds(string)":{"details":"Returns the number of releases for a given package name on the registry","params":{"packageName":"Package name"}},"owner()":{"details":"Returns the address of the current owner."},"packageExists(string)":{"details":"Returns a bool indicating whether the given package exists in this registry.","params":{"packageName":"Package Name"}},"release(string,string,string)":{"details":"Creates a new release for the named package. If this is the first release for the given package then this will also create and store the package. Returns releaseID if successful.","params":{"manifestURI":"The URI for the release manifest for this release.","packageName":"Package name","version":"Version string (ex: '1.0.0')"}},"releaseExists(string,string)":{"details":"Returns a bool indicating whether the given release exists in this registry.","params":{"packageName":"Package Name","version":"version"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePackageName(string)":{"details":"Returns boolean whether the provided package name is valid.","params":{"name":"The name of the package."}},"validateStringIdentifier(string)":{"details":"Returns boolean whether the input string has a length","params":{"value":"The string to validate."}}},"title":"Contract for an ERC1319 Registry, adapted from ethpm/escape-truffle"},"runtime_bytecode":{"bytecode":"0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063938b056e116100b8578063c999a3b21161007c578063c999a3b214610d76578063eb8cc47c14610ea1578063ee0ebe0c14610f70578063efae87d714610f8e578063f2fde38b146110f8578063f491a84c1461113c57610137565b8063938b056e14610a32578063a54fb68514610b05578063abe827f214610b23578063b4b42e3514610bf2578063b8d08db214610d5857610137565b806371102819116100ff578063711028191461075957806382ee976f1461082057806383ea0620146108f35780638da5cb5b146109c65780638f32d59b14610a1057610137565b806306fe1fd71461013c5780631fb1c6c0146101e3578063379037dc1461034957806343212cf1146105465780634c4aea87146105da575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050611268565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a857808201518184015260208101905061018d565b50505050905090810190601f1680156101d55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610333600480360360408110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102ad57600080fd5b8201836020820111156102bf57600080fd5b803590602001918460018302840111640100000000831117156102e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113f8565b6040518082815260200191505060405180910390f35b6105306004803603606081101561035f57600080fd5b810190808035906020019064010000000081111561037c57600080fd5b82018360208201111561038e57600080fd5b803590602001918460018302840111640100000000831117156103b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561041357600080fd5b82018360208201111561042557600080fd5b8035906020019184600183028401116401000000008311171561044757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460018302840111640100000000831117156104de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611509565b6040518082815260200191505060405180910390f35b61057c6004803603604081101561055c57600080fd5b81019080803590602001909291908035906020019092919050505061169a565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156105c55780820151818401526020810190506105aa565b50505050905001935050505060405180910390f35b610606600480360360208110156105f057600080fd5b810190808035906020019092919050505061175c565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561064e578082015181840152602081019050610633565b50505050905090810190601f16801561067b5780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b838110156106b4578082015181840152602081019050610699565b50505050905090810190601f1680156106e15780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b8381101561071a5780820151818401526020810190506106ff565b50505050905090810190601f1680156107475780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6107856004803603602081101561076f57600080fd5b8101908080359060200190929190505050611a2a565b604051808615151515815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107e15780820151818401526020810190506107c6565b50505050905090810190601f16801561080e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6108d96004803603602081101561083657600080fd5b810190808035906020019064010000000081111561085357600080fd5b82018360208201111561086557600080fd5b8035906020019184600183028401116401000000008311171561088757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b05565b604051808215151515815260200191505060405180910390f35b6109ac6004803603602081101561090957600080fd5b810190808035906020019064010000000081111561092657600080fd5b82018360208201111561093857600080fd5b8035906020019184600183028401116401000000008311171561095a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b83565b604051808215151515815260200191505060405180910390f35b6109ce611bbd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a18611be6565b604051808215151515815260200191505060405180910390f35b610aeb60048036036020811015610a4857600080fd5b8101908080359060200190640100000000811115610a6557600080fd5b820183602082011115610a7757600080fd5b80359060200191846001830284011164010000000083111715610a9957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c3d565b604051808215151515815260200191505060405180910390f35b610b0d611cc8565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610b3957600080fd5b8101908080359060200190640100000000811115610b5657600080fd5b820183602082011115610b6857600080fd5b80359060200191846001830284011164010000000083111715610b8a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cd2565b6040518082815260200191505060405180910390f35b610d4260048036036040811015610c0857600080fd5b8101908080359060200190640100000000811115610c2557600080fd5b820183602082011115610c3757600080fd5b80359060200191846001830284011164010000000083111715610c5957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610cbc57600080fd5b820183602082011115610cce57600080fd5b80359060200191846001830284011164010000000083111715610cf057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d4d565b6040518082815260200191505060405180910390f35b610d60611e1c565b6040518082815260200191505060405180910390f35b610e4360048036036060811015610d8c57600080fd5b8101908080359060200190640100000000811115610da957600080fd5b820183602082011115610dbb57600080fd5b80359060200191846001830284011164010000000083111715610ddd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611e22565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015610e8c578082015181840152602081019050610e71565b50505050905001935050505060405180910390f35b610f5a60048036036020811015610eb757600080fd5b8101908080359060200190640100000000811115610ed457600080fd5b820183602082011115610ee657600080fd5b80359060200191846001830284011164010000000083111715610f0857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f9c565b6040518082815260200191505060405180910390f35b610f7861204d565b6040518082815260200191505060405180910390f35b6110de60048036036040811015610fa457600080fd5b8101908080359060200190640100000000811115610fc157600080fd5b820183602082011115610fd357600080fd5b80359060200191846001830284011164010000000083111715610ff557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105857600080fd5b82018360208201111561106a57600080fd5b8035906020019184600183028401116401000000008311171561108c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612053565b604051808215151515815260200191505060405180910390f35b61113a6004803603602081101561110e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612113565b005b6111686004803603602081101561115257600080fd5b8101908080359060200190929190505050612199565b60405180861515151581526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156111c25780820151818401526020810190506111a7565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561122857808201518184015260208101905061120d565b50505050905090810190601f1680156112555780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6060611272612835565b600160008481526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b50505050508152505090506001151581600001511515146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b8060800151915050919050565b60008261140481611b83565b611476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b83836114828282612053565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6114fe8686611d4d565b935050505092915050565b6000611513611be6565b611585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61158e84611c3d565b5061159883611b05565b506115a282611b05565b5060006115ae85611cd2565b905060006115bc8686611d4d565b90506000600160008481526020019081526020016000209050600015158160000160009054906101000a900460ff16151514156116765760018160000160006101000a81548160ff0219169083151502179055504281600101819055504281600201819055508681600401908051906020019061163a929190612866565b50600081600301819055508260046000600654815260200190815260200160002081905550600660008154809291906001019190505550611680565b4281600201819055505b61168d838389898961230c565b8193505050509392505050565b6060600060606000859050600060065482101561174c5781600654039050858111156116c4578590505b806040519080825280602002602001820160405280156116f35781602001602082028038833980820191505090505b5092505b600081111561174b576000600460008481526020019081526020016000205490508084600184038151811061172857fe5b6020026020010181815250508180600190039250508280600101935050506116f7565b5b8282945094505050509250929050565b60608060606117696128e6565b600260008681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050815250509050611904612835565b60016000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505081525050905080608001518260600151836080015182925081915080905094509450945050509193909250565b60016020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003015490806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b5050505050905085565b60008082511415611b7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e76616c69642d737472696e672d6964656e7469666965720000000000000081525060200191505060405180910390fd5b919050565b600080611b8f83611cd2565b90506001600082815260200190815260200160002060000160009054906101000a900460ff16915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600060028251118015611c51575060ff8251105b611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e76616c69642d7061636b6167652d6e616d6500000000000000000000000081525060200191505060405180910390fd5b919050565b6000600654905090565b6000816040516020018082805190602001908083835b60208310611d0b5780518252602082019150602081019050602083039250611ce8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050919050565b600082826040516020018083805190602001908083835b60208310611d875780518252602082019150602081019050602083039250611d64565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310611dd85780518252602082019150602081019050602083039250611db5565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405280519060200120905092915050565b60075481565b6060600084611e3081611b83565b611ea2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6000611ead87611cd2565b90506000600160008381526020019081526020016000209050606060008890506000808460030154905080831015611f8757828103915089821115611ef0578991505b81604051908082528060200260200182016040528015611f1f5781602001602082028038833980820191505090505b5093505b6000821115611f86576000611f3887856126b8565b905060006003600083815260200190815260200160002054905080866001860381518110611f6257fe5b60200260200101818152505083806001900394505084806001019550505050611f23565b5b83839850985050505050505050935093915050565b600081611fa881611b83565b61201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b600061202584611cd2565b9050600060016000838152602001908152602001600020905080600301549350505050919050565b60065481565b60008261205f81611b83565b6120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b60006120dd8585611d4d565b905060006002600083815260200190815260200160002090508060000160009054906101000a900460ff16935050505092915050565b61211b611be6565b61218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612196816126f1565b50565b60026020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123025780601f106122d757610100808354040283529160200191612302565b820191906000526020600020905b8154815290600101906020018083116122e557829003601f168201915b5050505050905085565b6000600260008681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d616c72656164792d6578697374730000000000000000000081525060200191505060405180910390fd5b60018160000160006101000a81548160ff021916908315150217905550428160010181905550858160020181905550828160030190805190602001906123f5929190612866565b508181600401908051906020019061240e929190612866565b5080600260008781526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff02191690831515021790555060018201548160010155600282015481600201556003820181600301908054600181600116156101000203166002900461248b92919061291a565b50600482018160040190805460018160011615610100020316600290046124b392919061291a565b5090505084600560006007548152602001908152602001600020819055506007600081548092919060010191905055506000600160008881526020019081526020016000209050600061250a8883600301546126b8565b905086600360008381526020019081526020016000208190555081600301600081548092919060010191905055507f489d8cf08b449d77a8953441a8d402a675aef55ac2fe367ca5b6b587737341c386868660405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156125a4578082015181840152602081019050612589565b50505050905090810190601f1680156125d15780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b8381101561260a5780820151818401526020810190506125ef565b50505050905090810190601f1680156126375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612670578082015181840152602081019050612655565b50505050905090810190601f16801561269d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15050505050505050565b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806129c76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060a00160405280600015158152602001600081526020016000815260200160008152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128a757805160ff19168380011785556128d5565b828001600101855582156128d5579182015b828111156128d45782518255916020019190600101906128b9565b5b5090506128e291906129a1565b5090565b6040518060a00160405280600015158152602001600081526020016000801916815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129535780548555612990565b8280016001018555821561299057600052602060002091601f016020900482015b8281111561298f578254825591600101919060010190612974565b5b50905061299d91906129a1565b5090565b6129c391905b808211156129bf5760008160009055506001016129a7565b5090565b9056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a265627a7a723058203303a3448bda11fd26ce9bcffb213dfc2b3f1a692632415c26340a9162d15e9c64736f6c634300050a0032"}},"PackageRegistryInterface":{"abi":[{"constant":true,"inputs":[{"name":"packageId","type":"bytes32"}],"name":"getPackageName","outputs":[{"name":"packageName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"getReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"name":"release","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllPackageIds","outputs":[{"name":"packageIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"releaseId","type":"bytes32"}],"name":"getReleaseData","outputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numPackageIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"generateReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllReleaseIds","outputs":[{"name":"releaseIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"numReleaseIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}],"compiler":{"name":"solc","settings":{"optimize":false},"version":"0.5.10+commit.5a6ea5b1"},"deployment_bytecode":{"bytecode":"0x"},"natspec":{"author":"Piper Merriam , Christopher Gewecke ","methods":{"getAllPackageIds(uint256,uint256)":{"details":"Returns a slice of the array of all package ids for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice."}},"getAllReleaseIds(string,uint256,uint256)":{"details":"Returns a slice of the array of all release hashes for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice.","packageName":"Package name"}},"getPackageName(bytes32)":{"details":"Returns the string name of the package associated with a package id","params":{"packageId":"The package id to look up"}},"getReleaseData(bytes32)":{"details":"Returns the package data for a release.","params":{"releaseId":"Release id"}},"getReleaseId(string,string)":{"details":"Returns the release id for a given name and version pair if present on registry.","params":{"packageName":"Package name","version":"Version string(ex: '1.0.0')"}},"numPackageIds()":{"details":"Returns the number of packages stored on the registry"},"numReleaseIds(string)":{"details":"Returns the number of releases for a given package name on the registry","params":{"packageName":"Package name"}},"release(string,string,string)":{"details":"Creates a a new release for the named package.","params":{"manifestURI":"The URI for the release manifest for this release.","packageName":"Package name","version":"Version string (ex: 1.0.0)"}}},"title":"EIP 1319 Smart Contract Package Registry Interface"},"runtime_bytecode":{"bytecode":"0x"}}},"manifest_version":"2","meta":{"authors":["Nick Gheorghita"],"description":"A basic Solidity implementation of ERC1319.","keywords":["ethpm"," erc1319"," solidity"," ethereum"," package registry"],"license":"MIT","links":{"documentation":"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1319.md","repo":"https://github.com/ethpm/solidity-registry/","website":"www.ethpm.com"}},"package_name":"ethpm-registry","sources":{"./Ownable.sol":"pragma solidity ^0.5.0;\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\ncontract Ownable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () internal {\n _owner = msg.sender;\n emit OwnershipTransferred(address(0), _owner);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(isOwner(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Returns true if the caller is the current owner.\n */\n function isOwner() public view returns (bool) {\n return msg.sender == _owner;\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public onlyOwner {\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n */\n function _transferOwnership(address newOwner) internal {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}","./PackageRegistry.sol":"pragma solidity >=0.5.10;\n\nimport {PackageRegistryInterface} from \"./PackageRegistryInterface.sol\";\nimport {Ownable} from \"./Ownable.sol\";\n\n/// @title Contract for an ERC1319 Registry, adapted from ethpm/escape-truffle\n/// @author Nick Gheorghita \ncontract PackageRegistry is PackageRegistryInterface, Ownable {\n struct Package {\n bool exists;\n uint createdAt;\n uint updatedAt;\n uint releaseCount;\n string name;\n }\n\n struct Release {\n bool exists;\n uint createdAt;\n bytes32 packageId;\n string version;\n string manifestURI;\n }\n\n mapping (bytes32 => Package) public packages;\n mapping (bytes32 => Release) public releases;\n\n // package_id#release_count => release_id\n mapping (bytes32 => bytes32) packageReleaseIndex;\n // Total package number (int128) => package_id (bytes32)\n mapping (uint => bytes32) allPackageIds;\n // Total release number (int128) => release_id (bytes32)\n mapping (uint => bytes32) allReleaseIds;\n // Total number of packages in registry\n uint public packageCount;\n // Total number of releases in registry\n uint public releaseCount;\n\n // Events\n event VersionRelease(string packageName, string version, string manifestURI);\n event PackageTransfer(address indexed oldOwner, address indexed newOwner);\n\n // Modifiers\n modifier onlyIfPackageExists(string memory packageName) {\n require(packageExists(packageName), \"package-does-not-exist\");\n _;\n }\n\n modifier onlyIfReleaseExists(string memory packageName, string memory version) {\n require (releaseExists(packageName, version), \"release-does-not-exist\");\n _;\n }\n\n //\n // ===============\n // | Write API |\n // ===============\n //\n\n /// @dev Creates a new release for the named package. If this is the first release for the given\n /// package then this will also create and store the package. Returns releaseID if successful.\n /// @notice Will create a new release the given package with the given release information.\n /// @param packageName Package name\n /// @param version Version string (ex: '1.0.0')\n /// @param manifestURI The URI for the release manifest for this release.\n function release(\n string memory packageName,\n string memory version,\n string memory manifestURI\n )\n public\n onlyOwner\n returns (bytes32)\n {\n validatePackageName(packageName);\n validateStringIdentifier(version);\n validateStringIdentifier(manifestURI);\n\n // Compute hashes\n bytes32 packageId = generatePackageId(packageName);\n bytes32 releaseId = generateReleaseId(packageName, version);\n Package storage package = packages[packageId];\n\n // If the package does not yet exist create it\n if (package.exists == false) {\n package.exists = true;\n package.createdAt = block.timestamp;\n package.updatedAt = block.timestamp;\n package.name = packageName;\n package.releaseCount = 0;\n allPackageIds[packageCount] = packageId;\n packageCount++;\n } else {\n package.updatedAt = block.timestamp;\n }\n cutRelease(packageId, releaseId, packageName, version, manifestURI);\n return releaseId;\n }\n\n function cutRelease(\n bytes32 packageId,\n bytes32 releaseId,\n string memory packageName,\n string memory version,\n string memory manifestURI\n )\n private\n {\n Release storage newRelease = releases[releaseId];\n require(newRelease.exists == false, \"release-already-exists\");\n\n // Store new release data\n newRelease.exists = true;\n newRelease.createdAt = block.timestamp;\n newRelease.packageId = packageId;\n newRelease.version = version;\n newRelease.manifestURI = manifestURI;\n\n releases[releaseId] = newRelease;\n allReleaseIds[releaseCount] = releaseId;\n releaseCount++;\n\n // Update package's release count\n Package storage package = packages[packageId];\n bytes32 packageReleaseId = generatePackageReleaseId(packageId, package.releaseCount);\n packageReleaseIndex[packageReleaseId] = releaseId;\n package.releaseCount++;\n\n // Log the release.\n emit VersionRelease(packageName, version, manifestURI);\n }\n\n //\n // ==============\n // | Read API |\n // ==============\n //\n\n /// @dev Returns the string name of the package associated with a package id\n /// @param packageId The package id to look up\n function getPackageName(bytes32 packageId)\n public\n view\n returns (string memory packageName)\n {\n Package memory targetPackage = packages[packageId];\n require (targetPackage.exists == true, \"package-does-not-exist\");\n return targetPackage.name;\n }\n\n /// @dev Returns a slice of the array of all package ids for the named package.\n /// @param offset The starting index for the slice.\n /// @param limit The length of the slice\n function getAllPackageIds(uint offset, uint limit)\n public\n view\n returns (\n bytes32[] memory packageIds,\n uint pointer\n )\n {\n bytes32[] memory hashes; // Array of package ids to return\n uint cursor = offset; // Index counter to traverse DB array\n uint remaining; // Counter to collect `limit` packages\n\n // Is request within range?\n if (cursor < packageCount){\n\n // Get total remaining records\n remaining = packageCount - cursor;\n\n // Number of records to collect is lesser of `remaining` and `limit`\n if (remaining > limit ){\n remaining = limit;\n }\n\n // Allocate return array\n hashes = new bytes32[](remaining);\n\n // Collect records.\n while(remaining > 0){\n bytes32 hash = allPackageIds[cursor];\n hashes[remaining - 1] = hash;\n remaining--;\n cursor++;\n }\n }\n return (hashes, cursor);\n }\n\n /// @dev Returns a slice of the array of all release hashes for the named package.\n /// @param packageName Package name\n /// @param offset The starting index for the slice.\n /// @param limit The length of the slice\n function getAllReleaseIds(string memory packageName, uint offset, uint limit)\n public\n view\n onlyIfPackageExists(packageName)\n returns (\n bytes32[] memory releaseIds,\n uint pointer\n )\n {\n bytes32 packageId = generatePackageId(packageName);\n Package storage package = packages[packageId];\n bytes32[] memory hashes; // Release ids to return\n uint cursor = offset; // Index counter to traverse DB array\n uint remaining; // Counter to collect `limit` packages\n uint numPackageReleases = package.releaseCount;\t\t // Total number of packages in registry\n\n // Is request within range?\n if (cursor < numPackageReleases){\n\n // Get total remaining records\n remaining = numPackageReleases - cursor;\n\n // Number of records to collect is lesser of `remaining` and `limit`\n if (remaining > limit ){\n remaining = limit;\n }\n\n // Allocate return array\n hashes = new bytes32[](remaining);\n\n // Collect records.\n while(remaining > 0){\n bytes32 packageReleaseId = generatePackageReleaseId(packageId, cursor);\n bytes32 hash = packageReleaseIndex[packageReleaseId];\n hashes[remaining - 1] = hash;\n remaining--;\n cursor++;\n }\n }\n return (hashes, cursor);\n }\n\n\n /// @dev Returns the package data for a release.\n /// @param releaseId Release id\n function getReleaseData(bytes32 releaseId)\n public\n view\n returns (\n string memory packageName, string memory version,\n string memory manifestURI\n )\n {\n Release memory targetRelease = releases[releaseId];\n Package memory targetPackage = packages[targetRelease.packageId];\n return (targetPackage.name, targetRelease.version, targetRelease.manifestURI);\n }\n\n /// @dev Returns the release id for a given name and version pair if present on registry.\n /// @param packageName Package name\n /// @param version Version string(ex: '1.0.0')\n function getReleaseId(string memory packageName, string memory version)\n public\n view\n onlyIfPackageExists(packageName)\n onlyIfReleaseExists(packageName, version)\n returns (bytes32 releaseId)\n {\n return generateReleaseId(packageName, version);\n }\n\n /// @dev Returns the number of packages stored on the registry\n function numPackageIds() public view returns (uint totalCount)\n {\n return packageCount;\n }\n\n /// @dev Returns the number of releases for a given package name on the registry\n /// @param packageName Package name\n function numReleaseIds(string memory packageName)\n public\n view\n onlyIfPackageExists(packageName)\n returns (uint totalCount)\n {\n bytes32 packageId = generatePackageId(packageName);\n Package storage package = packages[packageId];\n return package.releaseCount;\n }\n\n /// @dev Returns a bool indicating whether the given release exists in this registry.\n /// @param packageName Package Name\n /// @param version version\n function releaseExists(string memory packageName, string memory version)\n public\n view\n onlyIfPackageExists(packageName)\n returns (bool)\n {\n bytes32 releaseId = generateReleaseId(packageName, version);\n Release storage targetRelease = releases[releaseId];\n return targetRelease.exists;\n }\n\n /// @dev Returns a bool indicating whether the given package exists in this registry.\n /// @param packageName Package Name\n function packageExists(string memory packageName) public view returns (bool) {\n bytes32 packageId = generatePackageId(packageName);\n return packages[packageId].exists;\n }\n\n //\n // ====================\n // | Hash Functions |\n // ====================\n // \n\n /// @dev Returns name hash for a given package name.\n /// @param name Package name\n function generatePackageId(string memory name)\n public\n pure\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(name));\n }\n\n // @dev Returns release id that *would* be generated for a name and version pair on `release`.\n // @param packageName Package name\n // @param version Version string (ex: '1.0.0')\n function generateReleaseId(\n string memory packageName,\n string memory version\n )\n public\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(packageName, version));\n }\n\n function generatePackageReleaseId(\n bytes32 packageId,\n uint packageReleaseCount\n )\n private\n\t\tpure\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(packageId, packageReleaseCount));\n }\n\n\n //\n // ================\n // | Validation |\n // ================\n //\n\n /// @dev Returns boolean whether the provided package name is valid.\n /// @param name The name of the package.\n function validatePackageName(string memory name)\n public\n pure\n returns (bool)\n {\n require (bytes(name).length > 2 && bytes(name).length < 255, \"invalid-package-name\");\n }\n\n /// @dev Returns boolean whether the input string has a length\n /// @param value The string to validate.\n function validateStringIdentifier(string memory value)\n public\n pure\n returns (bool)\n {\n require (bytes(value).length != 0, \"invalid-string-identifier\");\n }\n}","./PackageRegistryInterface.sol":"pragma solidity >=0.5.10;\n\n\n/// @title EIP 1319 Smart Contract Package Registry Interface\n/// @author Piper Merriam , Christopher Gewecke \ncontract PackageRegistryInterface {\n\n //\n // +-------------+\n // | Write API |\n // +-------------+\n //\n\n /// @dev Creates a a new release for the named package.\n /// @notice Will create a new release the given package with the given release information.\n /// @param packageName Package name\n /// @param version Version string (ex: 1.0.0)\n /// @param manifestURI The URI for the release manifest for this release.\n function release(\n string memory packageName,\n string memory version,\n string memory manifestURI\n )\n public\n returns (bytes32 releaseId);\n\n //\n // +------------+\n // | Read API |\n // +------------+\n //\n\n /// @dev Returns the string name of the package associated with a package id\n /// @param packageId The package id to look up\n function getPackageName(bytes32 packageId)\n public\n view\n returns (string memory packageName);\n\n /// @dev Returns a slice of the array of all package ids for the named package.\n /// @param offset The starting index for the slice.\n /// @param limit The length of the slice\n function getAllPackageIds(uint offset, uint limit)\n public\n view\n returns (\n bytes32[] memory packageIds,\n uint pointer\n );\n\n /// @dev Returns a slice of the array of all release hashes for the named package.\n /// @param packageName Package name\n /// @param offset The starting index for the slice.\n /// @param limit The length of the slice\n function getAllReleaseIds(string memory packageName, uint offset, uint limit)\n public\n view\n returns (\n bytes32[] memory releaseIds,\n uint pointer\n );\n\n /// @dev Returns the package data for a release.\n /// @param releaseId Release id\n function getReleaseData(bytes32 releaseId)\n public\n view\n returns (\n string memory packageName,\n string memory version,\n string memory manifestURI\n );\n\n // @dev Returns release id that *would* be generated for a name and version pair on `release`.\n // @param packageName Package name\n // @param version Version string (ex: '1.0.0')\n function generateReleaseId(string memory packageName, string memory version)\n public\n view\n returns (bytes32 releaseId);\n\n /// @dev Returns the release id for a given name and version pair if present on registry.\n /// @param packageName Package name\n /// @param version Version string(ex: '1.0.0')\n function getReleaseId(string memory packageName, string memory version)\n public\n view\n returns (bytes32 releaseId);\n\n /// @dev Returns the number of packages stored on the registry\n function numPackageIds() public view returns (uint totalCount);\n\n /// @dev Returns the number of releases for a given package name on the registry\n /// @param packageName Package name\n function numReleaseIds(string memory packageName) public view returns (uint totalCount);\n}"},"version":"2.0.0a1"} \ No newline at end of file diff --git a/ethpm/assets/simple-registry/contracts/Ownable.sol b/ethpm/assets/simple-registry/contracts/Ownable.sol new file mode 100644 index 0000000000..b2bd6f666d --- /dev/null +++ b/ethpm/assets/simple-registry/contracts/Ownable.sol @@ -0,0 +1,63 @@ +pragma solidity ^0.5.0; + +/** + * @dev Contract module which provides a basic access control mechanism, where + * there is an account (an owner) that can be granted exclusive access to + * specific functions. + * + * This module is used through inheritance. It will make available the modifier + * `onlyOwner`, which can be applied to your functions to restrict their use to + * the owner. + */ +contract Ownable { + address private _owner; + + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + /** + * @dev Initializes the contract setting the deployer as the initial owner. + */ + constructor () internal { + _owner = msg.sender; + emit OwnershipTransferred(address(0), _owner); + } + + /** + * @dev Returns the address of the current owner. + */ + function owner() public view returns (address) { + return _owner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(isOwner(), "Ownable: caller is not the owner"); + _; + } + + /** + * @dev Returns true if the caller is the current owner. + */ + function isOwner() public view returns (bool) { + return msg.sender == _owner; + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + */ + function transferOwnership(address newOwner) public onlyOwner { + _transferOwnership(newOwner); + } + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + */ + function _transferOwnership(address newOwner) internal { + require(newOwner != address(0), "Ownable: new owner is the zero address"); + emit OwnershipTransferred(_owner, newOwner); + _owner = newOwner; + } +} diff --git a/ethpm/assets/simple-registry/contracts/PackageRegistry.sol b/ethpm/assets/simple-registry/contracts/PackageRegistry.sol new file mode 100644 index 0000000000..e1d478c053 --- /dev/null +++ b/ethpm/assets/simple-registry/contracts/PackageRegistry.sol @@ -0,0 +1,373 @@ +pragma solidity >=0.5.10; + +import {PackageRegistryInterface} from "./PackageRegistryInterface.sol"; +import {Ownable} from "./Ownable.sol"; + +/// @title Contract for an ERC1319 Registry, adapted from ethpm/escape-truffle +/// @author Nick Gheorghita +contract PackageRegistry is PackageRegistryInterface, Ownable { + struct Package { + bool exists; + uint createdAt; + uint updatedAt; + uint releaseCount; + string name; + } + + struct Release { + bool exists; + uint createdAt; + bytes32 packageId; + string version; + string manifestURI; + } + + mapping (bytes32 => Package) public packages; + mapping (bytes32 => Release) public releases; + + // package_id#release_count => release_id + mapping (bytes32 => bytes32) packageReleaseIndex; + // Total package number (int128) => package_id (bytes32) + mapping (uint => bytes32) allPackageIds; + // Total release number (int128) => release_id (bytes32) + mapping (uint => bytes32) allReleaseIds; + // Total number of packages in registry + uint public packageCount; + // Total number of releases in registry + uint public releaseCount; + + // Events + event VersionRelease(string packageName, string version, string manifestURI); + event PackageTransfer(address indexed oldOwner, address indexed newOwner); + + // Modifiers + modifier onlyIfPackageExists(string memory packageName) { + require(packageExists(packageName), "package-does-not-exist"); + _; + } + + modifier onlyIfReleaseExists(string memory packageName, string memory version) { + require (releaseExists(packageName, version), "release-does-not-exist"); + _; + } + + // + // =============== + // | Write API | + // =============== + // + + /// @dev Creates a new release for the named package. If this is the first release for the given + /// package then this will also create and store the package. Returns releaseID if successful. + /// @notice Will create a new release the given package with the given release information. + /// @param packageName Package name + /// @param version Version string (ex: '1.0.0') + /// @param manifestURI The URI for the release manifest for this release. + function release( + string memory packageName, + string memory version, + string memory manifestURI + ) + public + onlyOwner + returns (bytes32) + { + validatePackageName(packageName); + validateStringIdentifier(version); + validateStringIdentifier(manifestURI); + + // Compute hashes + bytes32 packageId = generatePackageId(packageName); + bytes32 releaseId = generateReleaseId(packageName, version); + Package storage package = packages[packageId]; + + // If the package does not yet exist create it + if (package.exists == false) { + package.exists = true; + package.createdAt = block.timestamp; + package.updatedAt = block.timestamp; + package.name = packageName; + package.releaseCount = 0; + allPackageIds[packageCount] = packageId; + packageCount++; + } else { + package.updatedAt = block.timestamp; + } + cutRelease(packageId, releaseId, packageName, version, manifestURI); + return releaseId; + } + + function cutRelease( + bytes32 packageId, + bytes32 releaseId, + string memory packageName, + string memory version, + string memory manifestURI + ) + private + { + Release storage newRelease = releases[releaseId]; + require(newRelease.exists == false, "release-already-exists"); + + // Store new release data + newRelease.exists = true; + newRelease.createdAt = block.timestamp; + newRelease.packageId = packageId; + newRelease.version = version; + newRelease.manifestURI = manifestURI; + + releases[releaseId] = newRelease; + allReleaseIds[releaseCount] = releaseId; + releaseCount++; + + // Update package's release count + Package storage package = packages[packageId]; + bytes32 packageReleaseId = generatePackageReleaseId(packageId, package.releaseCount); + packageReleaseIndex[packageReleaseId] = releaseId; + package.releaseCount++; + + // Log the release. + emit VersionRelease(packageName, version, manifestURI); + } + + // + // ============== + // | Read API | + // ============== + // + + /// @dev Returns the string name of the package associated with a package id + /// @param packageId The package id to look up + function getPackageName(bytes32 packageId) + public + view + returns (string memory packageName) + { + Package memory targetPackage = packages[packageId]; + require (targetPackage.exists == true, "package-does-not-exist"); + return targetPackage.name; + } + + /// @dev Returns a slice of the array of all package ids for the named package. + /// @param offset The starting index for the slice. + /// @param limit The length of the slice + function getAllPackageIds(uint offset, uint limit) + public + view + returns ( + bytes32[] memory packageIds, + uint pointer + ) + { + bytes32[] memory hashes; // Array of package ids to return + uint cursor = offset; // Index counter to traverse DB array + uint remaining; // Counter to collect `limit` packages + + // Is request within range? + if (cursor < packageCount){ + + // Get total remaining records + remaining = packageCount - cursor; + + // Number of records to collect is lesser of `remaining` and `limit` + if (remaining > limit ){ + remaining = limit; + } + + // Allocate return array + hashes = new bytes32[](remaining); + + // Collect records. + while(remaining > 0){ + bytes32 hash = allPackageIds[cursor]; + hashes[remaining - 1] = hash; + remaining--; + cursor++; + } + } + return (hashes, cursor); + } + + /// @dev Returns a slice of the array of all release hashes for the named package. + /// @param packageName Package name + /// @param offset The starting index for the slice. + /// @param limit The length of the slice + function getAllReleaseIds(string memory packageName, uint offset, uint limit) + public + view + onlyIfPackageExists(packageName) + returns ( + bytes32[] memory releaseIds, + uint pointer + ) + { + bytes32 packageId = generatePackageId(packageName); + Package storage package = packages[packageId]; + bytes32[] memory hashes; // Release ids to return + uint cursor = offset; // Index counter to traverse DB array + uint remaining; // Counter to collect `limit` packages + uint numPackageReleases = package.releaseCount; // Total number of packages in registry + + // Is request within range? + if (cursor < numPackageReleases){ + + // Get total remaining records + remaining = numPackageReleases - cursor; + + // Number of records to collect is lesser of `remaining` and `limit` + if (remaining > limit ){ + remaining = limit; + } + + // Allocate return array + hashes = new bytes32[](remaining); + + // Collect records. + while(remaining > 0){ + bytes32 packageReleaseId = generatePackageReleaseId(packageId, cursor); + bytes32 hash = packageReleaseIndex[packageReleaseId]; + hashes[remaining - 1] = hash; + remaining--; + cursor++; + } + } + return (hashes, cursor); + } + + + /// @dev Returns the package data for a release. + /// @param releaseId Release id + function getReleaseData(bytes32 releaseId) + public + view + returns ( + string memory packageName, string memory version, + string memory manifestURI + ) + { + Release memory targetRelease = releases[releaseId]; + Package memory targetPackage = packages[targetRelease.packageId]; + return (targetPackage.name, targetRelease.version, targetRelease.manifestURI); + } + + /// @dev Returns the release id for a given name and version pair if present on registry. + /// @param packageName Package name + /// @param version Version string(ex: '1.0.0') + function getReleaseId(string memory packageName, string memory version) + public + view + onlyIfPackageExists(packageName) + onlyIfReleaseExists(packageName, version) + returns (bytes32 releaseId) + { + return generateReleaseId(packageName, version); + } + + /// @dev Returns the number of packages stored on the registry + function numPackageIds() public view returns (uint totalCount) + { + return packageCount; + } + + /// @dev Returns the number of releases for a given package name on the registry + /// @param packageName Package name + function numReleaseIds(string memory packageName) + public + view + onlyIfPackageExists(packageName) + returns (uint totalCount) + { + bytes32 packageId = generatePackageId(packageName); + Package storage package = packages[packageId]; + return package.releaseCount; + } + + /// @dev Returns a bool indicating whether the given release exists in this registry. + /// @param packageName Package Name + /// @param version version + function releaseExists(string memory packageName, string memory version) + public + view + onlyIfPackageExists(packageName) + returns (bool) + { + bytes32 releaseId = generateReleaseId(packageName, version); + Release storage targetRelease = releases[releaseId]; + return targetRelease.exists; + } + + /// @dev Returns a bool indicating whether the given package exists in this registry. + /// @param packageName Package Name + function packageExists(string memory packageName) public view returns (bool) { + bytes32 packageId = generatePackageId(packageName); + return packages[packageId].exists; + } + + // + // ==================== + // | Hash Functions | + // ==================== + // + + /// @dev Returns name hash for a given package name. + /// @param name Package name + function generatePackageId(string memory name) + public + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(name)); + } + + // @dev Returns release id that *would* be generated for a name and version pair on `release`. + // @param packageName Package name + // @param version Version string (ex: '1.0.0') + function generateReleaseId( + string memory packageName, + string memory version + ) + public + view + returns (bytes32) + { + return keccak256(abi.encodePacked(packageName, version)); + } + + function generatePackageReleaseId( + bytes32 packageId, + uint packageReleaseCount + ) + private + pure + returns (bytes32) + { + return keccak256(abi.encodePacked(packageId, packageReleaseCount)); + } + + + // + // ================ + // | Validation | + // ================ + // + + /// @dev Returns boolean whether the provided package name is valid. + /// @param name The name of the package. + function validatePackageName(string memory name) + public + pure + returns (bool) + { + require (bytes(name).length > 2 && bytes(name).length < 255, "invalid-package-name"); + } + + /// @dev Returns boolean whether the input string has a length + /// @param value The string to validate. + function validateStringIdentifier(string memory value) + public + pure + returns (bool) + { + require (bytes(value).length != 0, "invalid-string-identifier"); + } +} diff --git a/ethpm/assets/simple-registry/contracts/PackageRegistryInterface.sol b/ethpm/assets/simple-registry/contracts/PackageRegistryInterface.sol new file mode 100644 index 0000000000..59cc272643 --- /dev/null +++ b/ethpm/assets/simple-registry/contracts/PackageRegistryInterface.sol @@ -0,0 +1,96 @@ +pragma solidity >=0.5.10; + + +/// @title EIP 1319 Smart Contract Package Registry Interface +/// @author Piper Merriam , Christopher Gewecke +contract PackageRegistryInterface { + + // + // +-------------+ + // | Write API | + // +-------------+ + // + + /// @dev Creates a a new release for the named package. + /// @notice Will create a new release the given package with the given release information. + /// @param packageName Package name + /// @param version Version string (ex: 1.0.0) + /// @param manifestURI The URI for the release manifest for this release. + function release( + string memory packageName, + string memory version, + string memory manifestURI + ) + public + returns (bytes32 releaseId); + + // + // +------------+ + // | Read API | + // +------------+ + // + + /// @dev Returns the string name of the package associated with a package id + /// @param packageId The package id to look up + function getPackageName(bytes32 packageId) + public + view + returns (string memory packageName); + + /// @dev Returns a slice of the array of all package ids for the named package. + /// @param offset The starting index for the slice. + /// @param limit The length of the slice + function getAllPackageIds(uint offset, uint limit) + public + view + returns ( + bytes32[] memory packageIds, + uint pointer + ); + + /// @dev Returns a slice of the array of all release hashes for the named package. + /// @param packageName Package name + /// @param offset The starting index for the slice. + /// @param limit The length of the slice + function getAllReleaseIds(string memory packageName, uint offset, uint limit) + public + view + returns ( + bytes32[] memory releaseIds, + uint pointer + ); + + /// @dev Returns the package data for a release. + /// @param releaseId Release id + function getReleaseData(bytes32 releaseId) + public + view + returns ( + string memory packageName, + string memory version, + string memory manifestURI + ); + + // @dev Returns release id that *would* be generated for a name and version pair on `release`. + // @param packageName Package name + // @param version Version string (ex: '1.0.0') + function generateReleaseId(string memory packageName, string memory version) + public + view + returns (bytes32 releaseId); + + /// @dev Returns the release id for a given name and version pair if present on registry. + /// @param packageName Package name + /// @param version Version string(ex: '1.0.0') + function getReleaseId(string memory packageName, string memory version) + public + view + returns (bytes32 releaseId); + + /// @dev Returns the number of packages stored on the registry + function numPackageIds() public view returns (uint totalCount); + + /// @dev Returns the number of releases for a given package name on the registry + /// @param packageName Package name + function numReleaseIds(string memory packageName) public view returns (uint totalCount); +} diff --git a/ethpm/assets/simple-registry/solc_input.json b/ethpm/assets/simple-registry/solc_input.json new file mode 100644 index 0000000000..7c7f262193 --- /dev/null +++ b/ethpm/assets/simple-registry/solc_input.json @@ -0,0 +1,33 @@ +{ + "language": "Solidity", + "settings": { + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode.object", + "evm.deployedBytecode", + "metadata", + "devdoc" + ] + } + } + }, + "sources": { + "PackageRegistryInterface.sol": { + "urls": [ + "/Users/nickgheorghita/ethereum/ethpm-cli/projects/simple-registry/contracts/PackageRegistryInterface.sol" + ] + }, + "PackageRegistry.sol": { + "urls": [ + "/Users/nickgheorghita/ethereum/ethpm-cli/projects/simple-registry/contracts/PackageRegistry.sol" + ] + }, + "Ownable.sol": { + "urls": [ + "/Users/nickgheorghita/ethereum/ethpm-cli/projects/simple-registry/contracts/Ownable.sol" + ] + } + } +} \ No newline at end of file diff --git a/ethpm/assets/simple-registry/solc_output.json b/ethpm/assets/simple-registry/solc_output.json new file mode 100644 index 0000000000..041ef7cdb9 --- /dev/null +++ b/ethpm/assets/simple-registry/solc_output.json @@ -0,0 +1 @@ +{"contracts":{"Ownable.sol":{"Ownable":{"abi":[{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}],"devdoc":{"details":"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.","methods":{"constructor":{"details":"Initializes the contract setting the deployer as the initial owner."},"isOwner()":{"details":"Returns true if the caller is the current owner."},"owner()":{"details":"Returns the address of the current owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}}},"evm":{"bytecode":{"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"linkReferences":{},"object":"","opcodes":"","sourceMap":""}},"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}],\"devdoc\":{\"details\":\"Contract module which provides a basic access control mechanism, where there is an account (an owner) that can be granted exclusive access to specific functions. * This module is used through inheritance. It will make available the modifier `onlyOwner`, which can be applied to your functions to restrict their use to the owner.\",\"methods\":{\"constructor\":{\"details\":\"Initializes the contract setting the deployer as the initial owner.\"},\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"Ownable.sol\":\"Ownable\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"Ownable.sol\":{\"keccak256\":\"0x298bfbd55c42a3fafe4b15c88bdad34b8d53f6d2fb754d10ba2707d4ec30e44a\",\"urls\":[\"bzzr://0694d6eec5e0ec68144cd348fcdd6a0ad9771735b1cfacf59437316e8ea628ad\",\"dweb:/ipfs/Qmdi1cTQMpXxBhnNJQC4pwhcp7EnuS6Ahd68WadHVbEsoX\"]}},\"version\":1}"}},"PackageRegistry.sol":{"PackageRegistry":{"abi":[{"constant":true,"inputs":[{"name":"packageId","type":"bytes32"}],"name":"getPackageName","outputs":[{"name":"packageName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"getReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"name":"release","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllPackageIds","outputs":[{"name":"packageIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"releaseId","type":"bytes32"}],"name":"getReleaseData","outputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"packages","outputs":[{"name":"exists","type":"bool"},{"name":"createdAt","type":"uint256"},{"name":"updatedAt","type":"uint256"},{"name":"releaseCount","type":"uint256"},{"name":"name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"string"}],"name":"validateStringIdentifier","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"packageExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"string"}],"name":"validatePackageName","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"numPackageIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"name","type":"string"}],"name":"generatePackageId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"generateReleaseId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"releaseCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllReleaseIds","outputs":[{"name":"releaseIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"numReleaseIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"packageCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"releaseExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"releases","outputs":[{"name":"exists","type":"bool"},{"name":"createdAt","type":"uint256"},{"name":"packageId","type":"bytes32"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"packageName","type":"string"},{"indexed":false,"name":"version","type":"string"},{"indexed":false,"name":"manifestURI","type":"string"}],"name":"VersionRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"PackageTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}],"devdoc":{"author":"Nick Gheorghita ","methods":{"generatePackageId(string)":{"details":"Returns name hash for a given package name.","params":{"name":"Package name"}},"getAllPackageIds(uint256,uint256)":{"details":"Returns a slice of the array of all package ids for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice."}},"getAllReleaseIds(string,uint256,uint256)":{"details":"Returns a slice of the array of all release hashes for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice.","packageName":"Package name"}},"getPackageName(bytes32)":{"details":"Returns the string name of the package associated with a package id","params":{"packageId":"The package id to look up"}},"getReleaseData(bytes32)":{"details":"Returns the package data for a release.","params":{"releaseId":"Release id"}},"getReleaseId(string,string)":{"details":"Returns the release id for a given name and version pair if present on registry.","params":{"packageName":"Package name","version":"Version string(ex: '1.0.0')"}},"isOwner()":{"details":"Returns true if the caller is the current owner."},"numPackageIds()":{"details":"Returns the number of packages stored on the registry"},"numReleaseIds(string)":{"details":"Returns the number of releases for a given package name on the registry","params":{"packageName":"Package name"}},"owner()":{"details":"Returns the address of the current owner."},"packageExists(string)":{"details":"Returns a bool indicating whether the given package exists in this registry.","params":{"packageName":"Package Name"}},"release(string,string,string)":{"details":"Creates a new release for the named package. If this is the first release for the given package then this will also create and store the package. Returns releaseID if successful.","params":{"manifestURI":"The URI for the release manifest for this release.","packageName":"Package name","version":"Version string (ex: '1.0.0')"}},"releaseExists(string,string)":{"details":"Returns a bool indicating whether the given release exists in this registry.","params":{"packageName":"Package Name","version":"version"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"validatePackageName(string)":{"details":"Returns boolean whether the provided package name is valid.","params":{"name":"The name of the package."}},"validateStringIdentifier(string)":{"details":"Returns boolean whether the input string has a length","params":{"value":"The string to validate."}}},"title":"Contract for an ERC1319 Registry, adapted from ethpm/escape-truffle"},"evm":{"bytecode":{"linkReferences":{},"object":"6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3612a21806100cf6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063938b056e116100b8578063c999a3b21161007c578063c999a3b214610d76578063eb8cc47c14610ea1578063ee0ebe0c14610f70578063efae87d714610f8e578063f2fde38b146110f8578063f491a84c1461113c57610137565b8063938b056e14610a32578063a54fb68514610b05578063abe827f214610b23578063b4b42e3514610bf2578063b8d08db214610d5857610137565b806371102819116100ff578063711028191461075957806382ee976f1461082057806383ea0620146108f35780638da5cb5b146109c65780638f32d59b14610a1057610137565b806306fe1fd71461013c5780631fb1c6c0146101e3578063379037dc1461034957806343212cf1146105465780634c4aea87146105da575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050611268565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a857808201518184015260208101905061018d565b50505050905090810190601f1680156101d55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610333600480360360408110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102ad57600080fd5b8201836020820111156102bf57600080fd5b803590602001918460018302840111640100000000831117156102e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113f8565b6040518082815260200191505060405180910390f35b6105306004803603606081101561035f57600080fd5b810190808035906020019064010000000081111561037c57600080fd5b82018360208201111561038e57600080fd5b803590602001918460018302840111640100000000831117156103b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561041357600080fd5b82018360208201111561042557600080fd5b8035906020019184600183028401116401000000008311171561044757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460018302840111640100000000831117156104de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611509565b6040518082815260200191505060405180910390f35b61057c6004803603604081101561055c57600080fd5b81019080803590602001909291908035906020019092919050505061169a565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156105c55780820151818401526020810190506105aa565b50505050905001935050505060405180910390f35b610606600480360360208110156105f057600080fd5b810190808035906020019092919050505061175c565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561064e578082015181840152602081019050610633565b50505050905090810190601f16801561067b5780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b838110156106b4578082015181840152602081019050610699565b50505050905090810190601f1680156106e15780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b8381101561071a5780820151818401526020810190506106ff565b50505050905090810190601f1680156107475780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6107856004803603602081101561076f57600080fd5b8101908080359060200190929190505050611a2a565b604051808615151515815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107e15780820151818401526020810190506107c6565b50505050905090810190601f16801561080e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6108d96004803603602081101561083657600080fd5b810190808035906020019064010000000081111561085357600080fd5b82018360208201111561086557600080fd5b8035906020019184600183028401116401000000008311171561088757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b05565b604051808215151515815260200191505060405180910390f35b6109ac6004803603602081101561090957600080fd5b810190808035906020019064010000000081111561092657600080fd5b82018360208201111561093857600080fd5b8035906020019184600183028401116401000000008311171561095a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b83565b604051808215151515815260200191505060405180910390f35b6109ce611bbd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a18611be6565b604051808215151515815260200191505060405180910390f35b610aeb60048036036020811015610a4857600080fd5b8101908080359060200190640100000000811115610a6557600080fd5b820183602082011115610a7757600080fd5b80359060200191846001830284011164010000000083111715610a9957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c3d565b604051808215151515815260200191505060405180910390f35b610b0d611cc8565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610b3957600080fd5b8101908080359060200190640100000000811115610b5657600080fd5b820183602082011115610b6857600080fd5b80359060200191846001830284011164010000000083111715610b8a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cd2565b6040518082815260200191505060405180910390f35b610d4260048036036040811015610c0857600080fd5b8101908080359060200190640100000000811115610c2557600080fd5b820183602082011115610c3757600080fd5b80359060200191846001830284011164010000000083111715610c5957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610cbc57600080fd5b820183602082011115610cce57600080fd5b80359060200191846001830284011164010000000083111715610cf057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d4d565b6040518082815260200191505060405180910390f35b610d60611e1c565b6040518082815260200191505060405180910390f35b610e4360048036036060811015610d8c57600080fd5b8101908080359060200190640100000000811115610da957600080fd5b820183602082011115610dbb57600080fd5b80359060200191846001830284011164010000000083111715610ddd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611e22565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015610e8c578082015181840152602081019050610e71565b50505050905001935050505060405180910390f35b610f5a60048036036020811015610eb757600080fd5b8101908080359060200190640100000000811115610ed457600080fd5b820183602082011115610ee657600080fd5b80359060200191846001830284011164010000000083111715610f0857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f9c565b6040518082815260200191505060405180910390f35b610f7861204d565b6040518082815260200191505060405180910390f35b6110de60048036036040811015610fa457600080fd5b8101908080359060200190640100000000811115610fc157600080fd5b820183602082011115610fd357600080fd5b80359060200191846001830284011164010000000083111715610ff557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105857600080fd5b82018360208201111561106a57600080fd5b8035906020019184600183028401116401000000008311171561108c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612053565b604051808215151515815260200191505060405180910390f35b61113a6004803603602081101561110e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612113565b005b6111686004803603602081101561115257600080fd5b8101908080359060200190929190505050612199565b60405180861515151581526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156111c25780820151818401526020810190506111a7565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561122857808201518184015260208101905061120d565b50505050905090810190601f1680156112555780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6060611272612835565b600160008481526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b50505050508152505090506001151581600001511515146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b8060800151915050919050565b60008261140481611b83565b611476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b83836114828282612053565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6114fe8686611d4d565b935050505092915050565b6000611513611be6565b611585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61158e84611c3d565b5061159883611b05565b506115a282611b05565b5060006115ae85611cd2565b905060006115bc8686611d4d565b90506000600160008481526020019081526020016000209050600015158160000160009054906101000a900460ff16151514156116765760018160000160006101000a81548160ff0219169083151502179055504281600101819055504281600201819055508681600401908051906020019061163a929190612866565b50600081600301819055508260046000600654815260200190815260200160002081905550600660008154809291906001019190505550611680565b4281600201819055505b61168d838389898961230c565b8193505050509392505050565b6060600060606000859050600060065482101561174c5781600654039050858111156116c4578590505b806040519080825280602002602001820160405280156116f35781602001602082028038833980820191505090505b5092505b600081111561174b576000600460008481526020019081526020016000205490508084600184038151811061172857fe5b6020026020010181815250508180600190039250508280600101935050506116f7565b5b8282945094505050509250929050565b60608060606117696128e6565b600260008681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050815250509050611904612835565b60016000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505081525050905080608001518260600151836080015182925081915080905094509450945050509193909250565b60016020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003015490806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b5050505050905085565b60008082511415611b7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e76616c69642d737472696e672d6964656e7469666965720000000000000081525060200191505060405180910390fd5b919050565b600080611b8f83611cd2565b90506001600082815260200190815260200160002060000160009054906101000a900460ff16915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600060028251118015611c51575060ff8251105b611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e76616c69642d7061636b6167652d6e616d6500000000000000000000000081525060200191505060405180910390fd5b919050565b6000600654905090565b6000816040516020018082805190602001908083835b60208310611d0b5780518252602082019150602081019050602083039250611ce8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050919050565b600082826040516020018083805190602001908083835b60208310611d875780518252602082019150602081019050602083039250611d64565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310611dd85780518252602082019150602081019050602083039250611db5565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405280519060200120905092915050565b60075481565b6060600084611e3081611b83565b611ea2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6000611ead87611cd2565b90506000600160008381526020019081526020016000209050606060008890506000808460030154905080831015611f8757828103915089821115611ef0578991505b81604051908082528060200260200182016040528015611f1f5781602001602082028038833980820191505090505b5093505b6000821115611f86576000611f3887856126b8565b905060006003600083815260200190815260200160002054905080866001860381518110611f6257fe5b60200260200101818152505083806001900394505084806001019550505050611f23565b5b83839850985050505050505050935093915050565b600081611fa881611b83565b61201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b600061202584611cd2565b9050600060016000838152602001908152602001600020905080600301549350505050919050565b60065481565b60008261205f81611b83565b6120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b60006120dd8585611d4d565b905060006002600083815260200190815260200160002090508060000160009054906101000a900460ff16935050505092915050565b61211b611be6565b61218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612196816126f1565b50565b60026020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123025780601f106122d757610100808354040283529160200191612302565b820191906000526020600020905b8154815290600101906020018083116122e557829003601f168201915b5050505050905085565b6000600260008681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d616c72656164792d6578697374730000000000000000000081525060200191505060405180910390fd5b60018160000160006101000a81548160ff021916908315150217905550428160010181905550858160020181905550828160030190805190602001906123f5929190612866565b508181600401908051906020019061240e929190612866565b5080600260008781526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff02191690831515021790555060018201548160010155600282015481600201556003820181600301908054600181600116156101000203166002900461248b92919061291a565b50600482018160040190805460018160011615610100020316600290046124b392919061291a565b5090505084600560006007548152602001908152602001600020819055506007600081548092919060010191905055506000600160008881526020019081526020016000209050600061250a8883600301546126b8565b905086600360008381526020019081526020016000208190555081600301600081548092919060010191905055507f489d8cf08b449d77a8953441a8d402a675aef55ac2fe367ca5b6b587737341c386868660405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156125a4578082015181840152602081019050612589565b50505050905090810190601f1680156125d15780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b8381101561260a5780820151818401526020810190506125ef565b50505050905090810190601f1680156126375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612670578082015181840152602081019050612655565b50505050905090810190601f16801561269d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15050505050505050565b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806129c76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060a00160405280600015158152602001600081526020016000815260200160008152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128a757805160ff19168380011785556128d5565b828001600101855582156128d5579182015b828111156128d45782518255916020019190600101906128b9565b5b5090506128e291906129a1565b5090565b6040518060a00160405280600015158152602001600081526020016000801916815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129535780548555612990565b8280016001018555821561299057600052602060002091601f016020900482015b8281111561298f578254825591600101919060010190612974565b5b50905061299d91906129a1565b5090565b6129c391905b808211156129bf5760008160009055506001016129a7565b5090565b9056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a265627a7a723058203303a3448bda11fd26ce9bcffb213dfc2b3f1a692632415c26340a9162d15e9c64736f6c634300050a0032","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x2A21 DUP1 PUSH2 0xCF 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 0x137 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x938B056E GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xC999A3B2 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xC999A3B2 EQ PUSH2 0xD76 JUMPI DUP1 PUSH4 0xEB8CC47C EQ PUSH2 0xEA1 JUMPI DUP1 PUSH4 0xEE0EBE0C EQ PUSH2 0xF70 JUMPI DUP1 PUSH4 0xEFAE87D7 EQ PUSH2 0xF8E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x10F8 JUMPI DUP1 PUSH4 0xF491A84C EQ PUSH2 0x113C JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x938B056E EQ PUSH2 0xA32 JUMPI DUP1 PUSH4 0xA54FB685 EQ PUSH2 0xB05 JUMPI DUP1 PUSH4 0xABE827F2 EQ PUSH2 0xB23 JUMPI DUP1 PUSH4 0xB4B42E35 EQ PUSH2 0xBF2 JUMPI DUP1 PUSH4 0xB8D08DB2 EQ PUSH2 0xD58 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x71102819 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x71102819 EQ PUSH2 0x759 JUMPI DUP1 PUSH4 0x82EE976F EQ PUSH2 0x820 JUMPI DUP1 PUSH4 0x83EA0620 EQ PUSH2 0x8F3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x9C6 JUMPI DUP1 PUSH4 0x8F32D59B EQ PUSH2 0xA10 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x6FE1FD7 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x1FB1C6C0 EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x379037DC EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x43212CF1 EQ PUSH2 0x546 JUMPI DUP1 PUSH4 0x4C4AEA87 EQ PUSH2 0x5DA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x168 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1268 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x18D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x13F8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x530 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x425 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1509 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x57C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x55C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x169A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5C5 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5AA JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x606 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x175C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 DUP2 SUB DUP5 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x64E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x633 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x67B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP4 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6B4 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x699 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x6E1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x71A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6FF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x747 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x785 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x76F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1A2A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7E1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x7C6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x80E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x887 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1B05 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x9AC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x909 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x926 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x938 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x95A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1B83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x9CE PUSH2 0x1BBD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA18 PUSH2 0x1BE6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xAEB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xA65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xA77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xA99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1C3D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0D PUSH2 0x1CC8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xBDC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xB56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xB68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xB8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1CD2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD42 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xC08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xC59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xCBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xCCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xCF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1D4D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD60 PUSH2 0x1E1C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE43 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0xD8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xDA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E22 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE8C JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE71 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xF5A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xEB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xED4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xEE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1F9C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xF78 PUSH2 0x204D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x10DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xFC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xFD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1058 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x106A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x108C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2053 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x113A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x110E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2113 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1168 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11C2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x11A7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11EF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1228 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x120D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1255 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP8 POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0x1272 PUSH2 0x2835 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1362 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1337 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1362 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1345 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP PUSH1 0x1 ISZERO ISZERO DUP2 PUSH1 0x0 ADD MLOAD ISZERO ISZERO EQ PUSH2 0x13EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x80 ADD MLOAD SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1404 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x1476 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 DUP4 PUSH2 0x1482 DUP3 DUP3 PUSH2 0x2053 JUMP JUMPDEST PUSH2 0x14F4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x72656C656173652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x14FE DUP7 DUP7 PUSH2 0x1D4D JUMP JUMPDEST SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1513 PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x1585 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x158E DUP5 PUSH2 0x1C3D JUMP JUMPDEST POP PUSH2 0x1598 DUP4 PUSH2 0x1B05 JUMP JUMPDEST POP PUSH2 0x15A2 DUP3 PUSH2 0x1B05 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x15AE DUP6 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x15BC DUP7 DUP7 PUSH2 0x1D4D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 ISZERO ISZERO DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO EQ ISZERO PUSH2 0x1676 JUMPI PUSH1 0x1 DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP DUP7 DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x163A SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x4 PUSH1 0x0 PUSH1 0x6 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x6 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH2 0x1680 JUMP JUMPDEST TIMESTAMP DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP JUMPDEST PUSH2 0x168D DUP4 DUP4 DUP10 DUP10 DUP10 PUSH2 0x230C JUMP JUMPDEST DUP2 SWAP4 POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP6 SWAP1 POP PUSH1 0x0 PUSH1 0x6 SLOAD DUP3 LT ISZERO PUSH2 0x174C JUMPI DUP2 PUSH1 0x6 SLOAD SUB SWAP1 POP DUP6 DUP2 GT ISZERO PUSH2 0x16C4 JUMPI DUP6 SWAP1 POP JUMPDEST DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x16F3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP JUMPDEST PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x174B JUMPI PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP1 DUP5 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0x1728 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP2 DUP1 PUSH1 0x1 SWAP1 SUB SWAP3 POP POP DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP POP PUSH2 0x16F7 JUMP JUMPDEST JUMPDEST DUP3 DUP3 SWAP5 POP SWAP5 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x1769 PUSH2 0x28E6 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x184F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1824 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x184F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1832 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x18F1 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x18C6 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x18F1 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x18D4 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP PUSH2 0x1904 PUSH2 0x2835 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x19F8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x19CD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x19F8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x19DB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP DUP1 PUSH1 0x80 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP3 SWAP3 POP DUP2 SWAP2 POP DUP1 SWAP1 POP SWAP5 POP SWAP5 POP SWAP5 POP POP POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1AFB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1AD0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1AFB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1ADE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP6 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD EQ ISZERO PUSH2 0x1B7E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C69642D737472696E672D6964656E74696669657200000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B8F DUP4 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 MLOAD GT DUP1 ISZERO PUSH2 0x1C51 JUMPI POP PUSH1 0xFF DUP3 MLOAD LT JUMPDEST PUSH2 0x1CC3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C69642D7061636B6167652D6E616D65000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x6 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D0B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1CE8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D87 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1D64 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1DD8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1DB5 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP5 PUSH2 0x1E30 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x1EA2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1EAD DUP8 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP9 SWAP1 POP PUSH1 0x0 DUP1 DUP5 PUSH1 0x3 ADD SLOAD SWAP1 POP DUP1 DUP4 LT ISZERO PUSH2 0x1F87 JUMPI DUP3 DUP2 SUB SWAP2 POP DUP10 DUP3 GT ISZERO PUSH2 0x1EF0 JUMPI DUP10 SWAP2 POP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F1F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP JUMPDEST PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x1F86 JUMPI PUSH1 0x0 PUSH2 0x1F38 DUP8 DUP6 PUSH2 0x26B8 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP1 DUP7 PUSH1 0x1 DUP7 SUB DUP2 MLOAD DUP2 LT PUSH2 0x1F62 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP4 DUP1 PUSH1 0x1 SWAP1 SUB SWAP5 POP POP DUP5 DUP1 PUSH1 0x1 ADD SWAP6 POP POP POP POP PUSH2 0x1F23 JUMP JUMPDEST JUMPDEST DUP4 DUP4 SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1FA8 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x201A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2025 DUP5 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP DUP1 PUSH1 0x3 ADD SLOAD SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x205F DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x20D1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x20DD DUP6 DUP6 PUSH2 0x1D4D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x211B PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x218D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2196 DUP2 PUSH2 0x26F1 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2264 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2239 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2264 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2247 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2302 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22D7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2302 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22E5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 ISZERO ISZERO DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO EQ PUSH2 0x23AE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x72656C656173652D616C72656164792D65786973747300000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP DUP6 DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP DUP3 DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x23F5 SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP DUP2 DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x240E SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP DUP1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 DUP3 ADD SLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x2 DUP3 ADD SLOAD DUP2 PUSH1 0x2 ADD SSTORE PUSH1 0x3 DUP3 ADD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH2 0x248B SWAP3 SWAP2 SWAP1 PUSH2 0x291A JUMP JUMPDEST POP PUSH1 0x4 DUP3 ADD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH2 0x24B3 SWAP3 SWAP2 SWAP1 PUSH2 0x291A JUMP JUMPDEST POP SWAP1 POP POP DUP5 PUSH1 0x5 PUSH1 0x0 PUSH1 0x7 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x7 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0x250A DUP9 DUP4 PUSH1 0x3 ADD SLOAD PUSH2 0x26B8 JUMP JUMPDEST SWAP1 POP DUP7 PUSH1 0x3 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x3 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH32 0x489D8CF08B449D77A8953441A8D402A675AEF55AC2FE367CA5B6B587737341C3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 DUP2 SUB DUP5 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x25A4 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2589 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x25D1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP4 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x260A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x25EF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2637 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2670 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2655 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x269D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2777 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x29C7 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x28A7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x28D5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x28D5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x28D4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x28B9 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x28E2 SWAP2 SWAP1 PUSH2 0x29A1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2953 JUMPI DUP1 SLOAD DUP6 SSTORE PUSH2 0x2990 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2990 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x298F JUMPI DUP3 SLOAD DUP3 SSTORE SWAP2 PUSH1 0x1 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2974 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x299D SWAP2 SWAP1 PUSH2 0x29A1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x29C3 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x29BF JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x29A7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID 0x4f PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F2061646472657373A265627A7A723058203303A3448BDA11 REVERT 0x26 0xce SWAP12 0xcf 0xfb 0x21 RETURNDATASIZE 0xfc 0x2b EXTCODEHASH BYTE PUSH10 0x2632415C26340A9162D1 0x5e SWAP13 PUSH5 0x736F6C6343 STOP SDIV EXP STOP ORIGIN ","sourceMap":"268:12081:1:-;;;667:10:0;658:6;;:19;;;;;;;;;;;;;;;;;;725:6;;;;;;;;;;;692:40;;721:1;692:40;;;;;;;;;;;;268:12081:1;;;;;;"},"deployedBytecode":{"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106101375760003560e01c8063938b056e116100b8578063c999a3b21161007c578063c999a3b214610d76578063eb8cc47c14610ea1578063ee0ebe0c14610f70578063efae87d714610f8e578063f2fde38b146110f8578063f491a84c1461113c57610137565b8063938b056e14610a32578063a54fb68514610b05578063abe827f214610b23578063b4b42e3514610bf2578063b8d08db214610d5857610137565b806371102819116100ff578063711028191461075957806382ee976f1461082057806383ea0620146108f35780638da5cb5b146109c65780638f32d59b14610a1057610137565b806306fe1fd71461013c5780631fb1c6c0146101e3578063379037dc1461034957806343212cf1146105465780634c4aea87146105da575b600080fd5b6101686004803603602081101561015257600080fd5b8101908080359060200190929190505050611268565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a857808201518184015260208101905061018d565b50505050905090810190601f1680156101d55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610333600480360360408110156101f957600080fd5b810190808035906020019064010000000081111561021657600080fd5b82018360208201111561022857600080fd5b8035906020019184600183028401116401000000008311171561024a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156102ad57600080fd5b8201836020820111156102bf57600080fd5b803590602001918460018302840111640100000000831117156102e157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506113f8565b6040518082815260200191505060405180910390f35b6105306004803603606081101561035f57600080fd5b810190808035906020019064010000000081111561037c57600080fd5b82018360208201111561038e57600080fd5b803590602001918460018302840111640100000000831117156103b057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561041357600080fd5b82018360208201111561042557600080fd5b8035906020019184600183028401116401000000008311171561044757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156104aa57600080fd5b8201836020820111156104bc57600080fd5b803590602001918460018302840111640100000000831117156104de57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611509565b6040518082815260200191505060405180910390f35b61057c6004803603604081101561055c57600080fd5b81019080803590602001909291908035906020019092919050505061169a565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156105c55780820151818401526020810190506105aa565b50505050905001935050505060405180910390f35b610606600480360360208110156105f057600080fd5b810190808035906020019092919050505061175c565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b8381101561064e578082015181840152602081019050610633565b50505050905090810190601f16801561067b5780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b838110156106b4578082015181840152602081019050610699565b50505050905090810190601f1680156106e15780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b8381101561071a5780820151818401526020810190506106ff565b50505050905090810190601f1680156107475780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6107856004803603602081101561076f57600080fd5b8101908080359060200190929190505050611a2a565b604051808615151515815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107e15780820151818401526020810190506107c6565b50505050905090810190601f16801561080e5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b6108d96004803603602081101561083657600080fd5b810190808035906020019064010000000081111561085357600080fd5b82018360208201111561086557600080fd5b8035906020019184600183028401116401000000008311171561088757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b05565b604051808215151515815260200191505060405180910390f35b6109ac6004803603602081101561090957600080fd5b810190808035906020019064010000000081111561092657600080fd5b82018360208201111561093857600080fd5b8035906020019184600183028401116401000000008311171561095a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b83565b604051808215151515815260200191505060405180910390f35b6109ce611bbd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a18611be6565b604051808215151515815260200191505060405180910390f35b610aeb60048036036020811015610a4857600080fd5b8101908080359060200190640100000000811115610a6557600080fd5b820183602082011115610a7757600080fd5b80359060200191846001830284011164010000000083111715610a9957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611c3d565b604051808215151515815260200191505060405180910390f35b610b0d611cc8565b6040518082815260200191505060405180910390f35b610bdc60048036036020811015610b3957600080fd5b8101908080359060200190640100000000811115610b5657600080fd5b820183602082011115610b6857600080fd5b80359060200191846001830284011164010000000083111715610b8a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cd2565b6040518082815260200191505060405180910390f35b610d4260048036036040811015610c0857600080fd5b8101908080359060200190640100000000811115610c2557600080fd5b820183602082011115610c3757600080fd5b80359060200191846001830284011164010000000083111715610c5957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610cbc57600080fd5b820183602082011115610cce57600080fd5b80359060200191846001830284011164010000000083111715610cf057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611d4d565b6040518082815260200191505060405180910390f35b610d60611e1c565b6040518082815260200191505060405180910390f35b610e4360048036036060811015610d8c57600080fd5b8101908080359060200190640100000000811115610da957600080fd5b820183602082011115610dbb57600080fd5b80359060200191846001830284011164010000000083111715610ddd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019092919080359060200190929190505050611e22565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b83811015610e8c578082015181840152602081019050610e71565b50505050905001935050505060405180910390f35b610f5a60048036036020811015610eb757600080fd5b8101908080359060200190640100000000811115610ed457600080fd5b820183602082011115610ee657600080fd5b80359060200191846001830284011164010000000083111715610f0857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611f9c565b6040518082815260200191505060405180910390f35b610f7861204d565b6040518082815260200191505060405180910390f35b6110de60048036036040811015610fa457600080fd5b8101908080359060200190640100000000811115610fc157600080fd5b820183602082011115610fd357600080fd5b80359060200191846001830284011164010000000083111715610ff557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561105857600080fd5b82018360208201111561106a57600080fd5b8035906020019184600183028401116401000000008311171561108c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612053565b604051808215151515815260200191505060405180910390f35b61113a6004803603602081101561110e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612113565b005b6111686004803603602081101561115257600080fd5b8101908080359060200190929190505050612199565b60405180861515151581526020018581526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156111c25780820151818401526020810190506111a7565b50505050905090810190601f1680156111ef5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561122857808201518184015260208101905061120d565b50505050905090810190601f1680156112555780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6060611272612835565b600160008481526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113625780601f1061133757610100808354040283529160200191611362565b820191906000526020600020905b81548152906001019060200180831161134557829003601f168201915b50505050508152505090506001151581600001511515146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b8060800151915050919050565b60008261140481611b83565b611476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b83836114828282612053565b6114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6114fe8686611d4d565b935050505092915050565b6000611513611be6565b611585576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61158e84611c3d565b5061159883611b05565b506115a282611b05565b5060006115ae85611cd2565b905060006115bc8686611d4d565b90506000600160008481526020019081526020016000209050600015158160000160009054906101000a900460ff16151514156116765760018160000160006101000a81548160ff0219169083151502179055504281600101819055504281600201819055508681600401908051906020019061163a929190612866565b50600081600301819055508260046000600654815260200190815260200160002081905550600660008154809291906001019190505550611680565b4281600201819055505b61168d838389898961230c565b8193505050509392505050565b6060600060606000859050600060065482101561174c5781600654039050858111156116c4578590505b806040519080825280602002602001820160405280156116f35781602001602082028038833980820191505090505b5092505b600081111561174b576000600460008481526020019081526020016000205490508084600184038151811061172857fe5b6020026020010181815250508180600190039250508280600101935050506116f7565b5b8282945094505050509250929050565b60608060606117696128e6565b600260008681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201548152602001600382018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561184f5780601f106118245761010080835404028352916020019161184f565b820191906000526020600020905b81548152906001019060200180831161183257829003601f168201915b50505050508152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118f15780601f106118c6576101008083540402835291602001916118f1565b820191906000526020600020905b8154815290600101906020018083116118d457829003601f168201915b5050505050815250509050611904612835565b60016000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820154815260200160038201548152602001600482018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119f85780601f106119cd576101008083540402835291602001916119f8565b820191906000526020600020905b8154815290600101906020018083116119db57829003601f168201915b505050505081525050905080608001518260600151836080015182925081915080905094509450945050509193909250565b60016020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003015490806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b5050505050905085565b60008082511415611b7e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e76616c69642d737472696e672d6964656e7469666965720000000000000081525060200191505060405180910390fd5b919050565b600080611b8f83611cd2565b90506001600082815260200190815260200160002060000160009054906101000a900460ff16915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600060028251118015611c51575060ff8251105b611cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e76616c69642d7061636b6167652d6e616d6500000000000000000000000081525060200191505060405180910390fd5b919050565b6000600654905090565b6000816040516020018082805190602001908083835b60208310611d0b5780518252602082019150602081019050602083039250611ce8565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050919050565b600082826040516020018083805190602001908083835b60208310611d875780518252602082019150602081019050602083039250611d64565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310611dd85780518252602082019150602081019050602083039250611db5565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405280519060200120905092915050565b60075481565b6060600084611e3081611b83565b611ea2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b6000611ead87611cd2565b90506000600160008381526020019081526020016000209050606060008890506000808460030154905080831015611f8757828103915089821115611ef0578991505b81604051908082528060200260200182016040528015611f1f5781602001602082028038833980820191505090505b5093505b6000821115611f86576000611f3887856126b8565b905060006003600083815260200190815260200160002054905080866001860381518110611f6257fe5b60200260200101818152505083806001900394505084806001019550505050611f23565b5b83839850985050505050505050935093915050565b600081611fa881611b83565b61201a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b600061202584611cd2565b9050600060016000838152602001908152602001600020905080600301549350505050919050565b60065481565b60008261205f81611b83565b6120d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f7061636b6167652d646f65732d6e6f742d65786973740000000000000000000081525060200191505060405180910390fd5b60006120dd8585611d4d565b905060006002600083815260200190815260200160002090508060000160009054906101000a900460ff16935050505092915050565b61211b611be6565b61218d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612196816126f1565b50565b60026020528060005260406000206000915090508060000160009054906101000a900460ff1690806001015490806002015490806003018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122645780601f1061223957610100808354040283529160200191612264565b820191906000526020600020905b81548152906001019060200180831161224757829003601f168201915b505050505090806004018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123025780601f106122d757610100808354040283529160200191612302565b820191906000526020600020905b8154815290600101906020018083116122e557829003601f168201915b5050505050905085565b6000600260008681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146123ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f72656c656173652d616c72656164792d6578697374730000000000000000000081525060200191505060405180910390fd5b60018160000160006101000a81548160ff021916908315150217905550428160010181905550858160020181905550828160030190805190602001906123f5929190612866565b508181600401908051906020019061240e929190612866565b5080600260008781526020019081526020016000206000820160009054906101000a900460ff168160000160006101000a81548160ff02191690831515021790555060018201548160010155600282015481600201556003820181600301908054600181600116156101000203166002900461248b92919061291a565b50600482018160040190805460018160011615610100020316600290046124b392919061291a565b5090505084600560006007548152602001908152602001600020819055506007600081548092919060010191905055506000600160008881526020019081526020016000209050600061250a8883600301546126b8565b905086600360008381526020019081526020016000208190555081600301600081548092919060010191905055507f489d8cf08b449d77a8953441a8d402a675aef55ac2fe367ca5b6b587737341c386868660405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156125a4578082015181840152602081019050612589565b50505050905090810190601f1680156125d15780820380516001836020036101000a031916815260200191505b50848103835286818151815260200191508051906020019080838360005b8381101561260a5780820151818401526020810190506125ef565b50505050905090810190601f1680156126375780820380516001836020036101000a031916815260200191505b50848103825285818151815260200191508051906020019080838360005b83811015612670578082015181840152602081019050612655565b50505050905090810190601f16801561269d5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a15050505050505050565b60008282604051602001808381526020018281526020019250505060405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612777576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806129c76026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040518060a00160405280600015158152602001600081526020016000815260200160008152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106128a757805160ff19168380011785556128d5565b828001600101855582156128d5579182015b828111156128d45782518255916020019190600101906128b9565b5b5090506128e291906129a1565b5090565b6040518060a00160405280600015158152602001600081526020016000801916815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129535780548555612990565b8280016001018555821561299057600052602060002091601f016020900482015b8281111561298f578254825591600101919060010190612974565b5b50905061299d91906129a1565b5090565b6129c391905b808211156129bf5760008160009055506001016129a7565b5090565b9056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a265627a7a723058203303a3448bda11fd26ce9bcffb213dfc2b3f1a692632415c26340a9162d15e9c64736f6c634300050a0032","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x137 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x938B056E GT PUSH2 0xB8 JUMPI DUP1 PUSH4 0xC999A3B2 GT PUSH2 0x7C JUMPI DUP1 PUSH4 0xC999A3B2 EQ PUSH2 0xD76 JUMPI DUP1 PUSH4 0xEB8CC47C EQ PUSH2 0xEA1 JUMPI DUP1 PUSH4 0xEE0EBE0C EQ PUSH2 0xF70 JUMPI DUP1 PUSH4 0xEFAE87D7 EQ PUSH2 0xF8E JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x10F8 JUMPI DUP1 PUSH4 0xF491A84C EQ PUSH2 0x113C JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x938B056E EQ PUSH2 0xA32 JUMPI DUP1 PUSH4 0xA54FB685 EQ PUSH2 0xB05 JUMPI DUP1 PUSH4 0xABE827F2 EQ PUSH2 0xB23 JUMPI DUP1 PUSH4 0xB4B42E35 EQ PUSH2 0xBF2 JUMPI DUP1 PUSH4 0xB8D08DB2 EQ PUSH2 0xD58 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x71102819 GT PUSH2 0xFF JUMPI DUP1 PUSH4 0x71102819 EQ PUSH2 0x759 JUMPI DUP1 PUSH4 0x82EE976F EQ PUSH2 0x820 JUMPI DUP1 PUSH4 0x83EA0620 EQ PUSH2 0x8F3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x9C6 JUMPI DUP1 PUSH4 0x8F32D59B EQ PUSH2 0xA10 JUMPI PUSH2 0x137 JUMP JUMPDEST DUP1 PUSH4 0x6FE1FD7 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x1FB1C6C0 EQ PUSH2 0x1E3 JUMPI DUP1 PUSH4 0x379037DC EQ PUSH2 0x349 JUMPI DUP1 PUSH4 0x43212CF1 EQ PUSH2 0x546 JUMPI DUP1 PUSH4 0x4C4AEA87 EQ PUSH2 0x5DA JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x168 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1268 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x18D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1D5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x333 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x1F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x216 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x24A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x2AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x2E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x13F8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x530 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x35F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x37C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x38E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x3B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x425 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x447 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x4AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x4BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x4DE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1509 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x57C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x55C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x169A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5C5 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5AA JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x606 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x175C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 DUP2 SUB DUP5 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x64E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x633 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x67B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP4 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6B4 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x699 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x6E1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x71A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6FF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x747 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x785 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x76F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1A2A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x7E1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x7C6 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x80E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x8D9 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x836 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x853 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x887 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1B05 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x9AC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x909 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x926 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x938 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x95A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1B83 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x9CE PUSH2 0x1BBD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xA18 PUSH2 0x1BE6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xAEB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xA48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xA65 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xA77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xA99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1C3D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xB0D PUSH2 0x1CC8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xBDC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xB39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xB56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xB68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xB8A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1CD2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD42 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xC08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xC59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xCBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xCCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xCF0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1D4D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD60 PUSH2 0x1E1C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xE43 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0xD8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xDA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E22 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE8C JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE71 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xF5A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xEB7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xED4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xEE6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xF08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1F9C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xF78 PUSH2 0x204D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x10DE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xFA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xFC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xFD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1058 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x106A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x108C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2053 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x113A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x110E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2113 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1168 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP7 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x11C2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x11A7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11EF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1228 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x120D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1255 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP8 POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH2 0x1272 PUSH2 0x2835 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1362 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1337 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1362 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1345 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP PUSH1 0x1 ISZERO ISZERO DUP2 PUSH1 0x0 ADD MLOAD ISZERO ISZERO EQ PUSH2 0x13EB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x80 ADD MLOAD SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1404 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x1476 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP4 DUP4 PUSH2 0x1482 DUP3 DUP3 PUSH2 0x2053 JUMP JUMPDEST PUSH2 0x14F4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x72656C656173652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x14FE DUP7 DUP7 PUSH2 0x1D4D JUMP JUMPDEST SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1513 PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x1585 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x158E DUP5 PUSH2 0x1C3D JUMP JUMPDEST POP PUSH2 0x1598 DUP4 PUSH2 0x1B05 JUMP JUMPDEST POP PUSH2 0x15A2 DUP3 PUSH2 0x1B05 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x15AE DUP6 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x15BC DUP7 DUP7 PUSH2 0x1D4D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 ISZERO ISZERO DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO EQ ISZERO PUSH2 0x1676 JUMPI PUSH1 0x1 DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP DUP7 DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x163A SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP PUSH1 0x0 DUP2 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x4 PUSH1 0x0 PUSH1 0x6 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x6 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH2 0x1680 JUMP JUMPDEST TIMESTAMP DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP JUMPDEST PUSH2 0x168D DUP4 DUP4 DUP10 DUP10 DUP10 PUSH2 0x230C JUMP JUMPDEST DUP2 SWAP4 POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP6 SWAP1 POP PUSH1 0x0 PUSH1 0x6 SLOAD DUP3 LT ISZERO PUSH2 0x174C JUMPI DUP2 PUSH1 0x6 SLOAD SUB SWAP1 POP DUP6 DUP2 GT ISZERO PUSH2 0x16C4 JUMPI DUP6 SWAP1 POP JUMPDEST DUP1 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x16F3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP JUMPDEST PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x174B JUMPI PUSH1 0x0 PUSH1 0x4 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP1 DUP5 PUSH1 0x1 DUP5 SUB DUP2 MLOAD DUP2 LT PUSH2 0x1728 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP2 DUP1 PUSH1 0x1 SWAP1 SUB SWAP3 POP POP DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP POP PUSH2 0x16F7 JUMP JUMPDEST JUMPDEST DUP3 DUP3 SWAP5 POP SWAP5 POP POP POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x60 PUSH2 0x1769 PUSH2 0x28E6 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x184F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1824 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x184F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1832 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x18F1 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x18C6 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x18F1 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x18D4 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP PUSH2 0x1904 PUSH2 0x2835 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP4 PUSH1 0x40 ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD SLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x19F8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x19CD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x19F8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x19DB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP DUP1 PUSH1 0x80 ADD MLOAD DUP3 PUSH1 0x60 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD DUP3 SWAP3 POP DUP2 SWAP2 POP DUP1 SWAP1 POP SWAP5 POP SWAP5 POP SWAP5 POP POP POP SWAP2 SWAP4 SWAP1 SWAP3 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1AFB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1AD0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1AFB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1ADE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP6 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD EQ ISZERO PUSH2 0x1B7E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C69642D737472696E672D6964656E74696669657200000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1B8F DUP4 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 MLOAD GT DUP1 ISZERO PUSH2 0x1C51 JUMPI POP PUSH1 0xFF DUP3 MLOAD LT JUMPDEST PUSH2 0x1CC3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x14 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x696E76616C69642D7061636B6167652D6E616D65000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x6 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D0B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1CE8 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D87 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1D64 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1DD8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x1DB5 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP5 PUSH2 0x1E30 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x1EA2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1EAD DUP8 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x60 PUSH1 0x0 DUP9 SWAP1 POP PUSH1 0x0 DUP1 DUP5 PUSH1 0x3 ADD SLOAD SWAP1 POP DUP1 DUP4 LT ISZERO PUSH2 0x1F87 JUMPI DUP3 DUP2 SUB SWAP2 POP DUP10 DUP3 GT ISZERO PUSH2 0x1EF0 JUMPI DUP10 SWAP2 POP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1F1F JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP JUMPDEST PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x1F86 JUMPI PUSH1 0x0 PUSH2 0x1F38 DUP8 DUP6 PUSH2 0x26B8 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP1 DUP7 PUSH1 0x1 DUP7 SUB DUP2 MLOAD DUP2 LT PUSH2 0x1F62 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD DUP2 DUP2 MSTORE POP POP DUP4 DUP1 PUSH1 0x1 SWAP1 SUB SWAP5 POP POP DUP5 DUP1 PUSH1 0x1 ADD SWAP6 POP POP POP POP PUSH2 0x1F23 JUMP JUMPDEST JUMPDEST DUP4 DUP4 SWAP9 POP SWAP9 POP POP POP POP POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH2 0x1FA8 DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x201A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2025 DUP5 PUSH2 0x1CD2 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP DUP1 PUSH1 0x3 ADD SLOAD SWAP4 POP POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x205F DUP2 PUSH2 0x1B83 JUMP JUMPDEST PUSH2 0x20D1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x7061636B6167652D646F65732D6E6F742D657869737400000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x20DD DUP6 DUP6 PUSH2 0x1D4D JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x211B PUSH2 0x1BE6 JUMP JUMPDEST PUSH2 0x218D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x2196 DUP2 PUSH2 0x26F1 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2264 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2239 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2264 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2247 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2302 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22D7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2302 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22E5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 ISZERO ISZERO DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO EQ PUSH2 0x23AE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x16 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x72656C656173652D616C72656164792D65786973747300000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP TIMESTAMP DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP DUP6 DUP2 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP DUP3 DUP2 PUSH1 0x3 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x23F5 SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP DUP2 DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x240E SWAP3 SWAP2 SWAP1 PUSH2 0x2866 JUMP JUMPDEST POP DUP1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 DUP3 ADD SLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x2 DUP3 ADD SLOAD DUP2 PUSH1 0x2 ADD SSTORE PUSH1 0x3 DUP3 ADD DUP2 PUSH1 0x3 ADD SWAP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH2 0x248B SWAP3 SWAP2 SWAP1 PUSH2 0x291A JUMP JUMPDEST POP PUSH1 0x4 DUP3 ADD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH2 0x24B3 SWAP3 SWAP2 SWAP1 PUSH2 0x291A JUMP JUMPDEST POP SWAP1 POP POP DUP5 PUSH1 0x5 PUSH1 0x0 PUSH1 0x7 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x7 PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x0 PUSH2 0x250A DUP9 DUP4 PUSH1 0x3 ADD SLOAD PUSH2 0x26B8 JUMP JUMPDEST SWAP1 POP DUP7 PUSH1 0x3 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x3 ADD PUSH1 0x0 DUP2 SLOAD DUP1 SWAP3 SWAP2 SWAP1 PUSH1 0x1 ADD SWAP2 SWAP1 POP SSTORE POP PUSH32 0x489D8CF08B449D77A8953441A8D402A675AEF55AC2FE367CA5B6B587737341C3 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 DUP2 SUB DUP5 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x25A4 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2589 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x25D1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP4 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x260A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x25EF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2637 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP5 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2670 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2655 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x269D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2777 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x29C7 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x28A7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x28D5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x28D5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x28D4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x28B9 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x28E2 SWAP2 SWAP1 PUSH2 0x29A1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2953 JUMPI DUP1 SLOAD DUP6 SSTORE PUSH2 0x2990 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2990 JUMPI PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x298F JUMPI DUP3 SLOAD DUP3 SSTORE SWAP2 PUSH1 0x1 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2974 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x299D SWAP2 SWAP1 PUSH2 0x29A1 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x29C3 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x29BF JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x29A7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID 0x4f PUSH24 0x6E61626C653A206E6577206F776E65722069732074686520 PUSH27 0x65726F2061646472657373A265627A7A723058203303A3448BDA11 REVERT 0x26 0xce SWAP12 0xcf 0xfb 0x21 RETURNDATASIZE 0xfc 0x2b EXTCODEHASH BYTE PUSH10 0x2632415C26340A9162D1 0x5e SWAP13 PUSH5 0x736F6C6343 STOP SDIV EXP STOP ORIGIN ","sourceMap":"268:12081:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;268:12081:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4675:295;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4675:295:1;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4675:295:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8843:294;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8843:294:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;8843:294:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8843:294:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8843:294:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;8843:294:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;8843:294:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8843:294:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8843:294:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;8843:294:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2275:1103;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2275:1103:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;2275:1103:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2275:1103:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2275:1103:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2275:1103:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;2275:1103:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2275:1103:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2275:1103:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2275:1103:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;2275:1103:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;2275:1103:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;2275:1103:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;2275:1103:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5162:1138;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5162:1138:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5162:1138:1;;;;;;;;;;;;;;;;;;8221:431;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8221:431:1;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8221:431:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8221:431:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8221:431:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;633:44;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;633:44:1;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;633:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12157:190;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12157:190:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;12157:190:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12157:190:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;12157:190:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;12157:190:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10406:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10406:187:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;10406:187:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10406:187:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10406:187:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10406:187:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;815:77:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1166:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11834:205:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11834:205:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;11834:205:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11834:205:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;11834:205:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;11834:205:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9210:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10792:162;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10792:162:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;10792:162:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10792:162:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;10792:162:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;10792:162:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11149:230;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11149:230:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;11149:230:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11149:230:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;11149:230:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;11149:230:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;11149:230:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11149:230:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;11149:230:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;11149:230:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1164:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6535:1590;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6535:1590:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6535:1590:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6535:1590:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6535:1590:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6535:1590:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6535:1590:1;;;;;;;;;;;;;;;;;;9444:316;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9444:316:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9444:316:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9444:316:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9444:316:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9444:316:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1090:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9927:343;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9927:343:1;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9927:343:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9927:343:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9927:343:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9927:343:1;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9927:343:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9927:343:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9927:343:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9927:343:1;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1405:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1405:107:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;683:44:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;683:44:1;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;683:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;683:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4675:295;4763:25;4804:28;;:::i;:::-;4835:8;:19;4844:9;4835:19;;;;;;;;;;;4804:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4897:4;4873:28;;:13;:20;;;:28;;;4864:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4945:13;:18;;;4938:25;;;4675:295;;;:::o;8843:294::-;9051:17;8971:11;1462:26;1476:11;1462:13;:26::i;:::-;1454:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9012:11;9025:7;1637:35;1651:11;1664:7;1637:13;:35::i;:::-;1628:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9091:39;9109:11;9122:7;9091:17;:39::i;:::-;9084:46;;1525:1;;8843:294;;;;;:::o;2275:1103::-;2449:7;1019:9:0;:7;:9::i;:::-;1011:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2472:32:1;2492:11;2472:19;:32::i;:::-;;2514:33;2539:7;2514:24;:33::i;:::-;;2557:37;2582:11;2557:24;:37::i;:::-;;2631:17;2651:30;2669:11;2651:17;:30::i;:::-;2631:50;;2691:17;2711:39;2729:11;2742:7;2711:17;:39::i;:::-;2691:59;;2760:23;2786:8;:19;2795:9;2786:19;;;;;;;;;;;2760:45;;2893:5;2875:23;;:7;:14;;;;;;;;;;;;:23;;;2871:398;;;2931:4;2914:7;:14;;;:21;;;;;;;;;;;;;;;;;;2969:15;2949:7;:17;;:35;;;;3018:15;2998:7;:17;;:35;;;;3062:11;3047:7;:12;;:26;;;;;;;;;;;;:::i;:::-;;3110:1;3087:7;:20;;:24;;;;3155:9;3125:13;:27;3139:12;;3125:27;;;;;;;;;;;:39;;;;3178:12;;:14;;;;;;;;;;;;;2871:398;;;3243:15;3223:7;:17;;:35;;;;2871:398;3278:67;3289:9;3300;3311:11;3324:7;3333:11;3278:10;:67::i;:::-;3362:9;3355:16;;;;;2275:1103;;;;;:::o;5162:1138::-;5271:27;5312:12;5349:23;5432:11;5446:6;5432:20;;5519:14;5657:12;;5648:6;:21;5644:617;;;5755:6;5740:12;;:21;5728:33;;5873:5;5861:9;:17;5857:73;;;5910:5;5898:17;;5857:73;6004:9;5990:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5990:24:1;;;;5981:33;;6061:190;6079:1;6067:9;:13;6061:190;;;6099:12;6114:13;:21;6128:6;6114:21;;;;;;;;;;;;6099:36;;6177:4;6153:6;6172:1;6160:9;:13;6153:21;;;;;;;;;;;;;:28;;;;;6199:11;;;;;;;;6228:8;;;;;;;6061:190;;;;5644:617;6278:6;6286;6270:23;;;;;;;5162:1138;;;;;:::o;8221:431::-;8322:25;8349:21;8384:25;8434:28;;:::i;:::-;8465:8;:19;8474:9;8465:19;;;;;;;;;;;8434:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8494:28;;:::i;:::-;8525:8;:33;8534:13;:23;;;8525:33;;;;;;;;;;;8494:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8576:13;:18;;;8596:13;:21;;;8619:13;:25;;;8568:77;;;;;;;;;;;;;;;;;8221:431;;;;;:::o;633:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12157:190::-;12257:4;12309:1;12292:5;12286:19;:24;;12277:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12157:190;;;:::o;10406:187::-;10477:4;10493:17;10513:30;10531:11;10513:17;:30::i;:::-;10493:50;;10560:8;:19;10569:9;10560:19;;;;;;;;;;;:26;;;;;;;;;;;;10553:33;;;10406:187;;;:::o;815:77:0:-;853:7;879:6;;;;;;;;;;;872:13;;815:77;:::o;1166:90::-;1206:4;1243:6;;;;;;;;;;;1229:20;;:10;:20;;;1222:27;;1166:90;:::o;11834:205:1:-;11928:4;11978:1;11963:4;11957:18;:22;:50;;;;;12004:3;11989:4;11983:18;:24;11957:50;11948:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11834:205;;;:::o;9210:103::-;9256:15;9294:12;;9287:19;;9210:103;:::o;10792:162::-;10884:7;10941:4;10924:22;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10924:22:1;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;10924:22:1;;;10914:33;;;;;;10907:40;;10792:162;;;:::o;11149:230::-;11293:7;11350:11;11363:7;11333:38;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11333:38:1;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;11333:38:1;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11333:38:1;;;11323:49;;;;;;11316:56;;11149:230;;;;:::o;1164:24::-;;;;:::o;6535:1590::-;6712:27;6753:12;6669:11;1462:26;1476:11;1462:13;:26::i;:::-;1454:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6790:17;6810:30;6828:11;6810:17;:30::i;:::-;6790:50;;6850:23;6876:8;:19;6885:9;6876:19;;;;;;;;;;;6850:45;;6905:23;6998:11;7012:6;6998:20;;7104:14;7211:23;7237:7;:20;;;7211:46;;7366:18;7357:6;:27;7353:733;;;7476:6;7455:18;:27;7443:39;;7594:5;7582:9;:17;7578:73;;;7631:5;7619:17;;7578:73;7725:9;7711:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;7711:24:1;;;;7702:33;;7782:294;7800:1;7788:9;:13;7782:294;;;7820:24;7847:43;7872:9;7883:6;7847:24;:43::i;:::-;7820:70;;7908:12;7923:19;:37;7943:16;7923:37;;;;;;;;;;;;7908:52;;8002:4;7978:6;7997:1;7985:9;:13;7978:21;;;;;;;;;;;;;:28;;;;;8024:11;;;;;;;;8053:8;;;;;;;7782:294;;;;;7353:733;8103:6;8111;8095:23;;;;;;;;;;6535:1590;;;;;;;:::o;9444:316::-;9580:15;9550:11;1462:26;1476:11;1462:13;:26::i;:::-;1454:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9611:17;9631:30;9649:11;9631:17;:30::i;:::-;9611:50;;9671:23;9697:8;:19;9706:9;9697:19;;;;;;;;;;;9671:45;;9733:7;:20;;;9726:27;;;;9444:316;;;;:::o;1090:24::-;;;;:::o;9927:343::-;10086:4;10056:11;1462:26;1476:11;1462:13;:26::i;:::-;1454:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10106:17;10126:39;10144:11;10157:7;10126:17;:39::i;:::-;10106:59;;10175:29;10207:8;:19;10216:9;10207:19;;;;;;;;;;;10175:51;;10243:13;:20;;;;;;;;;;;;10236:27;;;;9927:343;;;;;:::o;1405:107:0:-;1019:9;:7;:9::i;:::-;1011:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1477:28;1496:8;1477:18;:28::i;:::-;1405:107;:::o;683:44:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3384:1072::-;3595:26;3624:8;:19;3633:9;3624:19;;;;;;;;;;;3595:48;;3682:5;3661:26;;:10;:17;;;;;;;;;;;;:26;;;3653:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3779:4;3759:10;:17;;;:24;;;;;;;;;;;;;;;;;;3816:15;3793:10;:20;;:38;;;;3864:9;3841:10;:20;;:32;;;;3904:7;3883:10;:18;;:28;;;;;;;;;;;;:::i;:::-;;3946:11;3921:10;:22;;:36;;;;;;;;;;;;:::i;:::-;;3990:10;3968:8;:19;3977:9;3968:19;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;4040:9;4010:13;:27;4024:12;;4010:27;;;;;;;;;;;:39;;;;4059:12;;:14;;;;;;;;;;;;;4126:23;4152:8;:19;4161:9;4152:19;;;;;;;;;;;4126:45;;4181:24;4208:57;4233:9;4244:7;:20;;;4208:24;:57::i;:::-;4181:84;;4315:9;4275:19;:37;4295:16;4275:37;;;;;;;;;;;:49;;;;4334:7;:20;;;:22;;;;;;;;;;;;;4400:49;4415:11;4428:7;4437:11;4400:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4400:49:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4400:49:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4400:49:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3384:1072;;;;;;;;:::o;11385:237::-;11526:7;11583:9;11594:19;11566:48;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;11566:48:1;;;11556:59;;;;;;11549:66;;11385:237;;;;:::o;1613:225:0:-;1706:1;1686:22;;:8;:22;;;;1678:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1795:8;1766:38;;1787:6;;;;;;;;;;;1766:38;;;;;;;;;;;;1823:8;1814:6;;:17;;;;;;;;;;;;;;;;;;1613:225;:::o;268:12081:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"}},"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"packageId\",\"type\":\"bytes32\"}],\"name\":\"getPackageName\",\"outputs\":[{\"name\":\"packageName\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getReleaseId\",\"outputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"manifestURI\",\"type\":\"string\"}],\"name\":\"release\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllPackageIds\",\"outputs\":[{\"name\":\"packageIds\",\"type\":\"bytes32[]\"},{\"name\":\"pointer\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"name\":\"getReleaseData\",\"outputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"manifestURI\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"packages\",\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\"},{\"name\":\"createdAt\",\"type\":\"uint256\"},{\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"name\":\"releaseCount\",\"type\":\"uint256\"},{\"name\":\"name\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"validateStringIdentifier\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"}],\"name\":\"packageExists\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"validatePackageName\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numPackageIds\",\"outputs\":[{\"name\":\"totalCount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"generatePackageId\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"pure\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"generateReleaseId\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"releaseCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllReleaseIds\",\"outputs\":[{\"name\":\"releaseIds\",\"type\":\"bytes32[]\"},{\"name\":\"pointer\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"}],\"name\":\"numReleaseIds\",\"outputs\":[{\"name\":\"totalCount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"packageCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"releaseExists\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"releases\",\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\"},{\"name\":\"createdAt\",\"type\":\"uint256\"},{\"name\":\"packageId\",\"type\":\"bytes32\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"manifestURI\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"packageName\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"version\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"manifestURI\",\"type\":\"string\"}],\"name\":\"VersionRelease\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"PackageTransfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"}],\"devdoc\":{\"author\":\"Nick Gheorghita \",\"methods\":{\"generatePackageId(string)\":{\"details\":\"Returns name hash for a given package name.\",\"params\":{\"name\":\"Package name\"}},\"getAllPackageIds(uint256,uint256)\":{\"details\":\"Returns a slice of the array of all package ids for the named package.\",\"params\":{\"limit\":\"The length of the slice\",\"offset\":\"The starting index for the slice.\"}},\"getAllReleaseIds(string,uint256,uint256)\":{\"details\":\"Returns a slice of the array of all release hashes for the named package.\",\"params\":{\"limit\":\"The length of the slice\",\"offset\":\"The starting index for the slice.\",\"packageName\":\"Package name\"}},\"getPackageName(bytes32)\":{\"details\":\"Returns the string name of the package associated with a package id\",\"params\":{\"packageId\":\"The package id to look up\"}},\"getReleaseData(bytes32)\":{\"details\":\"Returns the package data for a release.\",\"params\":{\"releaseId\":\"Release id\"}},\"getReleaseId(string,string)\":{\"details\":\"Returns the release id for a given name and version pair if present on registry.\",\"params\":{\"packageName\":\"Package name\",\"version\":\"Version string(ex: '1.0.0')\"}},\"isOwner()\":{\"details\":\"Returns true if the caller is the current owner.\"},\"numPackageIds()\":{\"details\":\"Returns the number of packages stored on the registry\"},\"numReleaseIds(string)\":{\"details\":\"Returns the number of releases for a given package name on the registry\",\"params\":{\"packageName\":\"Package name\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"packageExists(string)\":{\"details\":\"Returns a bool indicating whether the given package exists in this registry.\",\"params\":{\"packageName\":\"Package Name\"}},\"release(string,string,string)\":{\"details\":\"Creates a new release for the named package. If this is the first release for the given package then this will also create and store the package. Returns releaseID if successful.\",\"params\":{\"manifestURI\":\"The URI for the release manifest for this release.\",\"packageName\":\"Package name\",\"version\":\"Version string (ex: '1.0.0')\"}},\"releaseExists(string,string)\":{\"details\":\"Returns a bool indicating whether the given release exists in this registry.\",\"params\":{\"packageName\":\"Package Name\",\"version\":\"version\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validatePackageName(string)\":{\"details\":\"Returns boolean whether the provided package name is valid.\",\"params\":{\"name\":\"The name of the package.\"}},\"validateStringIdentifier(string)\":{\"details\":\"Returns boolean whether the input string has a length\",\"params\":{\"value\":\"The string to validate.\"}}},\"title\":\"Contract for an ERC1319 Registry, adapted from ethpm/escape-truffle\"},\"userdoc\":{\"methods\":{\"release(string,string,string)\":{\"notice\":\"Will create a new release the given package with the given release information.\"}}}},\"settings\":{\"compilationTarget\":{\"PackageRegistry.sol\":\"PackageRegistry\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"Ownable.sol\":{\"keccak256\":\"0x298bfbd55c42a3fafe4b15c88bdad34b8d53f6d2fb754d10ba2707d4ec30e44a\",\"urls\":[\"bzzr://0694d6eec5e0ec68144cd348fcdd6a0ad9771735b1cfacf59437316e8ea628ad\",\"dweb:/ipfs/Qmdi1cTQMpXxBhnNJQC4pwhcp7EnuS6Ahd68WadHVbEsoX\"]},\"PackageRegistry.sol\":{\"keccak256\":\"0x8b7de065d06784c42a87207928300f14031609d7b2565b401eb914a94648c71c\",\"urls\":[\"bzzr://5f8d909f0d8638b9983899f22116d91caa8807b3fcc3e5a6dd80155e5734394b\",\"dweb:/ipfs/QmfR95kfNntkn4KsWNgd84N6zK3wBNwsGDdCUECoabBAW2\"]},\"PackageRegistryInterface.sol\":{\"keccak256\":\"0xdeaf9e29be83f4e95a068ac394cca26345816b71807f401edadb84710fe08eee\",\"urls\":[\"bzzr://3b255b1c10da3813e3978d062e250e9a496d604b0a45a3dc5a7f3fa5956737a3\",\"dweb:/ipfs/QmUCWXmE7Gg7Fr5zokmddf5N7t2poAQKVztoGQp6qVRB2a\"]}},\"version\":1}"}},"PackageRegistryInterface.sol":{"PackageRegistryInterface":{"abi":[{"constant":true,"inputs":[{"name":"packageId","type":"bytes32"}],"name":"getPackageName","outputs":[{"name":"packageName","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"getReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"name":"release","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllPackageIds","outputs":[{"name":"packageIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"releaseId","type":"bytes32"}],"name":"getReleaseData","outputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"},{"name":"manifestURI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numPackageIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"version","type":"string"}],"name":"generateReleaseId","outputs":[{"name":"releaseId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"},{"name":"offset","type":"uint256"},{"name":"limit","type":"uint256"}],"name":"getAllReleaseIds","outputs":[{"name":"releaseIds","type":"bytes32[]"},{"name":"pointer","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"packageName","type":"string"}],"name":"numReleaseIds","outputs":[{"name":"totalCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}],"devdoc":{"author":"Piper Merriam , Christopher Gewecke ","methods":{"getAllPackageIds(uint256,uint256)":{"details":"Returns a slice of the array of all package ids for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice."}},"getAllReleaseIds(string,uint256,uint256)":{"details":"Returns a slice of the array of all release hashes for the named package.","params":{"limit":"The length of the slice","offset":"The starting index for the slice.","packageName":"Package name"}},"getPackageName(bytes32)":{"details":"Returns the string name of the package associated with a package id","params":{"packageId":"The package id to look up"}},"getReleaseData(bytes32)":{"details":"Returns the package data for a release.","params":{"releaseId":"Release id"}},"getReleaseId(string,string)":{"details":"Returns the release id for a given name and version pair if present on registry.","params":{"packageName":"Package name","version":"Version string(ex: '1.0.0')"}},"numPackageIds()":{"details":"Returns the number of packages stored on the registry"},"numReleaseIds(string)":{"details":"Returns the number of releases for a given package name on the registry","params":{"packageName":"Package name"}},"release(string,string,string)":{"details":"Creates a a new release for the named package.","params":{"manifestURI":"The URI for the release manifest for this release.","packageName":"Package name","version":"Version string (ex: 1.0.0)"}}},"title":"EIP 1319 Smart Contract Package Registry Interface"},"evm":{"bytecode":{"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"linkReferences":{},"object":"","opcodes":"","sourceMap":""}},"metadata":"{\"compiler\":{\"version\":\"0.5.10+commit.5a6ea5b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"packageId\",\"type\":\"bytes32\"}],\"name\":\"getPackageName\",\"outputs\":[{\"name\":\"packageName\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getReleaseId\",\"outputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"manifestURI\",\"type\":\"string\"}],\"name\":\"release\",\"outputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllPackageIds\",\"outputs\":[{\"name\":\"packageIds\",\"type\":\"bytes32[]\"},{\"name\":\"pointer\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"name\":\"getReleaseData\",\"outputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"manifestURI\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"numPackageIds\",\"outputs\":[{\"name\":\"totalCount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"}],\"name\":\"generateReleaseId\",\"outputs\":[{\"name\":\"releaseId\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"uint256\"},{\"name\":\"limit\",\"type\":\"uint256\"}],\"name\":\"getAllReleaseIds\",\"outputs\":[{\"name\":\"releaseIds\",\"type\":\"bytes32[]\"},{\"name\":\"pointer\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"packageName\",\"type\":\"string\"}],\"name\":\"numReleaseIds\",\"outputs\":[{\"name\":\"totalCount\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Piper Merriam , Christopher Gewecke \",\"methods\":{\"getAllPackageIds(uint256,uint256)\":{\"details\":\"Returns a slice of the array of all package ids for the named package.\",\"params\":{\"limit\":\"The length of the slice\",\"offset\":\"The starting index for the slice.\"}},\"getAllReleaseIds(string,uint256,uint256)\":{\"details\":\"Returns a slice of the array of all release hashes for the named package.\",\"params\":{\"limit\":\"The length of the slice\",\"offset\":\"The starting index for the slice.\",\"packageName\":\"Package name\"}},\"getPackageName(bytes32)\":{\"details\":\"Returns the string name of the package associated with a package id\",\"params\":{\"packageId\":\"The package id to look up\"}},\"getReleaseData(bytes32)\":{\"details\":\"Returns the package data for a release.\",\"params\":{\"releaseId\":\"Release id\"}},\"getReleaseId(string,string)\":{\"details\":\"Returns the release id for a given name and version pair if present on registry.\",\"params\":{\"packageName\":\"Package name\",\"version\":\"Version string(ex: '1.0.0')\"}},\"numPackageIds()\":{\"details\":\"Returns the number of packages stored on the registry\"},\"numReleaseIds(string)\":{\"details\":\"Returns the number of releases for a given package name on the registry\",\"params\":{\"packageName\":\"Package name\"}},\"release(string,string,string)\":{\"details\":\"Creates a a new release for the named package.\",\"params\":{\"manifestURI\":\"The URI for the release manifest for this release.\",\"packageName\":\"Package name\",\"version\":\"Version string (ex: 1.0.0)\"}}},\"title\":\"EIP 1319 Smart Contract Package Registry Interface\"},\"userdoc\":{\"methods\":{\"release(string,string,string)\":{\"notice\":\"Will create a new release the given package with the given release information.\"}}}},\"settings\":{\"compilationTarget\":{\"PackageRegistryInterface.sol\":\"PackageRegistryInterface\"},\"evmVersion\":\"petersburg\",\"libraries\":{},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"PackageRegistryInterface.sol\":{\"keccak256\":\"0xdeaf9e29be83f4e95a068ac394cca26345816b71807f401edadb84710fe08eee\",\"urls\":[\"bzzr://3b255b1c10da3813e3978d062e250e9a496d604b0a45a3dc5a7f3fa5956737a3\",\"dweb:/ipfs/QmUCWXmE7Gg7Fr5zokmddf5N7t2poAQKVztoGQp6qVRB2a\"]}},\"version\":1}"}}},"sources":{"Ownable.sol":{"id":0},"PackageRegistry.sol":{"id":1},"PackageRegistryInterface.sol":{"id":2}}} diff --git a/web3/pm.py b/web3/pm.py index 4fae4b1b84..34316fe637 100644 --- a/web3/pm.py +++ b/web3/pm.py @@ -544,7 +544,7 @@ def _validate_set_ens(self) -> None: def get_simple_registry_manifest() -> Dict[str, Any]: - return json.loads((ASSETS_DIR / "registry" / "2.0.0a1.json").read_text()) + return json.loads((ASSETS_DIR / "simple-registry" / "2.0.0a1.json").read_text()) def validate_is_supported_manifest_uri(uri): From d0e6234a3a7687326cfbfd4f944afb087b1a585b Mon Sep 17 00:00:00 2001 From: Nick Gheorghita Date: Mon, 29 Jul 2019 11:48:31 -0600 Subject: [PATCH 2/2] Update ethpm.rst --- docs/web3.pm.rst | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/docs/web3.pm.rst b/docs/web3.pm.rst index dcff963478..8c5d7f877a 100644 --- a/docs/web3.pm.rst +++ b/docs/web3.pm.rst @@ -40,25 +40,17 @@ The following methods are available on the ``web3.pm`` namespace. .. autoclass:: web3.pm.PM :members: -.. autoclass:: web3.pm.ERCRegistry +.. autoclass:: web3.pm.ERC1319Registry :members: __init__, _release, _get_package_name, _get_all_package_ids, _get_release_id, _get_all_release_ids, _get_release_data, _generate_release_id, _num_package_ids, _num_release_ids -.. autoclass:: web3.pm.VyperReferenceRegistry - :members: deploy_new_instance, owner, transfer_owner - -.. autoclass:: web3.pm.SolidityReferenceRegistry - :members: - Creating your own Registry class -------------------------------- -If you want to implement your own registry and use it with ``web3.pm``, you must create a subclass that inherits from ``ERCRegistry``, and implements all the `ERC 1319 standard methods `_ prefixed with an underscore in ``ERCRegistry``. Then, you have to manually set it as the ``registry`` attribute on ``web3.pm``. +If you want to implement your own registry and use it with ``web3.pm``, you must create a subclass that inherits from ``ERC1319Registry``, and implements all the `ERC 1319 standard methods `_ prefixed with an underscore in ``ERC1319Registry``. Then, you have to manually set it as the ``registry`` attribute on ``web3.pm``. .. code-block:: python custom_registry = CustomRegistryClass(address, w3) w3.pm.registry = custom_registry -One reason a user might want to create their own Registry class is if they build a custom Package Registry smart contract that has features beyond those specified in `ERC 1319 `_. For example, the ability to delete a release or some micropayment feature. Rather than accessing those functions directly on the contract instance, they can create a custom ``ERCRegistry`` subclass to easily call both the standard & custom methods. - -The ``VyperReferenceRegistry`` class is an example of this, as it contains all of the ``ERC 1319`` defined functions (prefixed with an underscore, eg ``_get_package_name``) but also contains functions that are unique to the Vyper Registry reference implementation (eg ``transfer_owner``). +One reason a user might want to create their own Registry class is if they build a custom Package Registry smart contract that has features beyond those specified in `ERC 1319 `_. For example, the ability to delete a release or some micropayment feature. Rather than accessing those functions directly on the contract instance, they can create a custom ``ERC1319Registry`` subclass to easily call both the standard & custom methods.