Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 99 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 15296046 | 705 days ago | IN | 0 ETH | 0.00268512 | ||||
Set Approval For... | 15178810 | 724 days ago | IN | 0 ETH | 0.00066071 | ||||
Set Approval For... | 14998192 | 753 days ago | IN | 0 ETH | 0.00098381 | ||||
Set Approval For... | 14909237 | 768 days ago | IN | 0 ETH | 0.00285816 | ||||
Set Approval For... | 14830819 | 781 days ago | IN | 0 ETH | 0.00162537 | ||||
Transfer From | 14813113 | 784 days ago | IN | 0 ETH | 0.00509024 | ||||
Set Approval For... | 14810116 | 785 days ago | IN | 0 ETH | 0.0004318 | ||||
Set Approval For... | 14810115 | 785 days ago | IN | 0 ETH | 0.0006814 | ||||
Set Approval For... | 14803101 | 786 days ago | IN | 0 ETH | 0.00063395 | ||||
Transfer From | 14800471 | 786 days ago | IN | 0 ETH | 0.00215893 | ||||
Transfer From | 14800469 | 786 days ago | IN | 0 ETH | 0.00347944 | ||||
Set Approval For... | 14799802 | 786 days ago | IN | 0 ETH | 0.00309515 | ||||
Public Mint | 14785584 | 789 days ago | IN | 0.06 ETH | 0.00477411 | ||||
Public Mint | 14785584 | 789 days ago | IN | 0.06 ETH | 0.0059445 | ||||
Public Mint | 14785584 | 789 days ago | IN | 0.06 ETH | 0.00541521 | ||||
Public Mint | 14785584 | 789 days ago | IN | 0.06 ETH | 0.00396555 | ||||
Set Approval For... | 14783340 | 789 days ago | IN | 0 ETH | 0.00069138 | ||||
Set Approval For... | 14782700 | 789 days ago | IN | 0 ETH | 0.00087538 | ||||
Withdraw | 14781273 | 789 days ago | IN | 0 ETH | 0.00873628 | ||||
Public Mint | 14781235 | 789 days ago | IN | 0.06 ETH | 0.00603688 | ||||
Safe Transfer Fr... | 14776799 | 790 days ago | IN | 0 ETH | 0.00437355 | ||||
Set Approval For... | 14776749 | 790 days ago | IN | 0 ETH | 0.00129677 | ||||
Set Approval For... | 14775738 | 790 days ago | IN | 0 ETH | 0.00142626 | ||||
Transfer From | 14774967 | 790 days ago | IN | 0 ETH | 0.00422261 | ||||
Public Mint | 14774446 | 790 days ago | IN | 0.06 ETH | 0.00212708 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15296046 | 705 days ago | 0.0024 ETH | ||||
15296046 | 705 days ago | 0.0048 ETH | ||||
15296046 | 705 days ago | 0.0048 ETH | ||||
15296046 | 705 days ago | 0.0072 ETH | ||||
15296046 | 705 days ago | 0.012 ETH | ||||
15296046 | 705 days ago | 0.0084 ETH | ||||
15296046 | 705 days ago | 0.0084 ETH | ||||
15296046 | 705 days ago | 0.024 ETH | ||||
15296046 | 705 days ago | 0.024 ETH | ||||
15296046 | 705 days ago | 0.024 ETH | ||||
15296046 | 705 days ago | 0.024 ETH | ||||
15296046 | 705 days ago | 0.048 ETH | ||||
15296046 | 705 days ago | 0.048 ETH | ||||
14781273 | 789 days ago | 0.0514 ETH | ||||
14781273 | 789 days ago | 0.1028 ETH | ||||
14781273 | 789 days ago | 0.1028 ETH | ||||
14781273 | 789 days ago | 0.1542 ETH | ||||
14781273 | 789 days ago | 0.257 ETH | ||||
14781273 | 789 days ago | 0.1799 ETH | ||||
14781273 | 789 days ago | 0.1799 ETH | ||||
14781273 | 789 days ago | 0.514 ETH | ||||
14781273 | 789 days ago | 0.514 ETH | ||||
14781273 | 789 days ago | 0.514 ETH | ||||
14781273 | 789 days ago | 0.514 ETH | ||||
14781273 | 789 days ago | 1.028 ETH |
Loading...
Loading
Contract Name:
MutantHamsters
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@ (@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@ #@@@ *@. @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@# @ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@, @ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@ @ *@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @ @@& @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ ,@ &@@@@@@@.@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@&@@ @@@@@@@@@@@* *@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @ @@@@@@@@@@@@( @ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@. @@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@ @@ @@@@@ @@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@ #@@@@@@@ @@@@* @@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@, %@@@@@ @ @@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@ @@@@ &%@( % @@@@@@@@@@@ @@@@@@@@@@@. , ( @@@@@@@@@@@@@ @@@@@@@@@@@@ @@ @@@@@@@@@@@@@ @@@@@@@@@@@@ @@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@& @@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@ @ @@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@( @@@@@# @@@@@ %@@ @@ @@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@ /@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ /// @creator: Mutant Hamsters /// @author: BGOuk import "./Ownable.sol"; import "./Strings.sol"; import "./MerkleProof.sol"; import "ERC721A.sol"; import "./MutantHamstersYield.sol"; contract MutantHamsters is MutantHamstersYield { using Strings for uint256; string baseURI; uint256 public constant _maxSupply = 3333; uint256 public constant _maxMint = 3323; uint256 public constant _maxMintAmountPerAddressPublic = 5; uint256 public constant _maxMintAmountPerAddressWL = 3; uint256 public constant _WLCost = 0.04 ether; uint256 public constant _PublicCost = 0.06 ether; bool public _mintOpened; uint256 public publicSaleAfter; bytes32 public immutable _WLroot; constructor( string memory initialBaseURI, bytes32 WLroot ) ERC721A("Mutant Hamsters", "MH",_maxMintAmountPerAddressPublic,_maxSupply) { baseURI = initialBaseURI; _WLroot = WLroot; } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function publicMint(uint256 mintAmount) public payable{ require(_mintOpened, "Minting now allowed yet"); require(mintAmount > 0,"The quantity cannot be a negative number"); uint256 price = 0; require(_numberMinted(msg.sender) + mintAmount <= _maxMintAmountPerAddressPublic,"Maximum mint amount exceeded"); price = _PublicCost * mintAmount; require(msg.value >= price,"Not Enough ETH"); require((_maxMint - totalSupply()) - mintAmount >= 0,"Not Enough Mintable Token"); _safeMint(msg.sender,mintAmount); yieldToken.updateRewardOnMint(msg.sender); } function presaleMint(uint256 mintAmount,bytes32[] memory proof) public payable{ require(_mintOpened, "Minting now allowed yet"); require(mintAmount > 0,"The quantity cannot be a negative number"); uint256 mintedToken = _numberMinted(msg.sender); bool presale = true; uint256 price = 0; if(block.timestamp > publicSaleAfter) presale = false; if(presale && _verify(msg.sender,proof,_WLroot)){ price = getPresaleCost(mintAmount,_WLCost,msg.sender); } else revert("Pre-Sale is over"); require(mintedToken + mintAmount <= (_maxMintAmountPerAddressPublic),"Maximum mint amount exceeded"); require(msg.value >= price,"Not Enough ETH"); require((_maxMint - totalSupply()) - mintAmount >= 0,"Not Enough Mintable Token"); _safeMint(msg.sender,mintAmount); yieldToken.updateRewardOnMint(msg.sender); } function getPresaleCost(uint256 mintAmount,uint256 roleCost,address sender) public view returns(uint256 price) { uint256 mintedToken = _numberMinted(sender); require(mintAmount>0,"Mint amount cannot be zero"); require((_maxMintAmountPerAddressPublic - mintedToken) >= mintAmount ,"Maximum mint amount exceeded"); if ((_maxMintAmountPerAddressWL - mintedToken) < 1 ) { price = mintAmount*_PublicCost; } else { uint256 remainingPresaleCount = _maxMintAmountPerAddressWL - mintedToken; if (mintAmount>remainingPresaleCount) { price = remainingPresaleCount*roleCost + (mintAmount-remainingPresaleCount)*_PublicCost; } else { price = mintAmount*roleCost; } } } function _verify(address _address,bytes32[] memory proof,bytes32 listroot) internal pure returns(bool){ return MerkleProof.verify(proof,listroot,keccak256(abi.encodePacked(_address))); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return string( abi.encodePacked( currentBaseURI, tokenId.toString(), ".json" ) ); } //only owner function setBaseURI(string memory newBaseURI) external onlyOwner{ baseURI = newBaseURI; } function startMint() external onlyOwner{ _mintOpened = true; publicSaleAfter = block.timestamp + 4 hours; } function toggleMint() external onlyOwner{ _mintOpened = !_mintOpened; } function ownerMint(uint256 quantity,address _address) external onlyOwner{ uint256 mod = quantity%5; for(uint256 i = 0;i<quantity/5;i++){ _safeMint(_address,5); } if(mod != 0) _safeMint(_address,mod); } function withdraw() public payable onlyOwner { uint256 balance = address(this).balance; withdrawInternal(0x321011E9BcDF93F57174f9Afd28083701ee27634,(balance*200)/1000); withdrawInternal(0xfB1b6058E73E8eE71a5e2cf5d7a370b16e11D13F,(balance*200)/1000); withdrawInternal(0xF9080Ac7188724d898665fD61A25caD56C62F9d3,(balance*100)/1000); withdrawInternal(0x7f69789732d31AF98b2766dBdf23a69612D2B5C5,(balance*100)/1000); withdrawInternal(0x1b207D0A58892BDCE713bd90D0aF63eF8C2435AA,(balance*100)/1000); withdrawInternal(0x2D3cca8356aD7Bb654499B1ba8BA4e26346d3Edf,(balance*100)/1000); withdrawInternal(0xb83ce0cf4F53F82d22C98C6378E7fe337d01B1b9,(balance*35)/1000); withdrawInternal(0x29b7aAA30A47F779bFF900551A1AeA76b983ad75,(balance*35)/1000); withdrawInternal(0x433AA2913eFc08042899aB9b6fCFC7B7E901Fa8a,(balance*50)/1000); withdrawInternal(0xCF06446c0372Bf1BB771d0E9AD9c16fD0d3cdD7B,(balance*30)/1000); withdrawInternal(0x55C1D22188A6b195b30E354E59D16fe35e853F33,(balance*20)/1000); withdrawInternal(0xf37ed805aA7bCf1C98d91B75d0c4DAA89773C560,(balance*20)/1000); withdrawInternal(0xFC5127d20e8775eEEF3db7F34340d01B635A0525,(balance*10)/1000); } function withdrawInternal(address to,uint256 amount) internal onlyOwner{ (bool success, ) = to.call{ value: amount }(""); require(success); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); require(totalSupply() + quantity <= collectionSize,"ERC721A: collection size exceeded"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; import "./Ownable.sol"; import "./ERC721A.sol"; contract MutantHamstersToken is ERC20, Ownable { uint256 public immutable maxSupply; uint256 public claimable; bool public isInitialed = false; mapping(address => uint256) public _rewards; mapping(address => uint256) public _lastUpdate; uint256 public immutable dailyReward; ERC721A public immutable _hamstersContract; address STAKE_POOL_ADDRESS = address(0x1F34eb9801CfD9E7cA6a97b7166d6DbaF9A6A788); event RewardClaimed(address indexed user, uint256 indexed reward); modifier InitialModifier() { require(!isInitialed,"already initialed"); isInitialed = true; _; } constructor(address _hamsters) ERC20("Mutant Hamsters Token", "MHT") { _hamstersContract = ERC721A(_hamsters); maxSupply = 1000000000 * (10**decimals()); dailyReward = 100*(10**decimals()); } function Initial() external InitialModifier onlyOwner { _mint(STAKE_POOL_ADDRESS, (maxSupply/100)*20); claimable = maxSupply - ((maxSupply/100)*20); } function updateRewardOnMint(address _user) external { if(claimable == 0) return; require(msg.sender == address(_hamstersContract), "Can't call this"); uint256 timerUser = _lastUpdate[_user]; uint256 time = block.timestamp; uint256 subTime = time - timerUser; subTime = subTime == time ? 1: subTime; uint256 reward = dailyReward +_hamstersContract.balanceOf(_user)*((dailyReward / 1 days)*subTime); if(reward > claimable) reward = claimable; _rewards[_user] += reward; claimable -= reward; _lastUpdate[_user] = time; } // called on transfers function updateReward(address _from, address _to) external { if(claimable == 0) return; require(msg.sender == address(_hamstersContract), "Can't call this"); uint256 time = block.timestamp; uint256 timerFrom = _lastUpdate[_from]; uint256 subTime = time - timerFrom; subTime = subTime == time ? 1: subTime; uint256 reward = _hamstersContract.balanceOf(_from)*((dailyReward / 1 days)*subTime); if(reward > claimable) reward = claimable; _rewards[_from] += reward; claimable -= reward; if (_to != address(0)) { if(claimable == 0) return; uint256 timerTo = _lastUpdate[_to]; subTime = time - timerTo; subTime = subTime == time ? 1: subTime; reward = _hamstersContract.balanceOf(_to)*((dailyReward / 1 days)*subTime); if(reward > claimable) reward = claimable; _rewards[_to] += reward; claimable -= reward; _lastUpdate[_to] = time; } _lastUpdate[_from] = time; } function getReward(address _to) external { require(msg.sender == address(_hamstersContract), "Can't call this"); uint256 reward = _rewards[_to]; if (reward > 0) { _rewards[_to] = 0; _mint(_to, reward); emit RewardClaimed(_to, reward); } } function mint(address to, uint256 amount) external onlyOwner returns(uint256) { if(claimable == 0) return 0; if(amount > claimable) amount = claimable; _mint(to,amount); claimable -= amount; return amount; } function burn(address _from, uint256 _amount) external { _burn(_from, _amount); } function getTotalClaimable(address _user) external view returns(uint256) { if(claimable == 0) return _rewards[_user]; uint256 time = block.timestamp; uint256 subTime = time - _lastUpdate[_user]; subTime = subTime == time ? 1: subTime; uint256 pending = _hamstersContract.balanceOf(_user)*((dailyReward / 1 days)*subTime); if(pending > claimable) pending = claimable; return _rewards[_user] + pending; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./ERC721A.sol"; import "./MutantHamstersToken.sol"; abstract contract MutantHamstersYield is ERC721A, Ownable{ MutantHamstersToken public yieldToken; function setYieldToken(address _yield) external onlyOwner { yieldToken = MutantHamstersToken(_yield); } function getReward() external { yieldToken.updateReward(msg.sender, address(0)); yieldToken.getReward(msg.sender); } function transferFrom(address from, address to, uint256 tokenId) public override { ERC721A.transferFrom(from, to, tokenId); yieldToken.updateReward(from, to); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override { ERC721A.safeTransferFrom(from, to, tokenId, _data); yieldToken.updateReward(from, to); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @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. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * 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. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"initialBaseURI","type":"string"},{"internalType":"bytes32","name":"WLroot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_PublicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WLCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_WLroot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxMintAmountPerAddressPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxMintAmountPerAddressWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mintOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"uint256","name":"roleCost","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"getPresaleCost","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yield","type":"address"}],"name":"setYieldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"yieldToken","outputs":[{"internalType":"contract MutantHamstersToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e06040526000805560006007553480156200001a57600080fd5b5060405162006178380380620061788339818101604052810190620000409190620003df565b6040518060400160405280600f81526020017f4d7574616e742048616d737465727300000000000000000000000000000000008152506040518060400160405280600281526020017f4d480000000000000000000000000000000000000000000000000000000000008152506005610d0560008111620000f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000ee90620004b5565b60405180910390fd5b600082116200013d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001349062000493565b60405180910390fd5b8360019080519060200190620001559291906200029a565b5082600290805190602001906200016e9291906200029a565b508160a08181525050806080818152505050505050620001a362000197620001cc60201b60201c565b620001d460201b60201c565b81600a9080519060200190620001bb9291906200029a565b508060c0818152505050506200072e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a89062000587565b90600052602060002090601f016020900481019282620002cc576000855562000318565b82601f10620002e757805160ff191683800117855562000318565b8280016001018555821562000318579182015b8281111562000317578251825591602001919060010190620002fa565b5b5090506200032791906200032b565b5090565b5b80821115620003465760008160009055506001016200032c565b5090565b6000620003616200035b8462000500565b620004d7565b90508281526020810184848401111562000380576200037f62000656565b5b6200038d84828562000551565b509392505050565b600081519050620003a68162000714565b92915050565b600082601f830112620003c457620003c362000651565b5b8151620003d68482602086016200034a565b91505092915050565b60008060408385031215620003f957620003f862000660565b5b600083015167ffffffffffffffff8111156200041a57620004196200065b565b5b6200042885828601620003ac565b92505060206200043b8582860162000395565b9150509250929050565b60006200045460278362000536565b9150620004618262000676565b604082019050919050565b60006200047b602e8362000536565b91506200048882620006c5565b604082019050919050565b60006020820190508181036000830152620004ae8162000445565b9050919050565b60006020820190508181036000830152620004d0816200046c565b9050919050565b6000620004e3620004f6565b9050620004f18282620005bd565b919050565b6000604051905090565b600067ffffffffffffffff8211156200051e576200051d62000622565b5b620005298262000665565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006002820490506001821680620005a057607f821691505b60208210811415620005b757620005b6620005f3565b5b50919050565b620005c88262000665565b810181811067ffffffffffffffff82111715620005ea57620005e962000622565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6200071f8162000547565b81146200072b57600080fd5b50565b60805160a05160c051615a056200077360003960008181611e4101526121440152600081816128740152818161289d0152613463015260006133a50152615a056000f3fe60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063d7224ba01161006f578063d7224ba014610821578063e13e0da51461084c578063e3e1e8ef14610877578063e985e9c514610893578063f2fde38b146108d05761023b565b8063b88d4fde14610750578063c869086514610779578063c87b56dd146107a4578063d3dd5fe0146107e1578063d52c57e0146107f85761023b565b80638da5cb5b116100f25780638da5cb5b1461066957806395d89b4114610694578063a22cb465146106bf578063a6128e63146106e8578063b640392c146107255761023b565b80636352211e14610582578063645a994c146105bf57806370a08231146105ea578063715018a61461062757806376d5de851461063e5761023b565b80632976538e116101bc5780633d18b912116101805780633d18b912146104b157806342842e0e146104c85780634f6ccce7146104f157806355f804b31461052e5780635f0bbdba146105575761023b565b80632976538e1461040c5780632be09561146104375780632db115441461044e5780632f745c591461046a5780633ccfd60b146104a75761023b565b806319981dd11161020357806319981dd1146103395780631b5294ef1461036457806322f4596f1461038f57806323b872dd146103ba57806323ffce85146103e35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613f86565b6108f9565b6040516102749190614776565b60405180910390f35b34801561028957600080fd5b50610292610a43565b60405161029f91906147c7565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190614029565b610ad5565b6040516102dc91906146e6565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613f46565b610b5a565b005b34801561031a57600080fd5b50610323610c73565b6040516103309190614b89565b60405180910390f35b34801561034557600080fd5b5061034e610c7c565b60405161035b9190614776565b60405180910390f35b34801561037057600080fd5b50610379610c8f565b6040516103869190614b89565b60405180910390f35b34801561039b57600080fd5b506103a4610c94565b6040516103b19190614b89565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613e30565b610c9a565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613dc3565b610d39565b005b34801561041857600080fd5b50610421610df9565b60405161042e9190614b89565b60405180910390f35b34801561044357600080fd5b5061044c610e04565b005b61046860048036038101906104639190614029565b610eb1565b005b34801561047657600080fd5b50610491600480360381019061048c9190613f46565b6110f2565b60405161049e9190614b89565b60405180910390f35b6104af6112f0565b005b3480156104bd57600080fd5b506104c661163f565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613e30565b61175e565b005b3480156104fd57600080fd5b5061051860048036038101906105139190614029565b61177e565b6040516105259190614b89565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613fe0565b6117d1565b005b34801561056357600080fd5b5061056c611867565b6040516105799190614b89565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614029565b61186d565b6040516105b691906146e6565b60405180910390f35b3480156105cb57600080fd5b506105d4611883565b6040516105e19190614b89565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613dc3565b611888565b60405161061e9190614b89565b60405180910390f35b34801561063357600080fd5b5061063c611971565b005b34801561064a57600080fd5b506106536119f9565b60405161066091906147ac565b60405180910390f35b34801561067557600080fd5b5061067e611a1f565b60405161068b91906146e6565b60405180910390f35b3480156106a057600080fd5b506106a9611a49565b6040516106b691906147c7565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613f06565b611adb565b005b3480156106f457600080fd5b5061070f600480360381019061070a91906140f2565b611c5c565b60405161071c9190614b89565b60405180910390f35b34801561073157600080fd5b5061073a611d98565b6040516107479190614b89565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613e83565b611d9e565b005b34801561078557600080fd5b5061078e611e3f565b60405161079b9190614791565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190614029565b611e63565b6040516107d891906147c7565b60405180910390f35b3480156107ed57600080fd5b506107f6611eeb565b005b34801561080457600080fd5b5061081f600480360381019061081a9190614056565b611f93565b005b34801561082d57600080fd5b5061083661206e565b6040516108439190614b89565b60405180910390f35b34801561085857600080fd5b50610861612074565b60405161086e9190614b89565b60405180910390f35b610891600480360381019061088c9190614096565b61207f565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613df0565b612355565b6040516108c79190614776565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190613dc3565b6123e9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3c5750610a3b826124e1565b5b9050919050565b606060018054610a5290614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7e90614f70565b8015610acb5780601f10610aa057610100808354040283529160200191610acb565b820191906000526020600020905b815481529060010190602001808311610aae57829003601f168201915b5050505050905090565b6000610ae08261254b565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690614b49565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b658261186d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90614a49565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf5612558565b73ffffffffffffffffffffffffffffffffffffffff161480610c245750610c2381610c1e612558565b612355565b5b610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90614909565b60405180910390fd5b610c6e838383612560565b505050565b60008054905090565b600b60009054906101000a900460ff1681565b600381565b610d0581565b610ca5838383612612565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a84846040518363ffffffff1660e01b8152600401610d02929190614701565b600060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b50505050505050565b610d41612558565b73ffffffffffffffffffffffffffffffffffffffff16610d5f611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614989565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b668e1bc9bf04000081565b610e0c612558565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614989565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555061384042610ea99190614ceb565b600c81905550565b600b60009054906101000a900460ff16610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790614a29565b60405180910390fd5b60008111610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90614a69565b60405180910390fd5b6000600582610f5133612622565b610f5b9190614ceb565b1115610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614929565b60405180910390fd5b8166d529ae9e860000610faf9190614d72565b905080341015610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614849565b60405180910390fd5b600082610fff610c73565b610cfb61100c9190614e00565b6110169190614e00565b1015611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614a09565b60405180910390fd5b611061338361270b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7985a8336040518263ffffffff1660e01b81526004016110bc91906146e6565b600060405180830381600087803b1580156110d657600080fd5b505af11580156110ea573d6000803e3d6000fd5b505050505050565b60006110fd83611888565b821061113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906147e9565b60405180910390fd5b6000611148610c73565b905060008060005b838110156112ae576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561129a578684141561128b5781955050505050506112ea565b838061129690614fd3565b9450505b5080806112a690614fd3565b915050611150565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614ae9565b60405180910390fd5b92915050565b6112f8612558565b73ffffffffffffffffffffffffffffffffffffffff16611316611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390614989565b60405180910390fd5b60004790506113a873321011e9bcdf93f57174f9afd28083701ee276346103e860c8846113999190614d72565b6113a39190614d41565b612729565b6113df73fb1b6058e73e8ee71a5e2cf5d7a370b16e11d13f6103e860c8846113d09190614d72565b6113da9190614d41565b612729565b61141673f9080ac7188724d898665fd61a25cad56c62f9d36103e86064846114079190614d72565b6114119190614d41565b612729565b61144d737f69789732d31af98b2766dbdf23a69612d2b5c56103e860648461143e9190614d72565b6114489190614d41565b612729565b611484731b207d0a58892bdce713bd90d0af63ef8c2435aa6103e86064846114759190614d72565b61147f9190614d41565b612729565b6114bb732d3cca8356ad7bb654499b1ba8ba4e26346d3edf6103e86064846114ac9190614d72565b6114b69190614d41565b612729565b6114f273b83ce0cf4f53f82d22c98c6378e7fe337d01b1b96103e86023846114e39190614d72565b6114ed9190614d41565b612729565b6115297329b7aaa30a47f779bff900551a1aea76b983ad756103e860238461151a9190614d72565b6115249190614d41565b612729565b61156073433aa2913efc08042899ab9b6fcfc7b7e901fa8a6103e86032846115519190614d72565b61155b9190614d41565b612729565b61159773cf06446c0372bf1bb771d0e9ad9c16fd0d3cdd7b6103e8601e846115889190614d72565b6115929190614d41565b612729565b6115ce7355c1d22188a6b195b30e354e59d16fe35e853f336103e86014846115bf9190614d72565b6115c99190614d41565b612729565b61160573f37ed805aa7bcf1c98d91b75d0c4daa89773c5606103e86014846115f69190614d72565b6116009190614d41565b612729565b61163c73fc5127d20e8775eeef3db7f34340d01b635a05256103e8600a8461162d9190614d72565b6116379190614d41565b612729565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a3360006040518363ffffffff1660e01b815260040161169d929190614701565b600060405180830381600087803b1580156116b757600080fd5b505af11580156116cb573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c00007b0336040518263ffffffff1660e01b815260040161172a91906146e6565b600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b50505050565b61177983838360405180602001604052806000815250611d9e565b505050565b6000611788610c73565b82106117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090614869565b60405180910390fd5b819050919050565b6117d9612558565b73ffffffffffffffffffffffffffffffffffffffff166117f7611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614989565b60405180910390fd5b80600a9080519060200190611863929190613aea565b5050565b600c5481565b600061187882612820565b600001519050919050565b600581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f090614949565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611979612558565b73ffffffffffffffffffffffffffffffffffffffff16611997611a1f565b73ffffffffffffffffffffffffffffffffffffffff16146119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e490614989565b60405180910390fd5b6119f76000612a23565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a5890614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490614f70565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b5050505050905090565b611ae3612558565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b48906149c9565b60405180910390fd5b8060066000611b5e612558565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0b612558565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c509190614776565b60405180910390a35050565b600080611c6883612622565b905060008511611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca490614b29565b60405180910390fd5b84816005611cbb9190614e00565b1015611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614929565b60405180910390fd5b6001816003611d0b9190614e00565b1015611d2b5766d529ae9e86000085611d249190614d72565b9150611d90565b6000816003611d3a9190614e00565b905080861115611d7f5766d529ae9e8600008187611d589190614e00565b611d629190614d72565b8582611d6e9190614d72565b611d789190614ceb565b9250611d8e565b8486611d8b9190614d72565b92505b505b509392505050565b610cfb81565b611daa84848484612ae9565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b8152600401611e07929190614701565b600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060611e6e8261254b565b611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea4906149a9565b60405180910390fd5b6000611eb7612b45565b905080611ec384612bd7565b604051602001611ed49291906146a2565b604051602081830303815290604052915050919050565b611ef3612558565b73ffffffffffffffffffffffffffffffffffffffff16611f11611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90614989565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b611f9b612558565b73ffffffffffffffffffffffffffffffffffffffff16611fb9611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614989565b60405180910390fd5b600060058361201e9190615040565b905060005b6005846120309190614d41565b8110156120555761204283600561270b565b808061204d90614fd3565b915050612023565b506000811461206957612068828261270b565b5b505050565b60075481565b66d529ae9e86000081565b600b60009054906101000a900460ff166120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614a29565b60405180910390fd5b60008211612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890614a69565b60405180910390fd5b600061211c33612622565b90506000600190506000600c5442111561213557600091505b818015612169575061216833857f0000000000000000000000000000000000000000000000000000000000000000612d38565b5b156121875761218085668e1bc9bf04000033611c5c565b90506121c2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906148c9565b60405180910390fd5b600585846121d09190614ceb565b1115612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614929565b60405180910390fd5b80341015612254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224b90614849565b60405180910390fd5b60008561225f610c73565b610cfb61226c9190614e00565b6122769190614e00565b10156122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae90614a09565b60405180910390fd5b6122c1338661270b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7985a8336040518263ffffffff1660e01b815260040161231c91906146e6565b600060405180830381600087803b15801561233657600080fd5b505af115801561234a573d6000803e3d6000fd5b505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123f1612558565b73ffffffffffffffffffffffffffffffffffffffff1661240f611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90614989565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cc90614809565b60405180910390fd5b6124de81612a23565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61261d838383612d74565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268a906148a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61272582826040518060200160405280600081525061332d565b5050565b612731612558565b73ffffffffffffffffffffffffffffffffffffffff1661274f611a1f565b73ffffffffffffffffffffffffffffffffffffffff16146127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90614989565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127cb906146d1565b60006040518083038185875af1925050503d8060008114612808576040519150601f19603f3d011682016040523d82523d6000602084013e61280d565b606091505b505090508061281b57600080fd5b505050565b612828613b70565b6128318261254b565b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614829565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106128d45760017f0000000000000000000000000000000000000000000000000000000000000000846128c79190614e00565b6128d19190614ceb565b90505b60008390505b8181106129e2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129ce57809350505050612a1e565b5080806129da90614f46565b9150506128da565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1590614b09565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af4848484612d74565b612b0084848484613881565b612b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3690614a89565b60405180910390fd5b50505050565b6060600a8054612b5490614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8090614f70565b8015612bcd5780601f10612ba257610100808354040283529160200191612bcd565b820191906000526020600020905b815481529060010190602001808311612bb057829003601f168201915b5050505050905090565b60606000821415612c1f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d33565b600082905060005b60008214612c51578080612c3a90614fd3565b915050600a82612c4a9190614d41565b9150612c27565b60008167ffffffffffffffff811115612c6d57612c6c61512d565b5b6040519080825280601f01601f191660200182016040528015612c9f5781602001600182028036833780820191505090505b5090505b60008514612d2c57600182612cb89190614e00565b9150600a85612cc79190615040565b6030612cd39190614ceb565b60f81b818381518110612ce957612ce86150fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d259190614d41565b9450612ca3565b8093505050505b919050565b6000612d6b838386604051602001612d509190614687565b60405160208183030381529060405280519060200120613a18565b90509392505050565b6000612d7f82612820565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612da6612558565b73ffffffffffffffffffffffffffffffffffffffff161480612e025750612dcb612558565b73ffffffffffffffffffffffffffffffffffffffff16612dea84610ad5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e1e5750612e1d8260000151612e18612558565b612355565b5b905080612e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e57906149e9565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec990614969565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3990614889565b60405180910390fd5b612f4f8585856001613a2f565b612f5f6000848460000151612560565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fcd9190614dcc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166130719190614ca5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846131779190614ceb565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156132bd576131ed8161254b565b156132bc576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133258686866001613a35565b505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a90614ac9565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000836133cd610c73565b6133d79190614ceb565b1115613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340f906148e9565b60405180910390fd5b6134218161254b565b15613461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345890614aa9565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156134c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bb90614b69565b60405180910390fd5b6134d16000858386613a2f565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135ce9190614ca5565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135f59190614ca5565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561386457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138046000888488613881565b613843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383a90614a89565b60405180910390fd5b818061384e90614fd3565b925050808061385c90614fd3565b915050613793565b50806000819055506138796000878588613a35565b505050505050565b60006138a28473ffffffffffffffffffffffffffffffffffffffff16613a3b565b15613a0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138cb612558565b8786866040518563ffffffff1660e01b81526004016138ed949392919061472a565b602060405180830381600087803b15801561390757600080fd5b505af192505050801561393857506040513d601f19601f820116820180604052508101906139359190613fb3565b60015b6139bb573d8060008114613968576040519150601f19603f3d011682016040523d82523d6000602084013e61396d565b606091505b506000815114156139b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139aa90614a89565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a10565b600190505b949350505050565b600082613a258584613a5e565b1490509392505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015613ac8576000858281518110613a8557613a846150fe565b5b60200260200101519050808311613aa757613aa08382613ad3565b9250613ab4565b613ab18184613ad3565b92505b508080613ac090614fd3565b915050613a67565b508091505092915050565b600082600052816020526040600020905092915050565b828054613af690614f70565b90600052602060002090601f016020900481019282613b185760008555613b5f565b82601f10613b3157805160ff1916838001178555613b5f565b82800160010185558215613b5f579182015b82811115613b5e578251825591602001919060010190613b43565b5b509050613b6c9190613baa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613bc3576000816000905550600101613bab565b5090565b6000613bda613bd584614bc9565b614ba4565b90508083825260208201905082856020860282011115613bfd57613bfc615161565b5b60005b85811015613c2d5781613c138882613d13565b845260208401935060208301925050600181019050613c00565b5050509392505050565b6000613c4a613c4584614bf5565b614ba4565b905082815260208101848484011115613c6657613c65615166565b5b613c71848285614f04565b509392505050565b6000613c8c613c8784614c26565b614ba4565b905082815260208101848484011115613ca857613ca7615166565b5b613cb3848285614f04565b509392505050565b600081359050613cca8161595c565b92915050565b600082601f830112613ce557613ce461515c565b5b8135613cf5848260208601613bc7565b91505092915050565b600081359050613d0d81615973565b92915050565b600081359050613d228161598a565b92915050565b600081359050613d37816159a1565b92915050565b600081519050613d4c816159a1565b92915050565b600082601f830112613d6757613d6661515c565b5b8135613d77848260208601613c37565b91505092915050565b600082601f830112613d9557613d9461515c565b5b8135613da5848260208601613c79565b91505092915050565b600081359050613dbd816159b8565b92915050565b600060208284031215613dd957613dd8615170565b5b6000613de784828501613cbb565b91505092915050565b60008060408385031215613e0757613e06615170565b5b6000613e1585828601613cbb565b9250506020613e2685828601613cbb565b9150509250929050565b600080600060608486031215613e4957613e48615170565b5b6000613e5786828701613cbb565b9350506020613e6886828701613cbb565b9250506040613e7986828701613dae565b9150509250925092565b60008060008060808587031215613e9d57613e9c615170565b5b6000613eab87828801613cbb565b9450506020613ebc87828801613cbb565b9350506040613ecd87828801613dae565b925050606085013567ffffffffffffffff811115613eee57613eed61516b565b5b613efa87828801613d52565b91505092959194509250565b60008060408385031215613f1d57613f1c615170565b5b6000613f2b85828601613cbb565b9250506020613f3c85828601613cfe565b9150509250929050565b60008060408385031215613f5d57613f5c615170565b5b6000613f6b85828601613cbb565b9250506020613f7c85828601613dae565b9150509250929050565b600060208284031215613f9c57613f9b615170565b5b6000613faa84828501613d28565b91505092915050565b600060208284031215613fc957613fc8615170565b5b6000613fd784828501613d3d565b91505092915050565b600060208284031215613ff657613ff5615170565b5b600082013567ffffffffffffffff8111156140145761401361516b565b5b61402084828501613d80565b91505092915050565b60006020828403121561403f5761403e615170565b5b600061404d84828501613dae565b91505092915050565b6000806040838503121561406d5761406c615170565b5b600061407b85828601613dae565b925050602061408c85828601613cbb565b9150509250929050565b600080604083850312156140ad576140ac615170565b5b60006140bb85828601613dae565b925050602083013567ffffffffffffffff8111156140dc576140db61516b565b5b6140e885828601613cd0565b9150509250929050565b60008060006060848603121561410b5761410a615170565b5b600061411986828701613dae565b935050602061412a86828701613dae565b925050604061413b86828701613cbb565b9150509250925092565b61414e81614e34565b82525050565b61416561416082614e34565b61501c565b82525050565b61417481614e46565b82525050565b61418381614e52565b82525050565b600061419482614c57565b61419e8185614c6d565b93506141ae818560208601614f13565b6141b781615175565b840191505092915050565b6141cb81614ece565b82525050565b60006141dc82614c62565b6141e68185614c89565b93506141f6818560208601614f13565b6141ff81615175565b840191505092915050565b600061421582614c62565b61421f8185614c9a565b935061422f818560208601614f13565b80840191505092915050565b6000614248602283614c89565b915061425382615193565b604082019050919050565b600061426b602683614c89565b9150614276826151e2565b604082019050919050565b600061428e602a83614c89565b915061429982615231565b604082019050919050565b60006142b1600e83614c89565b91506142bc82615280565b602082019050919050565b60006142d4602383614c89565b91506142df826152a9565b604082019050919050565b60006142f7602583614c89565b9150614302826152f8565b604082019050919050565b600061431a603183614c89565b915061432582615347565b604082019050919050565b600061433d601083614c89565b915061434882615396565b602082019050919050565b6000614360602183614c89565b915061436b826153bf565b604082019050919050565b6000614383603983614c89565b915061438e8261540e565b604082019050919050565b60006143a6601c83614c89565b91506143b18261545d565b602082019050919050565b60006143c9602b83614c89565b91506143d482615486565b604082019050919050565b60006143ec602683614c89565b91506143f7826154d5565b604082019050919050565b600061440f600583614c9a565b915061441a82615524565b600582019050919050565b6000614432602083614c89565b915061443d8261554d565b602082019050919050565b6000614455602f83614c89565b915061446082615576565b604082019050919050565b6000614478601a83614c89565b9150614483826155c5565b602082019050919050565b600061449b603283614c89565b91506144a6826155ee565b604082019050919050565b60006144be601983614c89565b91506144c98261563d565b602082019050919050565b60006144e1601783614c89565b91506144ec82615666565b602082019050919050565b6000614504602283614c89565b915061450f8261568f565b604082019050919050565b6000614527600083614c7e565b9150614532826156de565b600082019050919050565b600061454a602883614c89565b9150614555826156e1565b604082019050919050565b600061456d603383614c89565b915061457882615730565b604082019050919050565b6000614590601d83614c89565b915061459b8261577f565b602082019050919050565b60006145b3602183614c89565b91506145be826157a8565b604082019050919050565b60006145d6602e83614c89565b91506145e1826157f7565b604082019050919050565b60006145f9602f83614c89565b915061460482615846565b604082019050919050565b600061461c601a83614c89565b915061462782615895565b602082019050919050565b600061463f602d83614c89565b915061464a826158be565b604082019050919050565b6000614662602283614c89565b915061466d8261590d565b604082019050919050565b61468181614ec4565b82525050565b60006146938284614154565b60148201915081905092915050565b60006146ae828561420a565b91506146ba828461420a565b91506146c582614402565b91508190509392505050565b60006146dc8261451a565b9150819050919050565b60006020820190506146fb6000830184614145565b92915050565b60006040820190506147166000830185614145565b6147236020830184614145565b9392505050565b600060808201905061473f6000830187614145565b61474c6020830186614145565b6147596040830185614678565b818103606083015261476b8184614189565b905095945050505050565b600060208201905061478b600083018461416b565b92915050565b60006020820190506147a6600083018461417a565b92915050565b60006020820190506147c160008301846141c2565b92915050565b600060208201905081810360008301526147e181846141d1565b905092915050565b600060208201905081810360008301526148028161423b565b9050919050565b600060208201905081810360008301526148228161425e565b9050919050565b6000602082019050818103600083015261484281614281565b9050919050565b60006020820190508181036000830152614862816142a4565b9050919050565b60006020820190508181036000830152614882816142c7565b9050919050565b600060208201905081810360008301526148a2816142ea565b9050919050565b600060208201905081810360008301526148c28161430d565b9050919050565b600060208201905081810360008301526148e281614330565b9050919050565b6000602082019050818103600083015261490281614353565b9050919050565b6000602082019050818103600083015261492281614376565b9050919050565b6000602082019050818103600083015261494281614399565b9050919050565b60006020820190508181036000830152614962816143bc565b9050919050565b60006020820190508181036000830152614982816143df565b9050919050565b600060208201905081810360008301526149a281614425565b9050919050565b600060208201905081810360008301526149c281614448565b9050919050565b600060208201905081810360008301526149e28161446b565b9050919050565b60006020820190508181036000830152614a028161448e565b9050919050565b60006020820190508181036000830152614a22816144b1565b9050919050565b60006020820190508181036000830152614a42816144d4565b9050919050565b60006020820190508181036000830152614a62816144f7565b9050919050565b60006020820190508181036000830152614a828161453d565b9050919050565b60006020820190508181036000830152614aa281614560565b9050919050565b60006020820190508181036000830152614ac281614583565b9050919050565b60006020820190508181036000830152614ae2816145a6565b9050919050565b60006020820190508181036000830152614b02816145c9565b9050919050565b60006020820190508181036000830152614b22816145ec565b9050919050565b60006020820190508181036000830152614b428161460f565b9050919050565b60006020820190508181036000830152614b6281614632565b9050919050565b60006020820190508181036000830152614b8281614655565b9050919050565b6000602082019050614b9e6000830184614678565b92915050565b6000614bae614bbf565b9050614bba8282614fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115614be457614be361512d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c1057614c0f61512d565b5b614c1982615175565b9050602081019050919050565b600067ffffffffffffffff821115614c4157614c4061512d565b5b614c4a82615175565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cb082614e88565b9150614cbb83614e88565b9250826fffffffffffffffffffffffffffffffff03821115614ce057614cdf615071565b5b828201905092915050565b6000614cf682614ec4565b9150614d0183614ec4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3657614d35615071565b5b828201905092915050565b6000614d4c82614ec4565b9150614d5783614ec4565b925082614d6757614d666150a0565b5b828204905092915050565b6000614d7d82614ec4565b9150614d8883614ec4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dc157614dc0615071565b5b828202905092915050565b6000614dd782614e88565b9150614de283614e88565b925082821015614df557614df4615071565b5b828203905092915050565b6000614e0b82614ec4565b9150614e1683614ec4565b925082821015614e2957614e28615071565b5b828203905092915050565b6000614e3f82614ea4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614ed982614ee0565b9050919050565b6000614eeb82614ef2565b9050919050565b6000614efd82614ea4565b9050919050565b82818337600083830152505050565b60005b83811015614f31578082015181840152602081019050614f16565b83811115614f40576000848401525b50505050565b6000614f5182614ec4565b91506000821415614f6557614f64615071565b5b600182039050919050565b60006002820490506001821680614f8857607f821691505b60208210811415614f9c57614f9b6150cf565b5b50919050565b614fab82615175565b810181811067ffffffffffffffff82111715614fca57614fc961512d565b5b80604052505050565b6000614fde82614ec4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561501157615010615071565b5b600182019050919050565b60006150278261502e565b9050919050565b600061503982615186565b9050919050565b600061504b82614ec4565b915061505683614ec4565b925082615066576150656150a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4e6f7420456e6f75676820455448000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5072652d53616c65206973206f76657200000000000000000000000000000000600082015250565b7f455243373231413a20636f6c6c656374696f6e2073697a65206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4e6f7420456e6f756768204d696e7461626c6520546f6b656e00000000000000600082015250565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f546865207175616e746974792063616e6e6f742062652061206e65676174697660008201527f65206e756d626572000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61596581614e34565b811461597057600080fd5b50565b61597c81614e46565b811461598757600080fd5b50565b61599381614e52565b811461599e57600080fd5b50565b6159aa81614e5c565b81146159b557600080fd5b50565b6159c181614ec4565b81146159cc57600080fd5b5056fea2646970667358221220ed12fa8e3d6bbdbbbd40429669643bd57e809c01024b21a650ca0f860b54b17464736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5337335350467a727662375559333879366a4a44596a474c773979537142584e53455864363169584857616f2f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80636352211e1161012e578063b88d4fde116100ab578063d7224ba01161006f578063d7224ba014610821578063e13e0da51461084c578063e3e1e8ef14610877578063e985e9c514610893578063f2fde38b146108d05761023b565b8063b88d4fde14610750578063c869086514610779578063c87b56dd146107a4578063d3dd5fe0146107e1578063d52c57e0146107f85761023b565b80638da5cb5b116100f25780638da5cb5b1461066957806395d89b4114610694578063a22cb465146106bf578063a6128e63146106e8578063b640392c146107255761023b565b80636352211e14610582578063645a994c146105bf57806370a08231146105ea578063715018a61461062757806376d5de851461063e5761023b565b80632976538e116101bc5780633d18b912116101805780633d18b912146104b157806342842e0e146104c85780634f6ccce7146104f157806355f804b31461052e5780635f0bbdba146105575761023b565b80632976538e1461040c5780632be09561146104375780632db115441461044e5780632f745c591461046a5780633ccfd60b146104a75761023b565b806319981dd11161020357806319981dd1146103395780631b5294ef1461036457806322f4596f1461038f57806323b872dd146103ba57806323ffce85146103e35761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613f86565b6108f9565b6040516102749190614776565b60405180910390f35b34801561028957600080fd5b50610292610a43565b60405161029f91906147c7565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190614029565b610ad5565b6040516102dc91906146e6565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613f46565b610b5a565b005b34801561031a57600080fd5b50610323610c73565b6040516103309190614b89565b60405180910390f35b34801561034557600080fd5b5061034e610c7c565b60405161035b9190614776565b60405180910390f35b34801561037057600080fd5b50610379610c8f565b6040516103869190614b89565b60405180910390f35b34801561039b57600080fd5b506103a4610c94565b6040516103b19190614b89565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613e30565b610c9a565b005b3480156103ef57600080fd5b5061040a60048036038101906104059190613dc3565b610d39565b005b34801561041857600080fd5b50610421610df9565b60405161042e9190614b89565b60405180910390f35b34801561044357600080fd5b5061044c610e04565b005b61046860048036038101906104639190614029565b610eb1565b005b34801561047657600080fd5b50610491600480360381019061048c9190613f46565b6110f2565b60405161049e9190614b89565b60405180910390f35b6104af6112f0565b005b3480156104bd57600080fd5b506104c661163f565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613e30565b61175e565b005b3480156104fd57600080fd5b5061051860048036038101906105139190614029565b61177e565b6040516105259190614b89565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190613fe0565b6117d1565b005b34801561056357600080fd5b5061056c611867565b6040516105799190614b89565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a49190614029565b61186d565b6040516105b691906146e6565b60405180910390f35b3480156105cb57600080fd5b506105d4611883565b6040516105e19190614b89565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190613dc3565b611888565b60405161061e9190614b89565b60405180910390f35b34801561063357600080fd5b5061063c611971565b005b34801561064a57600080fd5b506106536119f9565b60405161066091906147ac565b60405180910390f35b34801561067557600080fd5b5061067e611a1f565b60405161068b91906146e6565b60405180910390f35b3480156106a057600080fd5b506106a9611a49565b6040516106b691906147c7565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190613f06565b611adb565b005b3480156106f457600080fd5b5061070f600480360381019061070a91906140f2565b611c5c565b60405161071c9190614b89565b60405180910390f35b34801561073157600080fd5b5061073a611d98565b6040516107479190614b89565b60405180910390f35b34801561075c57600080fd5b5061077760048036038101906107729190613e83565b611d9e565b005b34801561078557600080fd5b5061078e611e3f565b60405161079b9190614791565b60405180910390f35b3480156107b057600080fd5b506107cb60048036038101906107c69190614029565b611e63565b6040516107d891906147c7565b60405180910390f35b3480156107ed57600080fd5b506107f6611eeb565b005b34801561080457600080fd5b5061081f600480360381019061081a9190614056565b611f93565b005b34801561082d57600080fd5b5061083661206e565b6040516108439190614b89565b60405180910390f35b34801561085857600080fd5b50610861612074565b60405161086e9190614b89565b60405180910390f35b610891600480360381019061088c9190614096565b61207f565b005b34801561089f57600080fd5b506108ba60048036038101906108b59190613df0565b612355565b6040516108c79190614776565b60405180910390f35b3480156108dc57600080fd5b506108f760048036038101906108f29190613dc3565b6123e9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a3c5750610a3b826124e1565b5b9050919050565b606060018054610a5290614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7e90614f70565b8015610acb5780601f10610aa057610100808354040283529160200191610acb565b820191906000526020600020905b815481529060010190602001808311610aae57829003601f168201915b5050505050905090565b6000610ae08261254b565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690614b49565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b658261186d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90614a49565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bf5612558565b73ffffffffffffffffffffffffffffffffffffffff161480610c245750610c2381610c1e612558565b612355565b5b610c63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5a90614909565b60405180910390fd5b610c6e838383612560565b505050565b60008054905090565b600b60009054906101000a900460ff1681565b600381565b610d0581565b610ca5838383612612565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a84846040518363ffffffff1660e01b8152600401610d02929190614701565b600060405180830381600087803b158015610d1c57600080fd5b505af1158015610d30573d6000803e3d6000fd5b50505050505050565b610d41612558565b73ffffffffffffffffffffffffffffffffffffffff16610d5f611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614989565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b668e1bc9bf04000081565b610e0c612558565b73ffffffffffffffffffffffffffffffffffffffff16610e2a611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7790614989565b60405180910390fd5b6001600b60006101000a81548160ff02191690831515021790555061384042610ea99190614ceb565b600c81905550565b600b60009054906101000a900460ff16610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef790614a29565b60405180910390fd5b60008111610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90614a69565b60405180910390fd5b6000600582610f5133612622565b610f5b9190614ceb565b1115610f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9390614929565b60405180910390fd5b8166d529ae9e860000610faf9190614d72565b905080341015610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90614849565b60405180910390fd5b600082610fff610c73565b610cfb61100c9190614e00565b6110169190614e00565b1015611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90614a09565b60405180910390fd5b611061338361270b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7985a8336040518263ffffffff1660e01b81526004016110bc91906146e6565b600060405180830381600087803b1580156110d657600080fd5b505af11580156110ea573d6000803e3d6000fd5b505050505050565b60006110fd83611888565b821061113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906147e9565b60405180910390fd5b6000611148610c73565b905060008060005b838110156112ae576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461124257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561129a578684141561128b5781955050505050506112ea565b838061129690614fd3565b9450505b5080806112a690614fd3565b915050611150565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e190614ae9565b60405180910390fd5b92915050565b6112f8612558565b73ffffffffffffffffffffffffffffffffffffffff16611316611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461136c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136390614989565b60405180910390fd5b60004790506113a873321011e9bcdf93f57174f9afd28083701ee276346103e860c8846113999190614d72565b6113a39190614d41565b612729565b6113df73fb1b6058e73e8ee71a5e2cf5d7a370b16e11d13f6103e860c8846113d09190614d72565b6113da9190614d41565b612729565b61141673f9080ac7188724d898665fd61a25cad56c62f9d36103e86064846114079190614d72565b6114119190614d41565b612729565b61144d737f69789732d31af98b2766dbdf23a69612d2b5c56103e860648461143e9190614d72565b6114489190614d41565b612729565b611484731b207d0a58892bdce713bd90d0af63ef8c2435aa6103e86064846114759190614d72565b61147f9190614d41565b612729565b6114bb732d3cca8356ad7bb654499b1ba8ba4e26346d3edf6103e86064846114ac9190614d72565b6114b69190614d41565b612729565b6114f273b83ce0cf4f53f82d22c98c6378e7fe337d01b1b96103e86023846114e39190614d72565b6114ed9190614d41565b612729565b6115297329b7aaa30a47f779bff900551a1aea76b983ad756103e860238461151a9190614d72565b6115249190614d41565b612729565b61156073433aa2913efc08042899ab9b6fcfc7b7e901fa8a6103e86032846115519190614d72565b61155b9190614d41565b612729565b61159773cf06446c0372bf1bb771d0e9ad9c16fd0d3cdd7b6103e8601e846115889190614d72565b6115929190614d41565b612729565b6115ce7355c1d22188a6b195b30e354e59d16fe35e853f336103e86014846115bf9190614d72565b6115c99190614d41565b612729565b61160573f37ed805aa7bcf1c98d91b75d0c4daa89773c5606103e86014846115f69190614d72565b6116009190614d41565b612729565b61163c73fc5127d20e8775eeef3db7f34340d01b635a05256103e8600a8461162d9190614d72565b6116379190614d41565b612729565b50565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a3360006040518363ffffffff1660e01b815260040161169d929190614701565b600060405180830381600087803b1580156116b757600080fd5b505af11580156116cb573d6000803e3d6000fd5b50505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c00007b0336040518263ffffffff1660e01b815260040161172a91906146e6565b600060405180830381600087803b15801561174457600080fd5b505af1158015611758573d6000803e3d6000fd5b50505050565b61177983838360405180602001604052806000815250611d9e565b505050565b6000611788610c73565b82106117c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c090614869565b60405180910390fd5b819050919050565b6117d9612558565b73ffffffffffffffffffffffffffffffffffffffff166117f7611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461184d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184490614989565b60405180910390fd5b80600a9080519060200190611863929190613aea565b5050565b600c5481565b600061187882612820565b600001519050919050565b600581565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f090614949565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611979612558565b73ffffffffffffffffffffffffffffffffffffffff16611997611a1f565b73ffffffffffffffffffffffffffffffffffffffff16146119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e490614989565b60405180910390fd5b6119f76000612a23565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611a5890614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8490614f70565b8015611ad15780601f10611aa657610100808354040283529160200191611ad1565b820191906000526020600020905b815481529060010190602001808311611ab457829003601f168201915b5050505050905090565b611ae3612558565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b48906149c9565b60405180910390fd5b8060066000611b5e612558565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0b612558565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c509190614776565b60405180910390a35050565b600080611c6883612622565b905060008511611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca490614b29565b60405180910390fd5b84816005611cbb9190614e00565b1015611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614929565b60405180910390fd5b6001816003611d0b9190614e00565b1015611d2b5766d529ae9e86000085611d249190614d72565b9150611d90565b6000816003611d3a9190614e00565b905080861115611d7f5766d529ae9e8600008187611d589190614e00565b611d629190614d72565b8582611d6e9190614d72565b611d789190614ceb565b9250611d8e565b8486611d8b9190614d72565b92505b505b509392505050565b610cfb81565b611daa84848484612ae9565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d230af3a85856040518363ffffffff1660e01b8152600401611e07929190614701565b600060405180830381600087803b158015611e2157600080fd5b505af1158015611e35573d6000803e3d6000fd5b5050505050505050565b7f312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b81565b6060611e6e8261254b565b611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea4906149a9565b60405180910390fd5b6000611eb7612b45565b905080611ec384612bd7565b604051602001611ed49291906146a2565b604051602081830303815290604052915050919050565b611ef3612558565b73ffffffffffffffffffffffffffffffffffffffff16611f11611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90614989565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b611f9b612558565b73ffffffffffffffffffffffffffffffffffffffff16611fb9611a1f565b73ffffffffffffffffffffffffffffffffffffffff161461200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614989565b60405180910390fd5b600060058361201e9190615040565b905060005b6005846120309190614d41565b8110156120555761204283600561270b565b808061204d90614fd3565b915050612023565b506000811461206957612068828261270b565b5b505050565b60075481565b66d529ae9e86000081565b600b60009054906101000a900460ff166120ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c590614a29565b60405180910390fd5b60008211612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890614a69565b60405180910390fd5b600061211c33612622565b90506000600190506000600c5442111561213557600091505b818015612169575061216833857f312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b612d38565b5b156121875761218085668e1bc9bf04000033611c5c565b90506121c2565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b9906148c9565b60405180910390fd5b600585846121d09190614ceb565b1115612211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220890614929565b60405180910390fd5b80341015612254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224b90614849565b60405180910390fd5b60008561225f610c73565b610cfb61226c9190614e00565b6122769190614e00565b10156122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae90614a09565b60405180910390fd5b6122c1338661270b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f7985a8336040518263ffffffff1660e01b815260040161231c91906146e6565b600060405180830381600087803b15801561233657600080fd5b505af115801561234a573d6000803e3d6000fd5b505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123f1612558565b73ffffffffffffffffffffffffffffffffffffffff1661240f611a1f565b73ffffffffffffffffffffffffffffffffffffffff1614612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245c90614989565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cc90614809565b60405180910390fd5b6124de81612a23565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61261d838383612d74565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268a906148a9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61272582826040518060200160405280600081525061332d565b5050565b612731612558565b73ffffffffffffffffffffffffffffffffffffffff1661274f611a1f565b73ffffffffffffffffffffffffffffffffffffffff16146127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c90614989565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516127cb906146d1565b60006040518083038185875af1925050503d8060008114612808576040519150601f19603f3d011682016040523d82523d6000602084013e61280d565b606091505b505090508061281b57600080fd5b505050565b612828613b70565b6128318261254b565b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614829565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000583106128d45760017f0000000000000000000000000000000000000000000000000000000000000005846128c79190614e00565b6128d19190614ceb565b90505b60008390505b8181106129e2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146129ce57809350505050612a1e565b5080806129da90614f46565b9150506128da565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1590614b09565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612af4848484612d74565b612b0084848484613881565b612b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3690614a89565b60405180910390fd5b50505050565b6060600a8054612b5490614f70565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8090614f70565b8015612bcd5780601f10612ba257610100808354040283529160200191612bcd565b820191906000526020600020905b815481529060010190602001808311612bb057829003601f168201915b5050505050905090565b60606000821415612c1f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d33565b600082905060005b60008214612c51578080612c3a90614fd3565b915050600a82612c4a9190614d41565b9150612c27565b60008167ffffffffffffffff811115612c6d57612c6c61512d565b5b6040519080825280601f01601f191660200182016040528015612c9f5781602001600182028036833780820191505090505b5090505b60008514612d2c57600182612cb89190614e00565b9150600a85612cc79190615040565b6030612cd39190614ceb565b60f81b818381518110612ce957612ce86150fe565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d259190614d41565b9450612ca3565b8093505050505b919050565b6000612d6b838386604051602001612d509190614687565b60405160208183030381529060405280519060200120613a18565b90509392505050565b6000612d7f82612820565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612da6612558565b73ffffffffffffffffffffffffffffffffffffffff161480612e025750612dcb612558565b73ffffffffffffffffffffffffffffffffffffffff16612dea84610ad5565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e1e5750612e1d8260000151612e18612558565b612355565b5b905080612e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e57906149e9565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec990614969565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3990614889565b60405180910390fd5b612f4f8585856001613a2f565b612f5f6000848460000151612560565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612fcd9190614dcc565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166130719190614ca5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846131779190614ceb565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156132bd576131ed8161254b565b156132bc576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133258686866001613a35565b505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339a90614ac9565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000d05836133cd610c73565b6133d79190614ceb565b1115613418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340f906148e9565b60405180910390fd5b6134218161254b565b15613461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345890614aa9565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000058311156134c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134bb90614b69565b60405180910390fd5b6134d16000858386613a2f565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135ce9190614ca5565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135f59190614ca5565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561386457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138046000888488613881565b613843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383a90614a89565b60405180910390fd5b818061384e90614fd3565b925050808061385c90614fd3565b915050613793565b50806000819055506138796000878588613a35565b505050505050565b60006138a28473ffffffffffffffffffffffffffffffffffffffff16613a3b565b15613a0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138cb612558565b8786866040518563ffffffff1660e01b81526004016138ed949392919061472a565b602060405180830381600087803b15801561390757600080fd5b505af192505050801561393857506040513d601f19601f820116820180604052508101906139359190613fb3565b60015b6139bb573d8060008114613968576040519150601f19603f3d011682016040523d82523d6000602084013e61396d565b606091505b506000815114156139b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139aa90614a89565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a10565b600190505b949350505050565b600082613a258584613a5e565b1490509392505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008082905060005b8451811015613ac8576000858281518110613a8557613a846150fe565b5b60200260200101519050808311613aa757613aa08382613ad3565b9250613ab4565b613ab18184613ad3565b92505b508080613ac090614fd3565b915050613a67565b508091505092915050565b600082600052816020526040600020905092915050565b828054613af690614f70565b90600052602060002090601f016020900481019282613b185760008555613b5f565b82601f10613b3157805160ff1916838001178555613b5f565b82800160010185558215613b5f579182015b82811115613b5e578251825591602001919060010190613b43565b5b509050613b6c9190613baa565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613bc3576000816000905550600101613bab565b5090565b6000613bda613bd584614bc9565b614ba4565b90508083825260208201905082856020860282011115613bfd57613bfc615161565b5b60005b85811015613c2d5781613c138882613d13565b845260208401935060208301925050600181019050613c00565b5050509392505050565b6000613c4a613c4584614bf5565b614ba4565b905082815260208101848484011115613c6657613c65615166565b5b613c71848285614f04565b509392505050565b6000613c8c613c8784614c26565b614ba4565b905082815260208101848484011115613ca857613ca7615166565b5b613cb3848285614f04565b509392505050565b600081359050613cca8161595c565b92915050565b600082601f830112613ce557613ce461515c565b5b8135613cf5848260208601613bc7565b91505092915050565b600081359050613d0d81615973565b92915050565b600081359050613d228161598a565b92915050565b600081359050613d37816159a1565b92915050565b600081519050613d4c816159a1565b92915050565b600082601f830112613d6757613d6661515c565b5b8135613d77848260208601613c37565b91505092915050565b600082601f830112613d9557613d9461515c565b5b8135613da5848260208601613c79565b91505092915050565b600081359050613dbd816159b8565b92915050565b600060208284031215613dd957613dd8615170565b5b6000613de784828501613cbb565b91505092915050565b60008060408385031215613e0757613e06615170565b5b6000613e1585828601613cbb565b9250506020613e2685828601613cbb565b9150509250929050565b600080600060608486031215613e4957613e48615170565b5b6000613e5786828701613cbb565b9350506020613e6886828701613cbb565b9250506040613e7986828701613dae565b9150509250925092565b60008060008060808587031215613e9d57613e9c615170565b5b6000613eab87828801613cbb565b9450506020613ebc87828801613cbb565b9350506040613ecd87828801613dae565b925050606085013567ffffffffffffffff811115613eee57613eed61516b565b5b613efa87828801613d52565b91505092959194509250565b60008060408385031215613f1d57613f1c615170565b5b6000613f2b85828601613cbb565b9250506020613f3c85828601613cfe565b9150509250929050565b60008060408385031215613f5d57613f5c615170565b5b6000613f6b85828601613cbb565b9250506020613f7c85828601613dae565b9150509250929050565b600060208284031215613f9c57613f9b615170565b5b6000613faa84828501613d28565b91505092915050565b600060208284031215613fc957613fc8615170565b5b6000613fd784828501613d3d565b91505092915050565b600060208284031215613ff657613ff5615170565b5b600082013567ffffffffffffffff8111156140145761401361516b565b5b61402084828501613d80565b91505092915050565b60006020828403121561403f5761403e615170565b5b600061404d84828501613dae565b91505092915050565b6000806040838503121561406d5761406c615170565b5b600061407b85828601613dae565b925050602061408c85828601613cbb565b9150509250929050565b600080604083850312156140ad576140ac615170565b5b60006140bb85828601613dae565b925050602083013567ffffffffffffffff8111156140dc576140db61516b565b5b6140e885828601613cd0565b9150509250929050565b60008060006060848603121561410b5761410a615170565b5b600061411986828701613dae565b935050602061412a86828701613dae565b925050604061413b86828701613cbb565b9150509250925092565b61414e81614e34565b82525050565b61416561416082614e34565b61501c565b82525050565b61417481614e46565b82525050565b61418381614e52565b82525050565b600061419482614c57565b61419e8185614c6d565b93506141ae818560208601614f13565b6141b781615175565b840191505092915050565b6141cb81614ece565b82525050565b60006141dc82614c62565b6141e68185614c89565b93506141f6818560208601614f13565b6141ff81615175565b840191505092915050565b600061421582614c62565b61421f8185614c9a565b935061422f818560208601614f13565b80840191505092915050565b6000614248602283614c89565b915061425382615193565b604082019050919050565b600061426b602683614c89565b9150614276826151e2565b604082019050919050565b600061428e602a83614c89565b915061429982615231565b604082019050919050565b60006142b1600e83614c89565b91506142bc82615280565b602082019050919050565b60006142d4602383614c89565b91506142df826152a9565b604082019050919050565b60006142f7602583614c89565b9150614302826152f8565b604082019050919050565b600061431a603183614c89565b915061432582615347565b604082019050919050565b600061433d601083614c89565b915061434882615396565b602082019050919050565b6000614360602183614c89565b915061436b826153bf565b604082019050919050565b6000614383603983614c89565b915061438e8261540e565b604082019050919050565b60006143a6601c83614c89565b91506143b18261545d565b602082019050919050565b60006143c9602b83614c89565b91506143d482615486565b604082019050919050565b60006143ec602683614c89565b91506143f7826154d5565b604082019050919050565b600061440f600583614c9a565b915061441a82615524565b600582019050919050565b6000614432602083614c89565b915061443d8261554d565b602082019050919050565b6000614455602f83614c89565b915061446082615576565b604082019050919050565b6000614478601a83614c89565b9150614483826155c5565b602082019050919050565b600061449b603283614c89565b91506144a6826155ee565b604082019050919050565b60006144be601983614c89565b91506144c98261563d565b602082019050919050565b60006144e1601783614c89565b91506144ec82615666565b602082019050919050565b6000614504602283614c89565b915061450f8261568f565b604082019050919050565b6000614527600083614c7e565b9150614532826156de565b600082019050919050565b600061454a602883614c89565b9150614555826156e1565b604082019050919050565b600061456d603383614c89565b915061457882615730565b604082019050919050565b6000614590601d83614c89565b915061459b8261577f565b602082019050919050565b60006145b3602183614c89565b91506145be826157a8565b604082019050919050565b60006145d6602e83614c89565b91506145e1826157f7565b604082019050919050565b60006145f9602f83614c89565b915061460482615846565b604082019050919050565b600061461c601a83614c89565b915061462782615895565b602082019050919050565b600061463f602d83614c89565b915061464a826158be565b604082019050919050565b6000614662602283614c89565b915061466d8261590d565b604082019050919050565b61468181614ec4565b82525050565b60006146938284614154565b60148201915081905092915050565b60006146ae828561420a565b91506146ba828461420a565b91506146c582614402565b91508190509392505050565b60006146dc8261451a565b9150819050919050565b60006020820190506146fb6000830184614145565b92915050565b60006040820190506147166000830185614145565b6147236020830184614145565b9392505050565b600060808201905061473f6000830187614145565b61474c6020830186614145565b6147596040830185614678565b818103606083015261476b8184614189565b905095945050505050565b600060208201905061478b600083018461416b565b92915050565b60006020820190506147a6600083018461417a565b92915050565b60006020820190506147c160008301846141c2565b92915050565b600060208201905081810360008301526147e181846141d1565b905092915050565b600060208201905081810360008301526148028161423b565b9050919050565b600060208201905081810360008301526148228161425e565b9050919050565b6000602082019050818103600083015261484281614281565b9050919050565b60006020820190508181036000830152614862816142a4565b9050919050565b60006020820190508181036000830152614882816142c7565b9050919050565b600060208201905081810360008301526148a2816142ea565b9050919050565b600060208201905081810360008301526148c28161430d565b9050919050565b600060208201905081810360008301526148e281614330565b9050919050565b6000602082019050818103600083015261490281614353565b9050919050565b6000602082019050818103600083015261492281614376565b9050919050565b6000602082019050818103600083015261494281614399565b9050919050565b60006020820190508181036000830152614962816143bc565b9050919050565b60006020820190508181036000830152614982816143df565b9050919050565b600060208201905081810360008301526149a281614425565b9050919050565b600060208201905081810360008301526149c281614448565b9050919050565b600060208201905081810360008301526149e28161446b565b9050919050565b60006020820190508181036000830152614a028161448e565b9050919050565b60006020820190508181036000830152614a22816144b1565b9050919050565b60006020820190508181036000830152614a42816144d4565b9050919050565b60006020820190508181036000830152614a62816144f7565b9050919050565b60006020820190508181036000830152614a828161453d565b9050919050565b60006020820190508181036000830152614aa281614560565b9050919050565b60006020820190508181036000830152614ac281614583565b9050919050565b60006020820190508181036000830152614ae2816145a6565b9050919050565b60006020820190508181036000830152614b02816145c9565b9050919050565b60006020820190508181036000830152614b22816145ec565b9050919050565b60006020820190508181036000830152614b428161460f565b9050919050565b60006020820190508181036000830152614b6281614632565b9050919050565b60006020820190508181036000830152614b8281614655565b9050919050565b6000602082019050614b9e6000830184614678565b92915050565b6000614bae614bbf565b9050614bba8282614fa2565b919050565b6000604051905090565b600067ffffffffffffffff821115614be457614be361512d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c1057614c0f61512d565b5b614c1982615175565b9050602081019050919050565b600067ffffffffffffffff821115614c4157614c4061512d565b5b614c4a82615175565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cb082614e88565b9150614cbb83614e88565b9250826fffffffffffffffffffffffffffffffff03821115614ce057614cdf615071565b5b828201905092915050565b6000614cf682614ec4565b9150614d0183614ec4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3657614d35615071565b5b828201905092915050565b6000614d4c82614ec4565b9150614d5783614ec4565b925082614d6757614d666150a0565b5b828204905092915050565b6000614d7d82614ec4565b9150614d8883614ec4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dc157614dc0615071565b5b828202905092915050565b6000614dd782614e88565b9150614de283614e88565b925082821015614df557614df4615071565b5b828203905092915050565b6000614e0b82614ec4565b9150614e1683614ec4565b925082821015614e2957614e28615071565b5b828203905092915050565b6000614e3f82614ea4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614ed982614ee0565b9050919050565b6000614eeb82614ef2565b9050919050565b6000614efd82614ea4565b9050919050565b82818337600083830152505050565b60005b83811015614f31578082015181840152602081019050614f16565b83811115614f40576000848401525b50505050565b6000614f5182614ec4565b91506000821415614f6557614f64615071565b5b600182039050919050565b60006002820490506001821680614f8857607f821691505b60208210811415614f9c57614f9b6150cf565b5b50919050565b614fab82615175565b810181811067ffffffffffffffff82111715614fca57614fc961512d565b5b80604052505050565b6000614fde82614ec4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561501157615010615071565b5b600182019050919050565b60006150278261502e565b9050919050565b600061503982615186565b9050919050565b600061504b82614ec4565b915061505683614ec4565b925082615066576150656150a0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4e6f7420456e6f75676820455448000000000000000000000000000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5072652d53616c65206973206f76657200000000000000000000000000000000600082015250565b7f455243373231413a20636f6c6c656374696f6e2073697a65206578636565646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4d6178696d756d206d696e7420616d6f756e7420657863656564656400000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4e6f7420456e6f756768204d696e7461626c6520546f6b656e00000000000000600082015250565b7f4d696e74696e67206e6f7720616c6c6f77656420796574000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f546865207175616e746974792063616e6e6f742062652061206e65676174697660008201527f65206e756d626572000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420616d6f756e742063616e6e6f74206265207a65726f000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61596581614e34565b811461597057600080fd5b50565b61597c81614e46565b811461598757600080fd5b50565b61599381614e52565b811461599e57600080fd5b50565b6159aa81614e5c565b81146159b557600080fd5b50565b6159c181614ec4565b81146159cc57600080fd5b5056fea2646970667358221220ed12fa8e3d6bbdbbbd40429669643bd57e809c01024b21a650ca0f860b54b17464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d5337335350467a727662375559333879366a4a44596a474c773979537142584e53455864363169584857616f2f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : initialBaseURI (string): https://ipfs.io/ipfs/QmS73SPFzrvb7UY38y6jJDYjGLw9ySqBXNSEXd61iXHWao/
Arg [1] : WLroot (bytes32): 0x312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 312f9cc1a869f4a2a988ef9965cf64a8150126b797127285dbee40947fe43f7b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f516d5337335350467a7276
Arg [4] : 62375559333879366a4a44596a474c773979537142584e534558643631695848
Arg [5] : 57616f2f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
3163:6447:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3963:370:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5689:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7214:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6777:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2524:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3598:23:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3431:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3272:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;500:168:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;258:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3492:44:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7639:130;;;;;;;;;;;;;:::i;:::-;;4085:695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3155:744:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8137:1276:13;;;:::i;:::-;;371:124:15;;;;;;;;;;;;;:::i;:::-;;8277:165:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2687:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7528:103:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3628:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5512:118:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3366:58:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4389:211:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:16;;;;;;;;;;;;;:::i;:::-;;215:37:15;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5844:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7482:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5776:862:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3320:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;673:203:15;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3665:32:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6870:618;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7777:85;;;;;;;;;;;;;:::i;:::-;;7870:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13038:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3543:48:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4788:980;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7819:186:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3963:370:4;4090:4;4135:25;4120:40;;;:11;:40;;;;:99;;;;4186:33;4171:48;;;:11;:48;;;;4120:99;:160;;;;4245:35;4230:50;;;:11;:50;;;;4120:160;:207;;;;4291:36;4315:11;4291:23;:36::i;:::-;4120:207;4106:221;;3963:370;;;:::o;5689:94::-;5743:13;5772:5;5765:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5689:94;:::o;7214:204::-;7282:7;7306:16;7314:7;7306;:16::i;:::-;7298:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7388:15;:24;7404:7;7388:24;;;;;;;;;;;;;;;;;;;;;7381:31;;7214:204;;;:::o;6777:379::-;6846:13;6862:24;6878:7;6862:15;:24::i;:::-;6846:40;;6907:5;6901:11;;:2;:11;;;;6893:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;6992:5;6976:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7001:37;7018:5;7025:12;:10;:12::i;:::-;7001:16;:37::i;:::-;6976:62;6960:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;7122:28;7131:2;7135:7;7144:5;7122:8;:28::i;:::-;6839:317;6777:379;;:::o;2524:94::-;2577:7;2600:12;;2593:19;;2524:94;:::o;3598:23:13:-;;;;;;;;;;;;;:::o;3431:54::-;3484:1;3431:54;:::o;3272:41::-;3309:4;3272:41;:::o;500:168:15:-;586:39;607:4;613:2;617:7;586:20;:39::i;:::-;630:10;;;;;;;;;;;:23;;;654:4;660:2;630:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;500:168;;;:::o;258:108::-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;354:6:15::1;321:10;;:40;;;;;;;;;;;;;;;;;;258:108:::0;:::o;3492:44:13:-;3526:10;3492:44;:::o;7639:130::-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7703:4:13::1;7689:11;;:18;;;;;;;;;;;;;;;;;;7754:7;7736:15;:25;;;;:::i;:::-;7718:15;:43;;;;7639:130::o:0;4085:695::-;4158:11;;;;;;;;;;;4150:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;4229:1;4216:10;:14;4208:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4285:13;3423:1;4365:10;4337:25;4351:10;4337:13;:25::i;:::-;:38;;;;:::i;:::-;:72;;4329:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;4496:10;3581;4482:24;;;;:::i;:::-;4474:32;;4548:5;4535:9;:18;;4527:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;4643:1;4629:10;4612:13;:11;:13::i;:::-;3355:4;4601:24;;;;:::i;:::-;4600:39;;;;:::i;:::-;:44;;4592:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4686:32;4696:10;4707;4686:9;:32::i;:::-;4729:10;;;;;;;;;;;:29;;;4759:10;4729:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4139:641;4085:695;:::o;3155:744:4:-;3264:7;3299:16;3309:5;3299:9;:16::i;:::-;3291:5;:24;3283:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3361:22;3386:13;:11;:13::i;:::-;3361:38;;3406:19;3436:25;3486:9;3481:350;3505:14;3501:1;:18;3481:350;;;3535:31;3569:11;:14;3581:1;3569:14;;;;;;;;;;;3535:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3622:1;3596:28;;:9;:14;;;:28;;;3592:89;;3657:9;:14;;;3637:34;;3592:89;3714:5;3693:26;;:17;:26;;;3689:135;;;3751:5;3736:11;:20;3732:59;;;3778:1;3771:8;;;;;;;;;3732:59;3801:13;;;;;:::i;:::-;;;;3689:135;3526:305;3521:3;;;;;:::i;:::-;;;;3481:350;;;;3837:56;;;;;;;;;;:::i;:::-;;;;;;;;3155:744;;;;;:::o;8137:1276:13:-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8193:15:13::1;8211:21;8193:39;;8243:79;8260:42;8317:4;8312:3;8304:7;:11;;;;:::i;:::-;8303:18;;;;:::i;:::-;8243:16;:79::i;:::-;8333;8350:42;8407:4;8402:3;8394:7;:11;;;;:::i;:::-;8393:18;;;;:::i;:::-;8333:16;:79::i;:::-;8423;8440:42;8497:4;8492:3;8484:7;:11;;;;:::i;:::-;8483:18;;;;:::i;:::-;8423:16;:79::i;:::-;8513;8530:42;8587:4;8582:3;8574:7;:11;;;;:::i;:::-;8573:18;;;;:::i;:::-;8513:16;:79::i;:::-;8603;8620:42;8677:4;8672:3;8664:7;:11;;;;:::i;:::-;8663:18;;;;:::i;:::-;8603:16;:79::i;:::-;8693;8710:42;8767:4;8762:3;8754:7;:11;;;;:::i;:::-;8753:18;;;;:::i;:::-;8693:16;:79::i;:::-;8783:78;8800:42;8856:4;8852:2;8844:7;:10;;;;:::i;:::-;8843:17;;;;:::i;:::-;8783:16;:78::i;:::-;8872;8889:42;8945:4;8941:2;8933:7;:10;;;;:::i;:::-;8932:17;;;;:::i;:::-;8872:16;:78::i;:::-;8961;8978:42;9034:4;9030:2;9022:7;:10;;;;:::i;:::-;9021:17;;;;:::i;:::-;8961:16;:78::i;:::-;9050;9067:42;9123:4;9119:2;9111:7;:10;;;;:::i;:::-;9110:17;;;;:::i;:::-;9050:16;:78::i;:::-;9139;9156:42;9212:4;9208:2;9200:7;:10;;;;:::i;:::-;9199:17;;;;:::i;:::-;9139:16;:78::i;:::-;9228;9245:42;9301:4;9297:2;9289:7;:10;;;;:::i;:::-;9288:17;;;;:::i;:::-;9228:16;:78::i;:::-;9317;9334:42;9390:4;9386:2;9378:7;:10;;;;:::i;:::-;9377:17;;;;:::i;:::-;9317:16;:78::i;:::-;8182:1231;8137:1276::o:0;371:124:15:-;406:10;;;;;;;;;;;:23;;;430:10;450:1;406:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;458:10;;;;;;;;;;;:20;;;479:10;458:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;371:124::o;8277:165:4:-;8397:39;8414:4;8420:2;8424:7;8397:39;;;;;;;;;;;;:16;:39::i;:::-;8277:165;;;:::o;2687:177::-;2754:7;2786:13;:11;:13::i;:::-;2778:5;:21;2770:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2853:5;2846:12;;2687:177;;;:::o;7528:103:13:-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7613:10:13::1;7603:7;:20;;;;;;;;;;;;:::i;:::-;;7528:103:::0;:::o;3628:30::-;;;;:::o;5512:118:4:-;5576:7;5599:20;5611:7;5599:11;:20::i;:::-;:25;;;5592:32;;5512:118;;;:::o;3366:58:13:-;3423:1;3366:58;:::o;4389:211:4:-;4453:7;4494:1;4477:19;;:5;:19;;;;4469:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4566:12;:19;4579:5;4566:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4558:36;;4551:43;;4389:211;;;:::o;1661:101:16:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;215:37:15:-;;;;;;;;;;;;;:::o;1029:85:16:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;5844:98:4:-;5900:13;5929:7;5922:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5844:98;:::o;7482:274::-;7585:12;:10;:12::i;:::-;7573:24;;:8;:24;;;;7565:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7682:8;7637:18;:32;7656:12;:10;:12::i;:::-;7637:32;;;;;;;;;;;;;;;:42;7670:8;7637:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7731:8;7702:48;;7717:12;:10;:12::i;:::-;7702:48;;;7741:8;7702:48;;;;;;:::i;:::-;;;;;;;;7482:274;;:::o;5776:862:13:-;5872:13;5898:19;5920:21;5934:6;5920:13;:21::i;:::-;5898:43;;5973:1;5962:10;:12;5954:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;6073:10;6057:11;3423:1;6024:44;;;;:::i;:::-;6023:60;;6015:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;6178:1;6163:11;3484:1;6134:40;;;;:::i;:::-;6133:46;6129:486;;;3581:10;6216;:22;;;;:::i;:::-;6208:30;;6129:486;;;6275:29;6336:11;3484:1;6307:40;;;;:::i;:::-;6275:72;;6391:21;6380:10;:32;6376:228;;;3581:10;6486:21;6475:10;:32;;;;:::i;:::-;6474:46;;;;:::i;:::-;6463:8;6441:21;:30;;;;:::i;:::-;:79;;;;:::i;:::-;6433:87;;6376:228;;;6580:8;6569:10;:19;;;;:::i;:::-;6561:27;;6376:228;6258:357;6129:486;5887:751;5776:862;;;;;:::o;3320:39::-;3355:4;3320:39;:::o;673:203:15:-;783:50;808:4;814:2;818:7;827:5;783:24;:50::i;:::-;838:10;;;;;;;;;;;:23;;;862:4;868:2;838:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;673:203;;;;:::o;3665:32:13:-;;;:::o;6870:618::-;6988:13;7041:16;7049:7;7041;:16::i;:::-;7019:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;7155:28;7186:10;:8;:10::i;:::-;7155:41;;7317:14;7358:18;:7;:16;:18::i;:::-;7274:159;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7207:245;;;6870:618;;;:::o;7777:85::-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7843:11:13::1;;;;;;;;;;;7842:12;7828:11;;:26;;;;;;;;;;;;;;;;;;7777:85::o:0;7870:255::-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7953:11:13::1;7976:1;7967:8;:10;;;;:::i;:::-;7953:24;;7992:9;7988:83;8017:1;8008:8;:10;;;;:::i;:::-;8006:1;:12;7988:83;;;8038:21;8048:8;8057:1;8038:9;:21::i;:::-;8019:3;;;;;:::i;:::-;;;;7988:83;;;;8091:1;8084:3;:8;8081:36;;8094:23;8104:8;8113:3;8094:9;:23::i;:::-;8081:36;7942:183;7870:255:::0;;:::o;13038:43:4:-;;;;:::o;3543:48:13:-;3581:10;3543:48;:::o;4788:980::-;4885:11;;;;;;;;;;;4877:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;4956:1;4943:10;:14;4935:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5012:19;5034:25;5048:10;5034:13;:25::i;:::-;5012:47;;5070:12;5085:4;5070:19;;5100:13;5151:15;;5133;:33;5130:53;;;5178:5;5168:15;;5130:53;5209:7;:44;;;;;5220:33;5228:10;5239:5;5245:7;5220;:33::i;:::-;5209:44;5206:169;;;5277:45;5292:10;3526;5311;5277:14;:45::i;:::-;5269:53;;5206:169;;;5349:26;;;;;;;;;;:::i;:::-;;;;;;;;5206:169;3423:1;5410:10;5396:11;:24;;;;:::i;:::-;:60;;5388:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5532:5;5519:9;:18;;5511:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;5627:1;5613:10;5596:13;:11;:13::i;:::-;3355:4;5585:24;;;;:::i;:::-;5584:39;;;;:::i;:::-;:44;;5576:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5670:32;5680:10;5691;5670:9;:32::i;:::-;5713:10;;;;;;;;;;;:29;;;5743:10;5713:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4866:902;;;4788:980;;:::o;7819:186:4:-;7941:4;7964:18;:25;7983:5;7964:25;;;;;;;;;;;;;;;:35;7990:8;7964:35;;;;;;;;;;;;;;;;;;;;;;;;;7957:42;;7819:186;;;;:::o;1911:198:16:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9063:105:4:-;9120:4;9150:12;;9140:7;:22;9133:29;;9063:105;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12860:172:4:-;12984:2;12957:15;:24;12973:7;12957:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13018:7;13014:2;12998:28;;13007:5;12998:28;;;;;;;;;;;;12860:172;;;:::o;8064:150::-;8180:28;8190:4;8196:2;8200:7;8180:9;:28::i;:::-;8064:150;;;:::o;4606:240::-;4667:7;4716:1;4699:19;;:5;:19;;;;4683:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;4807:12;:19;4820:5;4807:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;4799:41;;4792:48;;4606:240;;;:::o;9174:98::-;9239:27;9249:2;9253:8;9239:27;;;;;;;;;;;;:9;:27::i;:::-;9174:98;;:::o;9421:186:13:-;1252:12:16;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9504:12:13::1;9522:2;:7;;9551:6;9522:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9503:69;;;9591:7;9583:16;;;::::0;::::1;;9492:115;9421:186:::0;;:::o;4852:606:4:-;4928:21;;:::i;:::-;4969:16;4977:7;4969;:16::i;:::-;4961:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5041:26;5089:12;5078:7;:23;5074:93;;5158:1;5143:12;5133:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5112:47;;5074:93;5180:12;5195:7;5180:22;;5175:212;5212:18;5204:4;:26;5175:212;;5249:31;5283:11;:17;5295:4;5283:17;;;;;;;;;;;5249:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5339:1;5313:28;;:9;:14;;;:28;;;5309:71;;5361:9;5354:16;;;;;;;5309:71;5240:147;5232:6;;;;;:::i;:::-;;;;5175:212;;;;5395:57;;;;;;;;;;:::i;:::-;;;;;;;;4852:606;;;;:::o;2263:187:16:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;8505:319:4:-;8650:28;8660:4;8666:2;8670:7;8650:9;:28::i;:::-;8701:48;8724:4;8730:2;8734:7;8743:5;8701:22;:48::i;:::-;8685:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;8505:319;;;;:::o;3969:108:13:-;4029:13;4062:7;4055:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3969:108;:::o;328:703:17:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;6652:210:13:-;6749:4;6782:72;6801:5;6807:8;6843;6826:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;6816:37;;;;;;6782:18;:72::i;:::-;6775:79;;6652:210;;;;;:::o;11225:1529:4:-;11322:35;11360:20;11372:7;11360:11;:20::i;:::-;11322:58;;11389:22;11431:13;:18;;;11415:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;11484:12;:10;:12::i;:::-;11460:36;;:20;11472:7;11460:11;:20::i;:::-;:36;;;11415:81;:142;;;;11507:50;11524:13;:18;;;11544:12;:10;:12::i;:::-;11507:16;:50::i;:::-;11415:142;11389:169;;11583:17;11567:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;11715:4;11693:26;;:13;:18;;;:26;;;11677:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11804:1;11790:16;;:2;:16;;;;11782:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11857:43;11879:4;11885:2;11889:7;11898:1;11857:21;:43::i;:::-;11957:49;11974:1;11978:7;11987:13;:18;;;11957:8;:49::i;:::-;12045:1;12015:12;:18;12028:4;12015:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12081:1;12053:12;:16;12066:2;12053:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12112:43;;;;;;;;12127:2;12112:43;;;;;;12138:15;12112:43;;;;;12089:11;:20;12101:7;12089:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12383:19;12415:1;12405:7;:11;;;;:::i;:::-;12383:33;;12468:1;12427:43;;:11;:24;12439:11;12427:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;12423:236;;;12485:20;12493:11;12485:7;:20::i;:::-;12481:171;;;12545:97;;;;;;;;12572:13;:18;;;12545:97;;;;;;12603:13;:28;;;12545:97;;;;;12518:11;:24;12530:11;12518:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12481:171;12423:236;12691:7;12687:2;12672:27;;12681:4;12672:27;;;;;;;;;;;;12706:42;12727:4;12733:2;12737:7;12746:1;12706:20;:42::i;:::-;11315:1439;;;11225:1529;;;:::o;9611:1382::-;9716:20;9739:12;;9716:35;;9780:1;9766:16;;:2;:16;;;;9758:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9863:14;9851:8;9835:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;9827:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;10051:21;10059:12;10051:7;:21::i;:::-;10050:22;10042:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10133:12;10121:8;:24;;10113:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10193:61;10223:1;10227:2;10231:12;10245:8;10193:21;:61::i;:::-;10263:30;10296:12;:16;10309:2;10296:16;;;;;;;;;;;;;;;10263:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10338:119;;;;;;;;10388:8;10358:11;:19;;;:39;;;;:::i;:::-;10338:119;;;;;;10441:8;10406:11;:24;;;:44;;;;:::i;:::-;10338:119;;;;;10319:12;:16;10332:2;10319:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10492:43;;;;;;;;10507:2;10492:43;;;;;;10518:15;10492:43;;;;;10464:11;:25;10476:12;10464:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10544:20;10567:12;10544:35;;10593:9;10588:297;10612:8;10608:1;:12;10588:297;;;10666:12;10662:2;10641:38;;10658:1;10641:38;;;;;;;;;;;;10706:59;10737:1;10741:2;10745:12;10759:5;10706:22;:59::i;:::-;10688:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;10855:14;;;;;:::i;:::-;;;;10622:3;;;;;:::i;:::-;;;;10588:297;;;;10908:12;10893;:27;;;;10927:60;10956:1;10960:2;10964:12;10978:8;10927:20;:60::i;:::-;9709:1284;;;9611:1382;;;:::o;14575:690::-;14712:4;14729:15;:2;:13;;;:15::i;:::-;14725:535;;;14784:2;14768:36;;;14805:12;:10;:12::i;:::-;14819:4;14825:7;14834:5;14768:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14755:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15016:1;14999:6;:13;:18;14995:215;;;15032:61;;;;;;;;;;:::i;:::-;;;;;;;;14995:215;15178:6;15172:13;15163:6;15159:2;15155:15;15148:38;14755:464;14900:45;;;14890:55;;;:6;:55;;;;14883:62;;;;;14725:535;15248:4;15241:11;;14575:690;;;;;;;:::o;1154:184:12:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;15727:141:4:-;;;;;:::o;16254:140::-;;;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;1689:662:12:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;2357:218::-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:18:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:327::-;6961:6;7010:2;6998:9;6989:7;6985:23;6981:32;6978:119;;;7016:79;;:::i;:::-;6978:119;7136:1;7161:52;7205:7;7196:6;7185:9;7181:22;7161:52;:::i;:::-;7151:62;;7107:116;6903:327;;;;:::o;7236:349::-;7305:6;7354:2;7342:9;7333:7;7329:23;7325:32;7322:119;;;7360:79;;:::i;:::-;7322:119;7480:1;7505:63;7560:7;7551:6;7540:9;7536:22;7505:63;:::i;:::-;7495:73;;7451:127;7236:349;;;;:::o;7591:509::-;7660:6;7709:2;7697:9;7688:7;7684:23;7680:32;7677:119;;;7715:79;;:::i;:::-;7677:119;7863:1;7852:9;7848:17;7835:31;7893:18;7885:6;7882:30;7879:117;;;7915:79;;:::i;:::-;7879:117;8020:63;8075:7;8066:6;8055:9;8051:22;8020:63;:::i;:::-;8010:73;;7806:287;7591:509;;;;:::o;8106:329::-;8165:6;8214:2;8202:9;8193:7;8189:23;8185:32;8182:119;;;8220:79;;:::i;:::-;8182:119;8340:1;8365:53;8410:7;8401:6;8390:9;8386:22;8365:53;:::i;:::-;8355:63;;8311:117;8106:329;;;;:::o;8441:474::-;8509:6;8517;8566:2;8554:9;8545:7;8541:23;8537:32;8534:119;;;8572:79;;:::i;:::-;8534:119;8692:1;8717:53;8762:7;8753:6;8742:9;8738:22;8717:53;:::i;:::-;8707:63;;8663:117;8819:2;8845:53;8890:7;8881:6;8870:9;8866:22;8845:53;:::i;:::-;8835:63;;8790:118;8441:474;;;;;:::o;8921:684::-;9014:6;9022;9071:2;9059:9;9050:7;9046:23;9042:32;9039:119;;;9077:79;;:::i;:::-;9039:119;9197:1;9222:53;9267:7;9258:6;9247:9;9243:22;9222:53;:::i;:::-;9212:63;;9168:117;9352:2;9341:9;9337:18;9324:32;9383:18;9375:6;9372:30;9369:117;;;9405:79;;:::i;:::-;9369:117;9510:78;9580:7;9571:6;9560:9;9556:22;9510:78;:::i;:::-;9500:88;;9295:303;8921:684;;;;;:::o;9611:619::-;9688:6;9696;9704;9753:2;9741:9;9732:7;9728:23;9724:32;9721:119;;;9759:79;;:::i;:::-;9721:119;9879:1;9904:53;9949:7;9940:6;9929:9;9925:22;9904:53;:::i;:::-;9894:63;;9850:117;10006:2;10032:53;10077:7;10068:6;10057:9;10053:22;10032:53;:::i;:::-;10022:63;;9977:118;10134:2;10160:53;10205:7;10196:6;10185:9;10181:22;10160:53;:::i;:::-;10150:63;;10105:118;9611:619;;;;;:::o;10236:118::-;10323:24;10341:5;10323:24;:::i;:::-;10318:3;10311:37;10236:118;;:::o;10360:157::-;10465:45;10485:24;10503:5;10485:24;:::i;:::-;10465:45;:::i;:::-;10460:3;10453:58;10360:157;;:::o;10523:109::-;10604:21;10619:5;10604:21;:::i;:::-;10599:3;10592:34;10523:109;;:::o;10638:118::-;10725:24;10743:5;10725:24;:::i;:::-;10720:3;10713:37;10638:118;;:::o;10762:360::-;10848:3;10876:38;10908:5;10876:38;:::i;:::-;10930:70;10993:6;10988:3;10930:70;:::i;:::-;10923:77;;11009:52;11054:6;11049:3;11042:4;11035:5;11031:16;11009:52;:::i;:::-;11086:29;11108:6;11086:29;:::i;:::-;11081:3;11077:39;11070:46;;10852:270;10762:360;;;;:::o;11128:187::-;11243:65;11302:5;11243:65;:::i;:::-;11238:3;11231:78;11128:187;;:::o;11321:364::-;11409:3;11437:39;11470:5;11437:39;:::i;:::-;11492:71;11556:6;11551:3;11492:71;:::i;:::-;11485:78;;11572:52;11617:6;11612:3;11605:4;11598:5;11594:16;11572:52;:::i;:::-;11649:29;11671:6;11649:29;:::i;:::-;11644:3;11640:39;11633:46;;11413:272;11321:364;;;;:::o;11691:377::-;11797:3;11825:39;11858:5;11825:39;:::i;:::-;11880:89;11962:6;11957:3;11880:89;:::i;:::-;11873:96;;11978:52;12023:6;12018:3;12011:4;12004:5;12000:16;11978:52;:::i;:::-;12055:6;12050:3;12046:16;12039:23;;11801:267;11691:377;;;;:::o;12074:366::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12074:366;;;:::o;12446:::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12446:366;;;:::o;12818:::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12818:366;;;:::o;13190:::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13190:366;;;:::o;13562:::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13562:366;;;:::o;13934:::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;13934:366;;;:::o;14306:::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:::-;16680:3;16701:67;16765:2;16760:3;16701:67;:::i;:::-;16694:74;;16777:93;16866:3;16777:93;:::i;:::-;16895:2;16890:3;16886:12;16879:19;;16538:366;;;:::o;16910:400::-;17070:3;17091:84;17173:1;17168:3;17091:84;:::i;:::-;17084:91;;17184:93;17273:3;17184:93;:::i;:::-;17302:1;17297:3;17293:11;17286:18;;16910:400;;;:::o;17316:366::-;17458:3;17479:67;17543:2;17538:3;17479:67;:::i;:::-;17472:74;;17555:93;17644:3;17555:93;:::i;:::-;17673:2;17668:3;17664:12;17657:19;;17316:366;;;:::o;17688:::-;17830:3;17851:67;17915:2;17910:3;17851:67;:::i;:::-;17844:74;;17927:93;18016:3;17927:93;:::i;:::-;18045:2;18040:3;18036:12;18029:19;;17688:366;;;:::o;18060:::-;18202:3;18223:67;18287:2;18282:3;18223:67;:::i;:::-;18216:74;;18299:93;18388:3;18299:93;:::i;:::-;18417:2;18412:3;18408:12;18401:19;;18060:366;;;:::o;18432:::-;18574:3;18595:67;18659:2;18654:3;18595:67;:::i;:::-;18588:74;;18671:93;18760:3;18671:93;:::i;:::-;18789:2;18784:3;18780:12;18773:19;;18432:366;;;:::o;18804:::-;18946:3;18967:67;19031:2;19026:3;18967:67;:::i;:::-;18960:74;;19043:93;19132:3;19043:93;:::i;:::-;19161:2;19156:3;19152:12;19145:19;;18804:366;;;:::o;19176:::-;19318:3;19339:67;19403:2;19398:3;19339:67;:::i;:::-;19332:74;;19415:93;19504:3;19415:93;:::i;:::-;19533:2;19528:3;19524:12;19517:19;;19176:366;;;:::o;19548:::-;19690:3;19711:67;19775:2;19770:3;19711:67;:::i;:::-;19704:74;;19787:93;19876:3;19787:93;:::i;:::-;19905:2;19900:3;19896:12;19889:19;;19548:366;;;:::o;19920:398::-;20079:3;20100:83;20181:1;20176:3;20100:83;:::i;:::-;20093:90;;20192:93;20281:3;20192:93;:::i;:::-;20310:1;20305:3;20301:11;20294:18;;19920:398;;;:::o;20324:366::-;20466:3;20487:67;20551:2;20546:3;20487:67;:::i;:::-;20480:74;;20563:93;20652:3;20563:93;:::i;:::-;20681:2;20676:3;20672:12;20665:19;;20324:366;;;:::o;20696:::-;20838:3;20859:67;20923:2;20918:3;20859:67;:::i;:::-;20852:74;;20935:93;21024:3;20935:93;:::i;:::-;21053:2;21048:3;21044:12;21037:19;;20696:366;;;:::o;21068:::-;21210:3;21231:67;21295:2;21290:3;21231:67;:::i;:::-;21224:74;;21307:93;21396:3;21307:93;:::i;:::-;21425:2;21420:3;21416:12;21409:19;;21068:366;;;:::o;21440:::-;21582:3;21603:67;21667:2;21662:3;21603:67;:::i;:::-;21596:74;;21679:93;21768:3;21679:93;:::i;:::-;21797:2;21792:3;21788:12;21781:19;;21440:366;;;:::o;21812:::-;21954:3;21975:67;22039:2;22034:3;21975:67;:::i;:::-;21968:74;;22051:93;22140:3;22051:93;:::i;:::-;22169:2;22164:3;22160:12;22153:19;;21812:366;;;:::o;22184:::-;22326:3;22347:67;22411:2;22406:3;22347:67;:::i;:::-;22340:74;;22423:93;22512:3;22423:93;:::i;:::-;22541:2;22536:3;22532:12;22525:19;;22184:366;;;:::o;22556:::-;22698:3;22719:67;22783:2;22778:3;22719:67;:::i;:::-;22712:74;;22795:93;22884:3;22795:93;:::i;:::-;22913:2;22908:3;22904:12;22897:19;;22556:366;;;:::o;22928:::-;23070:3;23091:67;23155:2;23150:3;23091:67;:::i;:::-;23084:74;;23167:93;23256:3;23167:93;:::i;:::-;23285:2;23280:3;23276:12;23269:19;;22928:366;;;:::o;23300:::-;23442:3;23463:67;23527:2;23522:3;23463:67;:::i;:::-;23456:74;;23539:93;23628:3;23539:93;:::i;:::-;23657:2;23652:3;23648:12;23641:19;;23300:366;;;:::o;23672:118::-;23759:24;23777:5;23759:24;:::i;:::-;23754:3;23747:37;23672:118;;:::o;23796:256::-;23908:3;23923:75;23994:3;23985:6;23923:75;:::i;:::-;24023:2;24018:3;24014:12;24007:19;;24043:3;24036:10;;23796:256;;;;:::o;24058:701::-;24339:3;24361:95;24452:3;24443:6;24361:95;:::i;:::-;24354:102;;24473:95;24564:3;24555:6;24473:95;:::i;:::-;24466:102;;24585:148;24729:3;24585:148;:::i;:::-;24578:155;;24750:3;24743:10;;24058:701;;;;;:::o;24765:379::-;24949:3;24971:147;25114:3;24971:147;:::i;:::-;24964:154;;25135:3;25128:10;;24765:379;;;:::o;25150:222::-;25243:4;25281:2;25270:9;25266:18;25258:26;;25294:71;25362:1;25351:9;25347:17;25338:6;25294:71;:::i;:::-;25150:222;;;;:::o;25378:332::-;25499:4;25537:2;25526:9;25522:18;25514:26;;25550:71;25618:1;25607:9;25603:17;25594:6;25550:71;:::i;:::-;25631:72;25699:2;25688:9;25684:18;25675:6;25631:72;:::i;:::-;25378:332;;;;;:::o;25716:640::-;25911:4;25949:3;25938:9;25934:19;25926:27;;25963:71;26031:1;26020:9;26016:17;26007:6;25963:71;:::i;:::-;26044:72;26112:2;26101:9;26097:18;26088:6;26044:72;:::i;:::-;26126;26194:2;26183:9;26179:18;26170:6;26126:72;:::i;:::-;26245:9;26239:4;26235:20;26230:2;26219:9;26215:18;26208:48;26273:76;26344:4;26335:6;26273:76;:::i;:::-;26265:84;;25716:640;;;;;;;:::o;26362:210::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26500:65;26562:1;26551:9;26547:17;26538:6;26500:65;:::i;:::-;26362:210;;;;:::o;26578:222::-;26671:4;26709:2;26698:9;26694:18;26686:26;;26722:71;26790:1;26779:9;26775:17;26766:6;26722:71;:::i;:::-;26578:222;;;;:::o;26806:278::-;26927:4;26965:2;26954:9;26950:18;26942:26;;26978:99;27074:1;27063:9;27059:17;27050:6;26978:99;:::i;:::-;26806:278;;;;:::o;27090:313::-;27203:4;27241:2;27230:9;27226:18;27218:26;;27290:9;27284:4;27280:20;27276:1;27265:9;27261:17;27254:47;27318:78;27391:4;27382:6;27318:78;:::i;:::-;27310:86;;27090:313;;;;:::o;27409:419::-;27575:4;27613:2;27602:9;27598:18;27590:26;;27662:9;27656:4;27652:20;27648:1;27637:9;27633:17;27626:47;27690:131;27816:4;27690:131;:::i;:::-;27682:139;;27409:419;;;:::o;27834:::-;28000:4;28038:2;28027:9;28023:18;28015:26;;28087:9;28081:4;28077:20;28073:1;28062:9;28058:17;28051:47;28115:131;28241:4;28115:131;:::i;:::-;28107:139;;27834:419;;;:::o;28259:::-;28425:4;28463:2;28452:9;28448:18;28440:26;;28512:9;28506:4;28502:20;28498:1;28487:9;28483:17;28476:47;28540:131;28666:4;28540:131;:::i;:::-;28532:139;;28259:419;;;:::o;28684:::-;28850:4;28888:2;28877:9;28873:18;28865:26;;28937:9;28931:4;28927:20;28923:1;28912:9;28908:17;28901:47;28965:131;29091:4;28965:131;:::i;:::-;28957:139;;28684:419;;;:::o;29109:::-;29275:4;29313:2;29302:9;29298:18;29290:26;;29362:9;29356:4;29352:20;29348:1;29337:9;29333:17;29326:47;29390:131;29516:4;29390:131;:::i;:::-;29382:139;;29109:419;;;:::o;29534:::-;29700:4;29738:2;29727:9;29723:18;29715:26;;29787:9;29781:4;29777:20;29773:1;29762:9;29758:17;29751:47;29815:131;29941:4;29815:131;:::i;:::-;29807:139;;29534:419;;;:::o;29959:::-;30125:4;30163:2;30152:9;30148:18;30140:26;;30212:9;30206:4;30202:20;30198:1;30187:9;30183:17;30176:47;30240:131;30366:4;30240:131;:::i;:::-;30232:139;;29959:419;;;:::o;30384:::-;30550:4;30588:2;30577:9;30573:18;30565:26;;30637:9;30631:4;30627:20;30623:1;30612:9;30608:17;30601:47;30665:131;30791:4;30665:131;:::i;:::-;30657:139;;30384:419;;;:::o;30809:::-;30975:4;31013:2;31002:9;30998:18;30990:26;;31062:9;31056:4;31052:20;31048:1;31037:9;31033:17;31026:47;31090:131;31216:4;31090:131;:::i;:::-;31082:139;;30809:419;;;:::o;31234:::-;31400:4;31438:2;31427:9;31423:18;31415:26;;31487:9;31481:4;31477:20;31473:1;31462:9;31458:17;31451:47;31515:131;31641:4;31515:131;:::i;:::-;31507:139;;31234:419;;;:::o;31659:::-;31825:4;31863:2;31852:9;31848:18;31840:26;;31912:9;31906:4;31902:20;31898:1;31887:9;31883:17;31876:47;31940:131;32066:4;31940:131;:::i;:::-;31932:139;;31659:419;;;:::o;32084:::-;32250:4;32288:2;32277:9;32273:18;32265:26;;32337:9;32331:4;32327:20;32323:1;32312:9;32308:17;32301:47;32365:131;32491:4;32365:131;:::i;:::-;32357:139;;32084:419;;;:::o;32509:::-;32675:4;32713:2;32702:9;32698:18;32690:26;;32762:9;32756:4;32752:20;32748:1;32737:9;32733:17;32726:47;32790:131;32916:4;32790:131;:::i;:::-;32782:139;;32509:419;;;:::o;32934:::-;33100:4;33138:2;33127:9;33123:18;33115:26;;33187:9;33181:4;33177:20;33173:1;33162:9;33158:17;33151:47;33215:131;33341:4;33215:131;:::i;:::-;33207:139;;32934:419;;;:::o;33359:::-;33525:4;33563:2;33552:9;33548:18;33540:26;;33612:9;33606:4;33602:20;33598:1;33587:9;33583:17;33576:47;33640:131;33766:4;33640:131;:::i;:::-;33632:139;;33359:419;;;:::o;33784:::-;33950:4;33988:2;33977:9;33973:18;33965:26;;34037:9;34031:4;34027:20;34023:1;34012:9;34008:17;34001:47;34065:131;34191:4;34065:131;:::i;:::-;34057:139;;33784:419;;;:::o;34209:::-;34375:4;34413:2;34402:9;34398:18;34390:26;;34462:9;34456:4;34452:20;34448:1;34437:9;34433:17;34426:47;34490:131;34616:4;34490:131;:::i;:::-;34482:139;;34209:419;;;:::o;34634:::-;34800:4;34838:2;34827:9;34823:18;34815:26;;34887:9;34881:4;34877:20;34873:1;34862:9;34858:17;34851:47;34915:131;35041:4;34915:131;:::i;:::-;34907:139;;34634:419;;;:::o;35059:::-;35225:4;35263:2;35252:9;35248:18;35240:26;;35312:9;35306:4;35302:20;35298:1;35287:9;35283:17;35276:47;35340:131;35466:4;35340:131;:::i;:::-;35332:139;;35059:419;;;:::o;35484:::-;35650:4;35688:2;35677:9;35673:18;35665:26;;35737:9;35731:4;35727:20;35723:1;35712:9;35708:17;35701:47;35765:131;35891:4;35765:131;:::i;:::-;35757:139;;35484:419;;;:::o;35909:::-;36075:4;36113:2;36102:9;36098:18;36090:26;;36162:9;36156:4;36152:20;36148:1;36137:9;36133:17;36126:47;36190:131;36316:4;36190:131;:::i;:::-;36182:139;;35909:419;;;:::o;36334:::-;36500:4;36538:2;36527:9;36523:18;36515:26;;36587:9;36581:4;36577:20;36573:1;36562:9;36558:17;36551:47;36615:131;36741:4;36615:131;:::i;:::-;36607:139;;36334:419;;;:::o;36759:::-;36925:4;36963:2;36952:9;36948:18;36940:26;;37012:9;37006:4;37002:20;36998:1;36987:9;36983:17;36976:47;37040:131;37166:4;37040:131;:::i;:::-;37032:139;;36759:419;;;:::o;37184:::-;37350:4;37388:2;37377:9;37373:18;37365:26;;37437:9;37431:4;37427:20;37423:1;37412:9;37408:17;37401:47;37465:131;37591:4;37465:131;:::i;:::-;37457:139;;37184:419;;;:::o;37609:::-;37775:4;37813:2;37802:9;37798:18;37790:26;;37862:9;37856:4;37852:20;37848:1;37837:9;37833:17;37826:47;37890:131;38016:4;37890:131;:::i;:::-;37882:139;;37609:419;;;:::o;38034:::-;38200:4;38238:2;38227:9;38223:18;38215:26;;38287:9;38281:4;38277:20;38273:1;38262:9;38258:17;38251:47;38315:131;38441:4;38315:131;:::i;:::-;38307:139;;38034:419;;;:::o;38459:::-;38625:4;38663:2;38652:9;38648:18;38640:26;;38712:9;38706:4;38702:20;38698:1;38687:9;38683:17;38676:47;38740:131;38866:4;38740:131;:::i;:::-;38732:139;;38459:419;;;:::o;38884:::-;39050:4;39088:2;39077:9;39073:18;39065:26;;39137:9;39131:4;39127:20;39123:1;39112:9;39108:17;39101:47;39165:131;39291:4;39165:131;:::i;:::-;39157:139;;38884:419;;;:::o;39309:::-;39475:4;39513:2;39502:9;39498:18;39490:26;;39562:9;39556:4;39552:20;39548:1;39537:9;39533:17;39526:47;39590:131;39716:4;39590:131;:::i;:::-;39582:139;;39309:419;;;:::o;39734:222::-;39827:4;39865:2;39854:9;39850:18;39842:26;;39878:71;39946:1;39935:9;39931:17;39922:6;39878:71;:::i;:::-;39734:222;;;;:::o;39962:129::-;39996:6;40023:20;;:::i;:::-;40013:30;;40052:33;40080:4;40072:6;40052:33;:::i;:::-;39962:129;;;:::o;40097:75::-;40130:6;40163:2;40157:9;40147:19;;40097:75;:::o;40178:311::-;40255:4;40345:18;40337:6;40334:30;40331:56;;;40367:18;;:::i;:::-;40331:56;40417:4;40409:6;40405:17;40397:25;;40477:4;40471;40467:15;40459:23;;40178:311;;;:::o;40495:307::-;40556:4;40646:18;40638:6;40635:30;40632:56;;;40668:18;;:::i;:::-;40632:56;40706:29;40728:6;40706:29;:::i;:::-;40698:37;;40790:4;40784;40780:15;40772:23;;40495:307;;;:::o;40808:308::-;40870:4;40960:18;40952:6;40949:30;40946:56;;;40982:18;;:::i;:::-;40946:56;41020:29;41042:6;41020:29;:::i;:::-;41012:37;;41104:4;41098;41094:15;41086:23;;40808:308;;;:::o;41122:98::-;41173:6;41207:5;41201:12;41191:22;;41122:98;;;:::o;41226:99::-;41278:6;41312:5;41306:12;41296:22;;41226:99;;;:::o;41331:168::-;41414:11;41448:6;41443:3;41436:19;41488:4;41483:3;41479:14;41464:29;;41331:168;;;;:::o;41505:147::-;41606:11;41643:3;41628:18;;41505:147;;;;:::o;41658:169::-;41742:11;41776:6;41771:3;41764:19;41816:4;41811:3;41807:14;41792:29;;41658:169;;;;:::o;41833:148::-;41935:11;41972:3;41957:18;;41833:148;;;;:::o;41987:273::-;42027:3;42046:20;42064:1;42046:20;:::i;:::-;42041:25;;42080:20;42098:1;42080:20;:::i;:::-;42075:25;;42202:1;42166:34;42162:42;42159:1;42156:49;42153:75;;;42208:18;;:::i;:::-;42153:75;42252:1;42249;42245:9;42238:16;;41987:273;;;;:::o;42266:305::-;42306:3;42325:20;42343:1;42325:20;:::i;:::-;42320:25;;42359:20;42377:1;42359:20;:::i;:::-;42354:25;;42513:1;42445:66;42441:74;42438:1;42435:81;42432:107;;;42519:18;;:::i;:::-;42432:107;42563:1;42560;42556:9;42549:16;;42266:305;;;;:::o;42577:185::-;42617:1;42634:20;42652:1;42634:20;:::i;:::-;42629:25;;42668:20;42686:1;42668:20;:::i;:::-;42663:25;;42707:1;42697:35;;42712:18;;:::i;:::-;42697:35;42754:1;42751;42747:9;42742:14;;42577:185;;;;:::o;42768:348::-;42808:7;42831:20;42849:1;42831:20;:::i;:::-;42826:25;;42865:20;42883:1;42865:20;:::i;:::-;42860:25;;43053:1;42985:66;42981:74;42978:1;42975:81;42970:1;42963:9;42956:17;42952:105;42949:131;;;43060:18;;:::i;:::-;42949:131;43108:1;43105;43101:9;43090:20;;42768:348;;;;:::o;43122:191::-;43162:4;43182:20;43200:1;43182:20;:::i;:::-;43177:25;;43216:20;43234:1;43216:20;:::i;:::-;43211:25;;43255:1;43252;43249:8;43246:34;;;43260:18;;:::i;:::-;43246:34;43305:1;43302;43298:9;43290:17;;43122:191;;;;:::o;43319:::-;43359:4;43379:20;43397:1;43379:20;:::i;:::-;43374:25;;43413:20;43431:1;43413:20;:::i;:::-;43408:25;;43452:1;43449;43446:8;43443:34;;;43457:18;;:::i;:::-;43443:34;43502:1;43499;43495:9;43487:17;;43319:191;;;;:::o;43516:96::-;43553:7;43582:24;43600:5;43582:24;:::i;:::-;43571:35;;43516:96;;;:::o;43618:90::-;43652:7;43695:5;43688:13;43681:21;43670:32;;43618:90;;;:::o;43714:77::-;43751:7;43780:5;43769:16;;43714:77;;;:::o;43797:149::-;43833:7;43873:66;43866:5;43862:78;43851:89;;43797:149;;;:::o;43952:118::-;43989:7;44029:34;44022:5;44018:46;44007:57;;43952:118;;;:::o;44076:126::-;44113:7;44153:42;44146:5;44142:54;44131:65;;44076:126;;;:::o;44208:77::-;44245:7;44274:5;44263:16;;44208:77;;;:::o;44291:154::-;44369:9;44402:37;44433:5;44402:37;:::i;:::-;44389:50;;44291:154;;;:::o;44451:126::-;44501:9;44534:37;44565:5;44534:37;:::i;:::-;44521:50;;44451:126;;;:::o;44583:113::-;44633:9;44666:24;44684:5;44666:24;:::i;:::-;44653:37;;44583:113;;;:::o;44702:154::-;44786:6;44781:3;44776;44763:30;44848:1;44839:6;44834:3;44830:16;44823:27;44702:154;;;:::o;44862:307::-;44930:1;44940:113;44954:6;44951:1;44948:13;44940:113;;;45039:1;45034:3;45030:11;45024:18;45020:1;45015:3;45011:11;45004:39;44976:2;44973:1;44969:10;44964:15;;44940:113;;;45071:6;45068:1;45065:13;45062:101;;;45151:1;45142:6;45137:3;45133:16;45126:27;45062:101;44911:258;44862:307;;;:::o;45175:171::-;45214:3;45237:24;45255:5;45237:24;:::i;:::-;45228:33;;45283:4;45276:5;45273:15;45270:41;;;45291:18;;:::i;:::-;45270:41;45338:1;45331:5;45327:13;45320:20;;45175:171;;;:::o;45352:320::-;45396:6;45433:1;45427:4;45423:12;45413:22;;45480:1;45474:4;45470:12;45501:18;45491:81;;45557:4;45549:6;45545:17;45535:27;;45491:81;45619:2;45611:6;45608:14;45588:18;45585:38;45582:84;;;45638:18;;:::i;:::-;45582:84;45403:269;45352:320;;;:::o;45678:281::-;45761:27;45783:4;45761:27;:::i;:::-;45753:6;45749:40;45891:6;45879:10;45876:22;45855:18;45843:10;45840:34;45837:62;45834:88;;;45902:18;;:::i;:::-;45834:88;45942:10;45938:2;45931:22;45721:238;45678:281;;:::o;45965:233::-;46004:3;46027:24;46045:5;46027:24;:::i;:::-;46018:33;;46073:66;46066:5;46063:77;46060:103;;;46143:18;;:::i;:::-;46060:103;46190:1;46183:5;46179:13;46172:20;;45965:233;;;:::o;46204:100::-;46243:7;46272:26;46292:5;46272:26;:::i;:::-;46261:37;;46204:100;;;:::o;46310:94::-;46349:7;46378:20;46392:5;46378:20;:::i;:::-;46367:31;;46310:94;;;:::o;46410:176::-;46442:1;46459:20;46477:1;46459:20;:::i;:::-;46454:25;;46493:20;46511:1;46493:20;:::i;:::-;46488:25;;46532:1;46522:35;;46537:18;;:::i;:::-;46522:35;46578:1;46575;46571:9;46566:14;;46410:176;;;;:::o;46592:180::-;46640:77;46637:1;46630:88;46737:4;46734:1;46727:15;46761:4;46758:1;46751:15;46778:180;46826:77;46823:1;46816:88;46923:4;46920:1;46913:15;46947:4;46944:1;46937:15;46964:180;47012:77;47009:1;47002:88;47109:4;47106:1;47099:15;47133:4;47130:1;47123:15;47150:180;47198:77;47195:1;47188:88;47295:4;47292:1;47285:15;47319:4;47316:1;47309:15;47336:180;47384:77;47381:1;47374:88;47481:4;47478:1;47471:15;47505:4;47502:1;47495:15;47522:117;47631:1;47628;47621:12;47645:117;47754:1;47751;47744:12;47768:117;47877:1;47874;47867:12;47891:117;48000:1;47997;47990:12;48014:117;48123:1;48120;48113:12;48137:102;48178:6;48229:2;48225:7;48220:2;48213:5;48209:14;48205:28;48195:38;;48137:102;;;:::o;48245:94::-;48278:8;48326:5;48322:2;48318:14;48297:35;;48245:94;;;:::o;48345:221::-;48485:34;48481:1;48473:6;48469:14;48462:58;48554:4;48549:2;48541:6;48537:15;48530:29;48345:221;:::o;48572:225::-;48712:34;48708:1;48700:6;48696:14;48689:58;48781:8;48776:2;48768:6;48764:15;48757:33;48572:225;:::o;48803:229::-;48943:34;48939:1;48931:6;48927:14;48920:58;49012:12;49007:2;48999:6;48995:15;48988:37;48803:229;:::o;49038:164::-;49178:16;49174:1;49166:6;49162:14;49155:40;49038:164;:::o;49208:222::-;49348:34;49344:1;49336:6;49332:14;49325:58;49417:5;49412:2;49404:6;49400:15;49393:30;49208:222;:::o;49436:224::-;49576:34;49572:1;49564:6;49560:14;49553:58;49645:7;49640:2;49632:6;49628:15;49621:32;49436:224;:::o;49666:236::-;49806:34;49802:1;49794:6;49790:14;49783:58;49875:19;49870:2;49862:6;49858:15;49851:44;49666:236;:::o;49908:166::-;50048:18;50044:1;50036:6;50032:14;50025:42;49908:166;:::o;50080:220::-;50220:34;50216:1;50208:6;50204:14;50197:58;50289:3;50284:2;50276:6;50272:15;50265:28;50080:220;:::o;50306:244::-;50446:34;50442:1;50434:6;50430:14;50423:58;50515:27;50510:2;50502:6;50498:15;50491:52;50306:244;:::o;50556:178::-;50696:30;50692:1;50684:6;50680:14;50673:54;50556:178;:::o;50740:230::-;50880:34;50876:1;50868:6;50864:14;50857:58;50949:13;50944:2;50936:6;50932:15;50925:38;50740:230;:::o;50976:225::-;51116:34;51112:1;51104:6;51100:14;51093:58;51185:8;51180:2;51172:6;51168:15;51161:33;50976:225;:::o;51207:155::-;51347:7;51343:1;51335:6;51331:14;51324:31;51207:155;:::o;51368:182::-;51508:34;51504:1;51496:6;51492:14;51485:58;51368:182;:::o;51556:234::-;51696:34;51692:1;51684:6;51680:14;51673:58;51765:17;51760:2;51752:6;51748:15;51741:42;51556:234;:::o;51796:176::-;51936:28;51932:1;51924:6;51920:14;51913:52;51796:176;:::o;51978:237::-;52118:34;52114:1;52106:6;52102:14;52095:58;52187:20;52182:2;52174:6;52170:15;52163:45;51978:237;:::o;52221:175::-;52361:27;52357:1;52349:6;52345:14;52338:51;52221:175;:::o;52402:173::-;52542:25;52538:1;52530:6;52526:14;52519:49;52402:173;:::o;52581:221::-;52721:34;52717:1;52709:6;52705:14;52698:58;52790:4;52785:2;52777:6;52773:15;52766:29;52581:221;:::o;52808:114::-;;:::o;52928:227::-;53068:34;53064:1;53056:6;53052:14;53045:58;53137:10;53132:2;53124:6;53120:15;53113:35;52928:227;:::o;53161:238::-;53301:34;53297:1;53289:6;53285:14;53278:58;53370:21;53365:2;53357:6;53353:15;53346:46;53161:238;:::o;53405:179::-;53545:31;53541:1;53533:6;53529:14;53522:55;53405:179;:::o;53590:220::-;53730:34;53726:1;53718:6;53714:14;53707:58;53799:3;53794:2;53786:6;53782:15;53775:28;53590:220;:::o;53816:233::-;53956:34;53952:1;53944:6;53940:14;53933:58;54025:16;54020:2;54012:6;54008:15;54001:41;53816:233;:::o;54055:234::-;54195:34;54191:1;54183:6;54179:14;54172:58;54264:17;54259:2;54251:6;54247:15;54240:42;54055:234;:::o;54295:176::-;54435:28;54431:1;54423:6;54419:14;54412:52;54295:176;:::o;54477:232::-;54617:34;54613:1;54605:6;54601:14;54594:58;54686:15;54681:2;54673:6;54669:15;54662:40;54477:232;:::o;54715:221::-;54855:34;54851:1;54843:6;54839:14;54832:58;54924:4;54919:2;54911:6;54907:15;54900:29;54715:221;:::o;54942:122::-;55015:24;55033:5;55015:24;:::i;:::-;55008:5;55005:35;54995:63;;55054:1;55051;55044:12;54995:63;54942:122;:::o;55070:116::-;55140:21;55155:5;55140:21;:::i;:::-;55133:5;55130:32;55120:60;;55176:1;55173;55166:12;55120:60;55070:116;:::o;55192:122::-;55265:24;55283:5;55265:24;:::i;:::-;55258:5;55255:35;55245:63;;55304:1;55301;55294:12;55245:63;55192:122;:::o;55320:120::-;55392:23;55409:5;55392:23;:::i;:::-;55385:5;55382:34;55372:62;;55430:1;55427;55420:12;55372:62;55320:120;:::o;55446:122::-;55519:24;55537:5;55519:24;:::i;:::-;55512:5;55509:35;55499:63;;55558:1;55555;55548:12;55499:63;55446:122;:::o
Swarm Source
ipfs://ed12fa8e3d6bbdbbbd40429669643bd57e809c01024b21a650ca0f860b54b174
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.