Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
BANANO
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-02-03 */ // SPDX-License-Identifier: MIT // File: @thirdweb-dev/contracts/eip/interface/IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @thirdweb-dev/contracts/eip/interface/IERC20.sol pragma solidity ^0.8.0; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @thirdweb-dev/contracts/eip/interface/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @title ERC20Metadata interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20Metadata { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/utils/Context.sol // 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; } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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, _allowances[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 = _allowances[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 Spend `amount` form the allowance of `owner` toward `spender`. * * 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 {} } // File: @thirdweb-dev/contracts/lib/Strings.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @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); } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, /// and the alphabets are capitalized conditionally according to /// https://eips.ethereum.org/EIPS/eip-55 function toHexStringChecksummed(address value) internal pure returns (string memory str) { str = toHexString(value); /// @solidity memory-safe-assembly assembly { let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` let o := add(str, 0x22) let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` let t := shl(240, 136) // `0b10001000 << 240` for { let i := 0 } 1 { } { mstore(add(i, i), mul(t, byte(i, hashed))) i := add(i, 1) if eq(i, 20) { break } } mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) o := add(o, 0x20) mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { str = toHexStringNoPrefix(value); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(address value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { str := mload(0x40) // Allocate the memory. // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. mstore(0x40, add(str, 0x80)) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) str := add(str, 2) mstore(str, 40) let o := add(str, 0x20) mstore(add(o, 40), 0) value := shl(96, value) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let i := 0 } 1 { } { let p := add(o, add(i, i)) let temp := byte(i, value) mstore8(add(p, 1), mload(and(temp, 15))) mstore8(p, mload(shr(4, temp))) i := add(i, 1) if eq(i, 20) { break } } } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexString(bytes memory raw) internal pure returns (string memory str) { str = toHexStringNoPrefix(raw); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { let length := mload(raw) str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. mstore(str, add(length, length)) // Store the length of the output. // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let o := add(str, 0x20) let end := add(raw, length) for { } iszero(eq(raw, end)) { } { raw := add(raw, 1) mstore8(add(o, 1), mload(and(mload(raw), 15))) mstore8(o, mload(and(shr(4, mload(raw)), 15))) o := add(o, 2) } mstore(o, 0) // Zeroize the slot after the string. mstore(0x40, add(o, 0x20)) // Allocate the memory. } } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/utils/cryptography/EIP712.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/token/ERC20/extensions/ERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; // solhint-disable-next-line var-name-mixedcase uint256 private immutable _CACHED_CHAIN_ID; // solhint-disable-next-line var-name-mixedcase address private immutable _CACHED_THIS; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) { _CACHED_CHAIN_ID = block.chainid; _CACHED_THIS = address(this); _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(); } /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = ECDSA.toTypedDataHash(DOMAIN_SEPARATOR(), structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() public view override returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(); } } function _buildDomainSeparator() private view returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256("1"), block.chainid, address(this) ) ); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File: @thirdweb-dev/contracts/extension/interface/IContractMetadata.sol pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ interface IContractMetadata { /// @dev Returns the metadata URI of the contract. function contractURI() external view returns (string memory); /** * @dev Sets contract URI for the storefront-level metadata of the contract. * Only module admin can call this function. */ function setContractURI(string calldata _uri) external; /// @dev Emitted when the contract URI is updated. event ContractURIUpdated(string prevURI, string newURI); } // File: @thirdweb-dev/contracts/extension/ContractMetadata.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title Contract Metadata * @notice Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ abstract contract ContractMetadata is IContractMetadata { /// @dev The sender is not authorized to perform the action error ContractMetadataUnauthorized(); /// @notice Returns the contract metadata URI. string public override contractURI; /** * @notice Lets a contract admin set the URI for contract-level metadata. * @dev Caller should be authorized to setup contractURI, e.g. contract admin. * See {_canSetContractURI}. * Emits {ContractURIUpdated Event}. * * @param _uri keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function setContractURI(string memory _uri) external override { if (!_canSetContractURI()) { revert ContractMetadataUnauthorized(); } _setupContractURI(_uri); } /// @dev Lets a contract admin set the URI for contract-level metadata. function _setupContractURI(string memory _uri) internal { string memory prevURI = contractURI; contractURI = _uri; emit ContractURIUpdated(prevURI, _uri); } /// @dev Returns whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view virtual returns (bool); } // File: @thirdweb-dev/contracts/lib/Address.sol pragma solidity ^0.8.1; /// @author thirdweb, OpenZeppelin Contracts (v4.9.0) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @thirdweb-dev/contracts/extension/interface/IMulticall.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ interface IMulticall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results); } // File: @thirdweb-dev/contracts/extension/Multicall.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ contract Multicall is IMulticall { /** * @notice Receives and executes a batch of function calls on this contract. * @dev Receives and executes a batch of function calls on this contract. * * @param data The bytes data that makes up the batch of function calls to execute. * @return results The bytes data that makes up the result of the batch of function calls executed. */ function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); address sender = _msgSender(); bool isForwarder = msg.sender != sender; for (uint256 i = 0; i < data.length; i++) { if (isForwarder) { results[i] = Address.functionDelegateCall(address(this), abi.encodePacked(data[i], sender)); } else { results[i] = Address.functionDelegateCall(address(this), data[i]); } } return results; } /// @notice Returns the sender in the given execution context. function _msgSender() internal view virtual returns (address) { return msg.sender; } } // File: @thirdweb-dev/contracts/extension/interface/IOwnable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ interface IOwnable { /// @dev Returns the owner of the contract. function owner() external view returns (address); /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin. function setOwner(address _newOwner) external; /// @dev Emitted when a new Owner is set. event OwnerUpdated(address indexed prevOwner, address indexed newOwner); } // File: @thirdweb-dev/contracts/extension/Ownable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title Ownable * @notice Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ abstract contract Ownable is IOwnable { /// @dev The sender is not authorized to perform the action error OwnableUnauthorized(); /// @dev Owner of the contract (purpose: OpenSea compatibility) address private _owner; /// @dev Reverts if caller is not the owner. modifier onlyOwner() { if (msg.sender != _owner) { revert OwnableUnauthorized(); } _; } /** * @notice Returns the owner of the contract. */ function owner() public view override returns (address) { return _owner; } /** * @notice Lets an authorized wallet set a new owner for the contract. * @param _newOwner The address to set as the new owner of the contract. */ function setOwner(address _newOwner) external override { if (!_canSetOwner()) { revert OwnableUnauthorized(); } _setupOwner(_newOwner); } /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin. function _setupOwner(address _newOwner) internal { address _prevOwner = _owner; _owner = _newOwner; emit OwnerUpdated(_prevOwner, _newOwner); } /// @dev Returns whether owner can be set in the given execution context. function _canSetOwner() internal view virtual returns (bool); } // File: @thirdweb-dev/contracts/extension/interface/IMintableERC20.sol pragma solidity ^0.8.0; /// @author thirdweb interface IMintableERC20 { /// @dev Emitted when tokens are minted with `mintTo` event TokensMinted(address indexed mintedTo, uint256 quantityMinted); /** * @dev Creates `amount` new tokens for `to`. * * See {ERC20-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mintTo(address to, uint256 amount) external; } // File: @thirdweb-dev/contracts/extension/interface/IBurnableERC20.sol pragma solidity ^0.8.0; /// @author thirdweb interface IBurnableERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) external; /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) external; } // File: @thirdweb-dev/contracts/base/ERC20Base.sol pragma solidity ^0.8.0; /// @author thirdweb /** * The `ERC20Base` smart contract implements the ERC20 standard. * It includes the following additions to standard ERC20 logic: * * - Ability to mint & burn tokens via the provided `mint` & `burn` functions. * * - Ownership of the contract, with the ability to restrict certain functions to * only be called by the contract's owner. * * - Multicall capability to perform multiple actions atomically * * - EIP 2612 compliance: See {ERC20-permit} method, which can be used to change an account's ERC20 allowance by * presenting a message signed by the account. */ contract ERC20Base is ContractMetadata, Multicall, Ownable, ERC20Permit, IMintableERC20, IBurnableERC20 { /*////////////////////////////////////////////////////////////// Constructor //////////////////////////////////////////////////////////////*/ constructor(address _defaultAdmin, string memory _name, string memory _symbol) ERC20Permit(_name, _symbol) { _setupOwner(_defaultAdmin); } /*////////////////////////////////////////////////////////////// Minting logic //////////////////////////////////////////////////////////////*/ /** * @notice Lets an authorized address mint tokens to a recipient. * @dev The logic in the `_canMint` function determines whether the caller is authorized to mint tokens. * * @param _to The recipient of the tokens to mint. * @param _amount Quantity of tokens to mint. */ function mintTo(address _to, uint256 _amount) public virtual { require(_canMint(), "Not authorized to mint."); require(_amount != 0, "Minting zero tokens."); _mint(_to, _amount); } /** * @notice Lets an owner a given amount of their tokens. * @dev Caller should own the `_amount` of tokens. * * @param _amount The number of tokens to burn. */ function burn(uint256 _amount) external virtual { require(balanceOf(msg.sender) >= _amount, "not enough balance"); _burn(msg.sender, _amount); } /** * @notice Lets an owner burn a given amount of an account's tokens. * @dev `_account` should own the `_amount` of tokens. * * @param _account The account to burn tokens from. * @param _amount The number of tokens to burn. */ function burnFrom(address _account, uint256 _amount) external virtual override { require(_canBurn(), "Not authorized to burn."); require(balanceOf(_account) >= _amount, "not enough balance"); uint256 decreasedAllowance = allowance(_account, msg.sender) - _amount; _approve(_account, msg.sender, 0); _approve(_account, msg.sender, decreasedAllowance); _burn(_account, _amount); } /*////////////////////////////////////////////////////////////// Internal (overrideable) functions //////////////////////////////////////////////////////////////*/ /// @dev Returns whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @dev Returns whether tokens can be minted in the given execution context. function _canMint() internal view virtual returns (bool) { return msg.sender == owner(); } /// @dev Returns whether tokens can be burned in the given execution context. function _canBurn() internal view virtual returns (bool) { return msg.sender == owner(); } /// @dev Returns whether owner can be set in the given execution context. function _canSetOwner() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @notice Returns the sender in the given execution context. function _msgSender() internal view override(Multicall, Context) returns (address) { return msg.sender; } } // File: IERC20MaxSupply.sol pragma solidity ^0.8.9; /// @author askbills interface IERC20MaxSupply { /** * @dev Return maximum total supply can mint for this contract. */ function maxSupply() external view returns (uint256); /** * @dev Return remaining supply can mint for this contract. */ function remainingSupply() external view returns (uint256); } // File: banano.sol pragma solidity ^0.8.9; // ____ _ ____ _____ _ _ // | _ \ | |/ __ \ / ____| | (_) // | |_) | ___ _ __ ___ __| | | | |_ __ | | | |__ __ _ _ _ __ // | _ < / _ \| '__/ _ \/ _` | | | | '_ \| | | '_ \ / _` | | '_ \ // | |_) | (_) | | | __/ (_| | |__| | | | | |____| | | | (_| | | | | | // |____/ \___/|_| \___|\__,_|\____/|_| |_|\_____|_| |_|\__,_|_|_| |_| // // When get bored, just buidl! contract BANANO is ERC20Base, IERC20MaxSupply { // 18 decimals uint256 private immutable _MAX_TOTAL_SUPPLY; /** * @dev Sets the values for {name}, {symbol}, and {maxTotalSupply}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All 3 of these values are immutable: they can only be set once during * construction. */ constructor( address _defaultAdmin, string memory _name, string memory _symbol, uint256 _maxTotalSupply ) ERC20Base( _defaultAdmin, _name, _symbol ) { _MAX_TOTAL_SUPPLY = _maxTotalSupply; } /** * @notice Lets an authorized address mint tokens to a recipient if not exceed the max total supply * @dev The logic in the `_canMint` function determines whether the caller is authorized to mint tokens. * * @param _to The recipient of the tokens to mint. * @param _amount Quantity of tokens to mint. */ /* solhint-disable gas-custom-errors */ function mintTo(address _to, uint256 _amount) public virtual override { require(_canMint(), "Not authorized to mint."); require(_amount != 0, "Minting zero tokens."); require(_MAX_TOTAL_SUPPLY >= (totalSupply() + _amount), "Cannot exceed max supply"); _mint(_to, _amount); } /** * @dev return the maximum total Supply for this contract */ function maxSupply() public view virtual override returns (uint256) { return _MAX_TOTAL_SUPPLY; } /** * @dev Return remaining supply can mint for this contract. */ function remainingSupply() public view virtual override returns (uint256) { return (_MAX_TOTAL_SUPPLY - totalSupply()); } } // 0xPizzaHat was here on January 2025!
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_defaultAdmin","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractMetadataUnauthorized","type":"error"},{"inputs":[],"name":"OwnableUnauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mintedTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantityMinted","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960e0908152503480156200003957600080fd5b50604051620040483803806200404883398181016040528101906200005f9190620005f1565b8383838181818181600590805190602001906200007e92919062000304565b5080600690805190602001906200009792919062000304565b5050504660a081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050620000e66200011660201b60201c565b6080818152505050506200010083620001a460201b60201c565b50505080610100818152505050505050620007a0565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620001496200026a60201b60201c565b805190602001207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200162000189959493929190620006de565b60405160208183030381529060405280519060200120905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a35050565b6060600580546200027b906200076a565b80601f0160208091040260200160405190810160405280929190818152602001828054620002a9906200076a565b8015620002fa5780601f10620002ce57610100808354040283529160200191620002fa565b820191906000526020600020905b815481529060010190602001808311620002dc57829003601f168201915b5050505050905090565b82805462000312906200076a565b90600052602060002090601f01602090048101928262000336576000855562000382565b82601f106200035157805160ff191683800117855562000382565b8280016001018555821562000382579182015b828111156200038157825182559160200191906001019062000364565b5b50905062000391919062000395565b5090565b5b80821115620003b057600081600090555060010162000396565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003f582620003c8565b9050919050565b6200040781620003e8565b81146200041357600080fd5b50565b6000815190506200042781620003fc565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004828262000437565b810181811067ffffffffffffffff82111715620004a457620004a362000448565b5b80604052505050565b6000620004b9620003b4565b9050620004c7828262000477565b919050565b600067ffffffffffffffff821115620004ea57620004e962000448565b5b620004f58262000437565b9050602081019050919050565b60005b838110156200052257808201518184015260208101905062000505565b8381111562000532576000848401525b50505050565b60006200054f6200054984620004cc565b620004ad565b9050828152602081018484840111156200056e576200056d62000432565b5b6200057b84828562000502565b509392505050565b600082601f8301126200059b576200059a6200042d565b5b8151620005ad84826020860162000538565b91505092915050565b6000819050919050565b620005cb81620005b6565b8114620005d757600080fd5b50565b600081519050620005eb81620005c0565b92915050565b600080600080608085870312156200060e576200060d620003be565b5b60006200061e8782880162000416565b945050602085015167ffffffffffffffff811115620006425762000641620003c3565b5b620006508782880162000583565b935050604085015167ffffffffffffffff811115620006745762000673620003c3565b5b620006828782880162000583565b92505060606200069587828801620005da565b91505092959194509250565b6000819050919050565b620006b681620006a1565b82525050565b620006c781620005b6565b82525050565b620006d881620003e8565b82525050565b600060a082019050620006f56000830188620006ab565b620007046020830187620006ab565b620007136040830186620006ab565b620007226060830185620006bc565b620007316080830184620006cd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200078357607f821691505b602082108114156200079a57620007996200073b565b5b50919050565b60805160a05160c05160e05161010051613855620007f36000396000818161085d01528181610f5e0152610f8e01526000610e57015260006106080152600061065e0152600061068701526138556000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80637ecebe00116100c3578063ac9650d81161007c578063ac9650d8146103ed578063d505accf1461041d578063d5abeb0114610439578063da0239a614610457578063dd62ed3e14610475578063e8a3d485146104a557610158565b80637ecebe00146103055780638da5cb5b14610335578063938e3d7b1461035357806395d89b411461036f578063a457c2d71461038d578063a9059cbb146103bd57610158565b80633644e515116101155780633644e51514610233578063395093511461025157806342966c6814610281578063449a52f81461029d57806370a08231146102b957806379cc6790146102e957610158565b806306fdde031461015d578063095ea7b31461017b57806313af4035146101ab57806318160ddd146101c757806323b872dd146101e5578063313ce56714610215575b600080fd5b6101656104c3565b604051610172919061222f565b60405180910390f35b610195600480360381019061019091906122f9565b610555565b6040516101a29190612354565b60405180910390f35b6101c560048036038101906101c0919061236f565b610578565b005b6101cf6105c2565b6040516101dc91906123ab565b60405180910390f35b6101ff60048036038101906101fa91906123c6565b6105cc565b60405161020c9190612354565b60405180910390f35b61021d6105fb565b60405161022a9190612435565b60405180910390f35b61023b610604565b6040516102489190612469565b60405180910390f35b61026b600480360381019061026691906122f9565b6106bb565b6040516102789190612354565b60405180910390f35b61029b60048036038101906102969190612484565b610765565b005b6102b760048036038101906102b291906122f9565b6107bd565b005b6102d360048036038101906102ce919061236f565b6108cb565b6040516102e091906123ab565b60405180910390f35b61030360048036038101906102fe91906122f9565b610914565b005b61031f600480360381019061031a919061236f565b6109e5565b60405161032c91906123ab565b60405180910390f35b61033d610a35565b60405161034a91906124c0565b60405180910390f35b61036d60048036038101906103689190612610565b610a5f565b005b610377610aa9565b604051610384919061222f565b60405180910390f35b6103a760048036038101906103a291906122f9565b610b3b565b6040516103b49190612354565b60405180910390f35b6103d760048036038101906103d291906122f9565b610c25565b6040516103e49190612354565b60405180910390f35b610407600480360381019061040291906126b9565b610c48565b604051610414919061281d565b60405180910390f35b61043760048036038101906104329190612897565b610e10565b005b610441610f5a565b60405161044e91906123ab565b60405180910390f35b61045f610f82565b60405161046c91906123ab565b60405180910390f35b61048f600480360381019061048a9190612939565b610fbc565b60405161049c91906123ab565b60405180910390f35b6104ad611043565b6040516104ba919061222f565b60405180910390f35b6060600580546104d2906129a8565b80601f01602080910402602001604051908101604052809291908181526020018280546104fe906129a8565b801561054b5780601f106105205761010080835404028352916020019161054b565b820191906000526020600020905b81548152906001019060200180831161052e57829003601f168201915b5050505050905090565b6000806105606110d1565b905061056d8185856110d9565b600191505092915050565b6105806112a4565b6105b6576040517f2d99739600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105bf816112e1565b50565b6000600454905090565b6000806105d76110d1565b90506105e48582856113a7565b6105ef858585611433565b60019150509392505050565b60006012905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561068057507f000000000000000000000000000000000000000000000000000000000000000046145b156106ad577f000000000000000000000000000000000000000000000000000000000000000090506106b8565b6106b56116b7565b90505b90565b6000806106c66110d1565b905061075a818585600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107559190612a09565b6110d9565b600191505092915050565b8061076f336108cb565b10156107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790612aab565b60405180910390fd5b6107ba338261173b565b50565b6107c5611914565b610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb90612b17565b60405180910390fd5b6000811415610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90612b83565b60405180910390fd5b806108516105c2565b61085b9190612a09565b7f000000000000000000000000000000000000000000000000000000000000000010156108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490612bef565b60405180910390fd5b6108c78282611951565b5050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61091c611ab2565b61095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290612c5b565b60405180910390fd5b80610965836108cb565b10156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90612aab565b60405180910390fd5b6000816109b38433610fbc565b6109bd9190612c7b565b90506109cb833360006110d9565b6109d68333836110d9565b6109e0838361173b565b505050565b6000610a2e600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aef565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a67611afd565b610a9d576040517f9f7f092500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa681611b3a565b50565b606060068054610ab8906129a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae4906129a8565b8015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b5050505050905090565b600080610b466110d1565b90506000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390612d21565b60405180910390fd5b610c1982868684036110d9565b60019250505092915050565b600080610c306110d1565b9050610c3d818585611433565b600191505092915050565b60608282905067ffffffffffffffff811115610c6757610c666124e5565b5b604051908082528060200260200182016040528015610c9a57816020015b6060815260200190600190039081610c855790505b5090506000610ca76110d1565b905060008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415905060005b85859050811015610e07578115610d6457610d4130878784818110610d0857610d07612d41565b5b9050602002810190610d1a9190612d7f565b86604051602001610d2d93929190612e5a565b604051602081830303815290604052611c1c565b848281518110610d5457610d53612d41565b5b6020026020010181905250610df4565b610dd530878784818110610d7b57610d7a612d41565b5b9050602002810190610d8d9190612d7f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c1c565b848281518110610de857610de7612d41565b5b60200260200101819052505b8080610dff90612e84565b915050610ce0565b50505092915050565b83421115610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612f19565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610e828c611c49565b89604051602001610e9896959493929190612f39565b6040516020818303038152906040528051906020012090506000610ec3610ebd610604565b83611ca7565b90506000610ed382878787611ce8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90612fe6565b60405180910390fd5b610f4e8a8a8a6110d9565b50505050505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6000610f8c6105c2565b7f0000000000000000000000000000000000000000000000000000000000000000610fb79190612c7b565b905090565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008054611050906129a8565b80601f016020809104026020016040519081016040528092919081815260200182805461107c906129a8565b80156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b505050505081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114090613078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b09061310a565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129791906123ab565b60405180910390a3505050565b60006112ae610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a35050565b60006113b38484610fbc565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461142d578181101561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613176565b60405180910390fd5b61142c84848484036110d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90613208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a9061329a565b60405180910390fd5b61151e838383611d13565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c9061332c565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163a9190612a09565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169e91906123ab565b60405180910390a36116b1848484611d18565b50505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6116e26104c3565b805190602001207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161172095949392919061334c565b60405160208183030381529060405280519060200120905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a290613411565b60405180910390fd5b6117b782600083611d13565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906134a3565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282546118969190612c7b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118fb91906123ab565b60405180910390a361190f83600084611d18565b505050565b600061191e610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b89061350f565b60405180910390fd5b6119cd60008383611d13565b80600460008282546119df9190612a09565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a359190612a09565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a9a91906123ab565b60405180910390a3611aae60008383611d18565b5050565b6000611abc610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600081600001549050919050565b6000611b07610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000808054611b48906129a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b74906129a8565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b505050505090508160009080519060200190611bde9291906120f3565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051611c1092919061352f565b60405180910390a15050565b6060611c4183836040518060600160405280602781526020016137f960279139611d1d565b905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611c9681611aef565b9150611ca181611da3565b50919050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000806000611cf987878787611db9565b91509150611d0681611e9c565b8192505050949350505050565b505050565b505050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611d479190613597565b600060405180830381855af49150503d8060008114611d82576040519150601f19603f3d011682016040523d82523d6000602084013e611d87565b606091505b5091509150611d988683838761200a565b925050509392505050565b6001816000016000828254019250508190555050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611df4576000600391509150611e93565b600060018787878760405160008152602001604052604051611e1994939291906135ae565b6020604051602081039080840390855afa158015611e3b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e8a57600060019250925050611e93565b80600092509250505b94509492505050565b60006004811115611eb057611eaf6135f3565b5b816004811115611ec357611ec26135f3565b5b1415611ece57612007565b60016004811115611ee257611ee16135f3565b5b816004811115611ef557611ef46135f3565b5b1415611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061366e565b60405180910390fd5b60026004811115611f4a57611f496135f3565b5b816004811115611f5d57611f5c6135f3565b5b1415611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f95906136da565b60405180910390fd5b60036004811115611fb257611fb16135f3565b5b816004811115611fc557611fc46135f3565b5b1415612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd9061376c565b60405180910390fd5b5b50565b6060831561206d576000835114156120655761202585612080565b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b906137d8565b60405180910390fd5b5b829050612078565b61207783836120a3565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156120b65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea919061222f565b60405180910390fd5b8280546120ff906129a8565b90600052602060002090601f0160209004810192826121215760008555612168565b82601f1061213a57805160ff1916838001178555612168565b82800160010185558215612168579182015b8281111561216757825182559160200191906001019061214c565b5b5090506121759190612179565b5090565b5b8082111561219257600081600090555060010161217a565b5090565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d05780820151818401526020810190506121b5565b838111156121df576000848401525b50505050565b6000601f19601f8301169050919050565b600061220182612196565b61220b81856121a1565b935061221b8185602086016121b2565b612224816121e5565b840191505092915050565b6000602082019050818103600083015261224981846121f6565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229082612265565b9050919050565b6122a081612285565b81146122ab57600080fd5b50565b6000813590506122bd81612297565b92915050565b6000819050919050565b6122d6816122c3565b81146122e157600080fd5b50565b6000813590506122f3816122cd565b92915050565b600080604083850312156123105761230f61225b565b5b600061231e858286016122ae565b925050602061232f858286016122e4565b9150509250929050565b60008115159050919050565b61234e81612339565b82525050565b60006020820190506123696000830184612345565b92915050565b6000602082840312156123855761238461225b565b5b6000612393848285016122ae565b91505092915050565b6123a5816122c3565b82525050565b60006020820190506123c0600083018461239c565b92915050565b6000806000606084860312156123df576123de61225b565b5b60006123ed868287016122ae565b93505060206123fe868287016122ae565b925050604061240f868287016122e4565b9150509250925092565b600060ff82169050919050565b61242f81612419565b82525050565b600060208201905061244a6000830184612426565b92915050565b6000819050919050565b61246381612450565b82525050565b600060208201905061247e600083018461245a565b92915050565b60006020828403121561249a5761249961225b565b5b60006124a8848285016122e4565b91505092915050565b6124ba81612285565b82525050565b60006020820190506124d560008301846124b1565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251d826121e5565b810181811067ffffffffffffffff8211171561253c5761253b6124e5565b5b80604052505050565b600061254f612251565b905061255b8282612514565b919050565b600067ffffffffffffffff82111561257b5761257a6124e5565b5b612584826121e5565b9050602081019050919050565b82818337600083830152505050565b60006125b36125ae84612560565b612545565b9050828152602081018484840111156125cf576125ce6124e0565b5b6125da848285612591565b509392505050565b600082601f8301126125f7576125f66124db565b5b81356126078482602086016125a0565b91505092915050565b6000602082840312156126265761262561225b565b5b600082013567ffffffffffffffff81111561264457612643612260565b5b612650848285016125e2565b91505092915050565b600080fd5b600080fd5b60008083601f840112612679576126786124db565b5b8235905067ffffffffffffffff81111561269657612695612659565b5b6020830191508360208202830111156126b2576126b161265e565b5b9250929050565b600080602083850312156126d0576126cf61225b565b5b600083013567ffffffffffffffff8111156126ee576126ed612260565b5b6126fa85828601612663565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061275982612732565b612763818561273d565b93506127738185602086016121b2565b61277c816121e5565b840191505092915050565b6000612793838361274e565b905092915050565b6000602082019050919050565b60006127b382612706565b6127bd8185612711565b9350836020820285016127cf85612722565b8060005b8581101561280b57848403895281516127ec8582612787565b94506127f78361279b565b925060208a019950506001810190506127d3565b50829750879550505050505092915050565b6000602082019050818103600083015261283781846127a8565b905092915050565b61284881612419565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b61287481612450565b811461287f57600080fd5b50565b6000813590506128918161286b565b92915050565b600080600080600080600060e0888a0312156128b6576128b561225b565b5b60006128c48a828b016122ae565b97505060206128d58a828b016122ae565b96505060406128e68a828b016122e4565b95505060606128f78a828b016122e4565b94505060806129088a828b01612856565b93505060a06129198a828b01612882565b92505060c061292a8a828b01612882565b91505092959891949750929550565b600080604083850312156129505761294f61225b565b5b600061295e858286016122ae565b925050602061296f858286016122ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129c057607f821691505b602082108114156129d4576129d3612979565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a14826122c3565b9150612a1f836122c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a5457612a536129da565b5b828201905092915050565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b6000612a956012836121a1565b9150612aa082612a5f565b602082019050919050565b60006020820190508181036000830152612ac481612a88565b9050919050565b7f4e6f7420617574686f72697a656420746f206d696e742e000000000000000000600082015250565b6000612b016017836121a1565b9150612b0c82612acb565b602082019050919050565b60006020820190508181036000830152612b3081612af4565b9050919050565b7f4d696e74696e67207a65726f20746f6b656e732e000000000000000000000000600082015250565b6000612b6d6014836121a1565b9150612b7882612b37565b602082019050919050565b60006020820190508181036000830152612b9c81612b60565b9050919050565b7f43616e6e6f7420657863656564206d617820737570706c790000000000000000600082015250565b6000612bd96018836121a1565b9150612be482612ba3565b602082019050919050565b60006020820190508181036000830152612c0881612bcc565b9050919050565b7f4e6f7420617574686f72697a656420746f206275726e2e000000000000000000600082015250565b6000612c456017836121a1565b9150612c5082612c0f565b602082019050919050565b60006020820190508181036000830152612c7481612c38565b9050919050565b6000612c86826122c3565b9150612c91836122c3565b925082821015612ca457612ca36129da565b5b828203905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612d0b6025836121a1565b9150612d1682612caf565b604082019050919050565b60006020820190508181036000830152612d3a81612cfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d9c57612d9b612d70565b5b80840192508235915067ffffffffffffffff821115612dbe57612dbd612d75565b5b602083019250600182023603831315612dda57612dd9612d7a565b5b509250929050565b600081905092915050565b6000612df98385612de2565b9350612e06838584612591565b82840190509392505050565b60008160601b9050919050565b6000612e2a82612e12565b9050919050565b6000612e3c82612e1f565b9050919050565b612e54612e4f82612285565b612e31565b82525050565b6000612e67828587612ded565b9150612e738284612e43565b601482019150819050949350505050565b6000612e8f826122c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ec257612ec16129da565b5b600182019050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612f03601d836121a1565b9150612f0e82612ecd565b602082019050919050565b60006020820190508181036000830152612f3281612ef6565b9050919050565b600060c082019050612f4e600083018961245a565b612f5b60208301886124b1565b612f6860408301876124b1565b612f75606083018661239c565b612f82608083018561239c565b612f8f60a083018461239c565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612fd0601e836121a1565b9150612fdb82612f9a565b602082019050919050565b60006020820190508181036000830152612fff81612fc3565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130626024836121a1565b915061306d82613006565b604082019050919050565b6000602082019050818103600083015261309181613055565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130f46022836121a1565b91506130ff82613098565b604082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613160601d836121a1565b915061316b8261312a565b602082019050919050565b6000602082019050818103600083015261318f81613153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131f26025836121a1565b91506131fd82613196565b604082019050919050565b60006020820190508181036000830152613221816131e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006132846023836121a1565b915061328f82613228565b604082019050919050565b600060208201905081810360008301526132b381613277565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006133166026836121a1565b9150613321826132ba565b604082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b600060a082019050613361600083018861245a565b61336e602083018761245a565b61337b604083018661245a565b613388606083018561239c565b61339560808301846124b1565b9695505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006133fb6021836121a1565b91506134068261339f565b604082019050919050565b6000602082019050818103600083015261342a816133ee565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061348d6022836121a1565b915061349882613431565b604082019050919050565b600060208201905081810360008301526134bc81613480565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006134f9601f836121a1565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b6000604082019050818103600083015261354981856121f6565b9050818103602083015261355d81846121f6565b90509392505050565b600061357182612732565b61357b8185612de2565b935061358b8185602086016121b2565b80840191505092915050565b60006135a38284613566565b915081905092915050565b60006080820190506135c3600083018761245a565b6135d06020830186612426565b6135dd604083018561245a565b6135ea606083018461245a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006136586018836121a1565b915061366382613622565b602082019050919050565b600060208201905081810360008301526136878161364b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006136c4601f836121a1565b91506136cf8261368e565b602082019050919050565b600060208201905081810360008301526136f3816136b7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006137566022836121a1565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006137c2601d836121a1565b91506137cd8261378c565b602082019050919050565b600060208201905081810360008301526137f1816137b5565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220eccc2c36efcd63d6f1dc32ac7c7359a5b92d630963416d3a65e0aac587c6158464736f6c63430008090033000000000000000000000000f3aa7ba9bd5d546100dd6d4d9875d7ce43a0de82000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000015b6a759f4835dc24000000000000000000000000000000000000000000000000000000000000000000000642616e616e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642414e414e4f0000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80637ecebe00116100c3578063ac9650d81161007c578063ac9650d8146103ed578063d505accf1461041d578063d5abeb0114610439578063da0239a614610457578063dd62ed3e14610475578063e8a3d485146104a557610158565b80637ecebe00146103055780638da5cb5b14610335578063938e3d7b1461035357806395d89b411461036f578063a457c2d71461038d578063a9059cbb146103bd57610158565b80633644e515116101155780633644e51514610233578063395093511461025157806342966c6814610281578063449a52f81461029d57806370a08231146102b957806379cc6790146102e957610158565b806306fdde031461015d578063095ea7b31461017b57806313af4035146101ab57806318160ddd146101c757806323b872dd146101e5578063313ce56714610215575b600080fd5b6101656104c3565b604051610172919061222f565b60405180910390f35b610195600480360381019061019091906122f9565b610555565b6040516101a29190612354565b60405180910390f35b6101c560048036038101906101c0919061236f565b610578565b005b6101cf6105c2565b6040516101dc91906123ab565b60405180910390f35b6101ff60048036038101906101fa91906123c6565b6105cc565b60405161020c9190612354565b60405180910390f35b61021d6105fb565b60405161022a9190612435565b60405180910390f35b61023b610604565b6040516102489190612469565b60405180910390f35b61026b600480360381019061026691906122f9565b6106bb565b6040516102789190612354565b60405180910390f35b61029b60048036038101906102969190612484565b610765565b005b6102b760048036038101906102b291906122f9565b6107bd565b005b6102d360048036038101906102ce919061236f565b6108cb565b6040516102e091906123ab565b60405180910390f35b61030360048036038101906102fe91906122f9565b610914565b005b61031f600480360381019061031a919061236f565b6109e5565b60405161032c91906123ab565b60405180910390f35b61033d610a35565b60405161034a91906124c0565b60405180910390f35b61036d60048036038101906103689190612610565b610a5f565b005b610377610aa9565b604051610384919061222f565b60405180910390f35b6103a760048036038101906103a291906122f9565b610b3b565b6040516103b49190612354565b60405180910390f35b6103d760048036038101906103d291906122f9565b610c25565b6040516103e49190612354565b60405180910390f35b610407600480360381019061040291906126b9565b610c48565b604051610414919061281d565b60405180910390f35b61043760048036038101906104329190612897565b610e10565b005b610441610f5a565b60405161044e91906123ab565b60405180910390f35b61045f610f82565b60405161046c91906123ab565b60405180910390f35b61048f600480360381019061048a9190612939565b610fbc565b60405161049c91906123ab565b60405180910390f35b6104ad611043565b6040516104ba919061222f565b60405180910390f35b6060600580546104d2906129a8565b80601f01602080910402602001604051908101604052809291908181526020018280546104fe906129a8565b801561054b5780601f106105205761010080835404028352916020019161054b565b820191906000526020600020905b81548152906001019060200180831161052e57829003601f168201915b5050505050905090565b6000806105606110d1565b905061056d8185856110d9565b600191505092915050565b6105806112a4565b6105b6576040517f2d99739600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105bf816112e1565b50565b6000600454905090565b6000806105d76110d1565b90506105e48582856113a7565b6105ef858585611433565b60019150509392505050565b60006012905090565b60007f000000000000000000000000d0130f4efcc837498130cb82a7d14c33eb4a30e673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561068057507f000000000000000000000000000000000000000000000000000000000000817346145b156106ad577fc6581d4f91d6124987c814154226a8db5e1f93b8fd3c441e344c36222f8b3cd390506106b8565b6106b56116b7565b90505b90565b6000806106c66110d1565b905061075a818585600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107559190612a09565b6110d9565b600191505092915050565b8061076f336108cb565b10156107b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a790612aab565b60405180910390fd5b6107ba338261173b565b50565b6107c5611914565b610804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fb90612b17565b60405180910390fd5b6000811415610848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083f90612b83565b60405180910390fd5b806108516105c2565b61085b9190612a09565b7f0000000000000000000000000000000000000000015b6a759f4835dc2400000010156108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490612bef565b60405180910390fd5b6108c78282611951565b5050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61091c611ab2565b61095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290612c5b565b60405180910390fd5b80610965836108cb565b10156109a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099d90612aab565b60405180910390fd5b6000816109b38433610fbc565b6109bd9190612c7b565b90506109cb833360006110d9565b6109d68333836110d9565b6109e0838361173b565b505050565b6000610a2e600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aef565b9050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a67611afd565b610a9d576040517f9f7f092500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa681611b3a565b50565b606060068054610ab8906129a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae4906129a8565b8015610b315780601f10610b0657610100808354040283529160200191610b31565b820191906000526020600020905b815481529060010190602001808311610b1457829003601f168201915b5050505050905090565b600080610b466110d1565b90506000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390612d21565b60405180910390fd5b610c1982868684036110d9565b60019250505092915050565b600080610c306110d1565b9050610c3d818585611433565b600191505092915050565b60608282905067ffffffffffffffff811115610c6757610c666124e5565b5b604051908082528060200260200182016040528015610c9a57816020015b6060815260200190600190039081610c855790505b5090506000610ca76110d1565b905060008173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415905060005b85859050811015610e07578115610d6457610d4130878784818110610d0857610d07612d41565b5b9050602002810190610d1a9190612d7f565b86604051602001610d2d93929190612e5a565b604051602081830303815290604052611c1c565b848281518110610d5457610d53612d41565b5b6020026020010181905250610df4565b610dd530878784818110610d7b57610d7a612d41565b5b9050602002810190610d8d9190612d7f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611c1c565b848281518110610de857610de7612d41565b5b60200260200101819052505b8080610dff90612e84565b915050610ce0565b50505092915050565b83421115610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90612f19565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e828c611c49565b89604051602001610e9896959493929190612f39565b6040516020818303038152906040528051906020012090506000610ec3610ebd610604565b83611ca7565b90506000610ed382878787611ce8565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90612fe6565b60405180910390fd5b610f4e8a8a8a6110d9565b50505050505050505050565b60007f0000000000000000000000000000000000000000015b6a759f4835dc24000000905090565b6000610f8c6105c2565b7f0000000000000000000000000000000000000000015b6a759f4835dc24000000610fb79190612c7b565b905090565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60008054611050906129a8565b80601f016020809104026020016040519081016040528092919081815260200182805461107c906129a8565b80156110c95780601f1061109e576101008083540402835291602001916110c9565b820191906000526020600020905b8154815290600101906020018083116110ac57829003601f168201915b505050505081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114090613078565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b09061310a565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129791906123ab565b60405180910390a3505050565b60006112ae610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a35050565b60006113b38484610fbc565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461142d578181101561141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613176565b60405180910390fd5b61142c84848484036110d9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90613208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150a9061329a565b60405180910390fd5b61151e838383611d13565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156115a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159c9061332c565b60405180910390fd5b818103600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163a9190612a09565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161169e91906123ab565b60405180910390a36116b1848484611d18565b50505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6116e26104c3565b805190602001207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6463060405160200161172095949392919061334c565b60405160208183030381529060405280519060200120905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a290613411565b60405180910390fd5b6117b782600083611d13565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906134a3565b60405180910390fd5b818103600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600460008282546118969190612c7b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118fb91906123ab565b60405180910390a361190f83600084611d18565b505050565b600061191e610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b89061350f565b60405180910390fd5b6119cd60008383611d13565b80600460008282546119df9190612a09565b9250508190555080600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a359190612a09565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a9a91906123ab565b60405180910390a3611aae60008383611d18565b5050565b6000611abc610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600081600001549050919050565b6000611b07610a35565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000808054611b48906129a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b74906129a8565b8015611bc15780601f10611b9657610100808354040283529160200191611bc1565b820191906000526020600020905b815481529060010190602001808311611ba457829003601f168201915b505050505090508160009080519060200190611bde9291906120f3565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051611c1092919061352f565b60405180910390a15050565b6060611c4183836040518060600160405280602781526020016137f960279139611d1d565b905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611c9681611aef565b9150611ca181611da3565b50919050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000806000611cf987878787611db9565b91509150611d0681611e9c565b8192505050949350505050565b505050565b505050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051611d479190613597565b600060405180830381855af49150503d8060008114611d82576040519150601f19603f3d011682016040523d82523d6000602084013e611d87565b606091505b5091509150611d988683838761200a565b925050509392505050565b6001816000016000828254019250508190555050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611df4576000600391509150611e93565b600060018787878760405160008152602001604052604051611e1994939291906135ae565b6020604051602081039080840390855afa158015611e3b573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e8a57600060019250925050611e93565b80600092509250505b94509492505050565b60006004811115611eb057611eaf6135f3565b5b816004811115611ec357611ec26135f3565b5b1415611ece57612007565b60016004811115611ee257611ee16135f3565b5b816004811115611ef557611ef46135f3565b5b1415611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d9061366e565b60405180910390fd5b60026004811115611f4a57611f496135f3565b5b816004811115611f5d57611f5c6135f3565b5b1415611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f95906136da565b60405180910390fd5b60036004811115611fb257611fb16135f3565b5b816004811115611fc557611fc46135f3565b5b1415612006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffd9061376c565b60405180910390fd5b5b50565b6060831561206d576000835114156120655761202585612080565b612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b906137d8565b60405180910390fd5b5b829050612078565b61207783836120a3565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156120b65781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ea919061222f565b60405180910390fd5b8280546120ff906129a8565b90600052602060002090601f0160209004810192826121215760008555612168565b82601f1061213a57805160ff1916838001178555612168565b82800160010185558215612168579182015b8281111561216757825182559160200191906001019061214c565b5b5090506121759190612179565b5090565b5b8082111561219257600081600090555060010161217a565b5090565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d05780820151818401526020810190506121b5565b838111156121df576000848401525b50505050565b6000601f19601f8301169050919050565b600061220182612196565b61220b81856121a1565b935061221b8185602086016121b2565b612224816121e5565b840191505092915050565b6000602082019050818103600083015261224981846121f6565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061229082612265565b9050919050565b6122a081612285565b81146122ab57600080fd5b50565b6000813590506122bd81612297565b92915050565b6000819050919050565b6122d6816122c3565b81146122e157600080fd5b50565b6000813590506122f3816122cd565b92915050565b600080604083850312156123105761230f61225b565b5b600061231e858286016122ae565b925050602061232f858286016122e4565b9150509250929050565b60008115159050919050565b61234e81612339565b82525050565b60006020820190506123696000830184612345565b92915050565b6000602082840312156123855761238461225b565b5b6000612393848285016122ae565b91505092915050565b6123a5816122c3565b82525050565b60006020820190506123c0600083018461239c565b92915050565b6000806000606084860312156123df576123de61225b565b5b60006123ed868287016122ae565b93505060206123fe868287016122ae565b925050604061240f868287016122e4565b9150509250925092565b600060ff82169050919050565b61242f81612419565b82525050565b600060208201905061244a6000830184612426565b92915050565b6000819050919050565b61246381612450565b82525050565b600060208201905061247e600083018461245a565b92915050565b60006020828403121561249a5761249961225b565b5b60006124a8848285016122e4565b91505092915050565b6124ba81612285565b82525050565b60006020820190506124d560008301846124b1565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61251d826121e5565b810181811067ffffffffffffffff8211171561253c5761253b6124e5565b5b80604052505050565b600061254f612251565b905061255b8282612514565b919050565b600067ffffffffffffffff82111561257b5761257a6124e5565b5b612584826121e5565b9050602081019050919050565b82818337600083830152505050565b60006125b36125ae84612560565b612545565b9050828152602081018484840111156125cf576125ce6124e0565b5b6125da848285612591565b509392505050565b600082601f8301126125f7576125f66124db565b5b81356126078482602086016125a0565b91505092915050565b6000602082840312156126265761262561225b565b5b600082013567ffffffffffffffff81111561264457612643612260565b5b612650848285016125e2565b91505092915050565b600080fd5b600080fd5b60008083601f840112612679576126786124db565b5b8235905067ffffffffffffffff81111561269657612695612659565b5b6020830191508360208202830111156126b2576126b161265e565b5b9250929050565b600080602083850312156126d0576126cf61225b565b5b600083013567ffffffffffffffff8111156126ee576126ed612260565b5b6126fa85828601612663565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b600061275982612732565b612763818561273d565b93506127738185602086016121b2565b61277c816121e5565b840191505092915050565b6000612793838361274e565b905092915050565b6000602082019050919050565b60006127b382612706565b6127bd8185612711565b9350836020820285016127cf85612722565b8060005b8581101561280b57848403895281516127ec8582612787565b94506127f78361279b565b925060208a019950506001810190506127d3565b50829750879550505050505092915050565b6000602082019050818103600083015261283781846127a8565b905092915050565b61284881612419565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b61287481612450565b811461287f57600080fd5b50565b6000813590506128918161286b565b92915050565b600080600080600080600060e0888a0312156128b6576128b561225b565b5b60006128c48a828b016122ae565b97505060206128d58a828b016122ae565b96505060406128e68a828b016122e4565b95505060606128f78a828b016122e4565b94505060806129088a828b01612856565b93505060a06129198a828b01612882565b92505060c061292a8a828b01612882565b91505092959891949750929550565b600080604083850312156129505761294f61225b565b5b600061295e858286016122ae565b925050602061296f858286016122ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129c057607f821691505b602082108114156129d4576129d3612979565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a14826122c3565b9150612a1f836122c3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a5457612a536129da565b5b828201905092915050565b7f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000600082015250565b6000612a956012836121a1565b9150612aa082612a5f565b602082019050919050565b60006020820190508181036000830152612ac481612a88565b9050919050565b7f4e6f7420617574686f72697a656420746f206d696e742e000000000000000000600082015250565b6000612b016017836121a1565b9150612b0c82612acb565b602082019050919050565b60006020820190508181036000830152612b3081612af4565b9050919050565b7f4d696e74696e67207a65726f20746f6b656e732e000000000000000000000000600082015250565b6000612b6d6014836121a1565b9150612b7882612b37565b602082019050919050565b60006020820190508181036000830152612b9c81612b60565b9050919050565b7f43616e6e6f7420657863656564206d617820737570706c790000000000000000600082015250565b6000612bd96018836121a1565b9150612be482612ba3565b602082019050919050565b60006020820190508181036000830152612c0881612bcc565b9050919050565b7f4e6f7420617574686f72697a656420746f206275726e2e000000000000000000600082015250565b6000612c456017836121a1565b9150612c5082612c0f565b602082019050919050565b60006020820190508181036000830152612c7481612c38565b9050919050565b6000612c86826122c3565b9150612c91836122c3565b925082821015612ca457612ca36129da565b5b828203905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612d0b6025836121a1565b9150612d1682612caf565b604082019050919050565b60006020820190508181036000830152612d3a81612cfe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612d9c57612d9b612d70565b5b80840192508235915067ffffffffffffffff821115612dbe57612dbd612d75565b5b602083019250600182023603831315612dda57612dd9612d7a565b5b509250929050565b600081905092915050565b6000612df98385612de2565b9350612e06838584612591565b82840190509392505050565b60008160601b9050919050565b6000612e2a82612e12565b9050919050565b6000612e3c82612e1f565b9050919050565b612e54612e4f82612285565b612e31565b82525050565b6000612e67828587612ded565b9150612e738284612e43565b601482019150819050949350505050565b6000612e8f826122c3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ec257612ec16129da565b5b600182019050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612f03601d836121a1565b9150612f0e82612ecd565b602082019050919050565b60006020820190508181036000830152612f3281612ef6565b9050919050565b600060c082019050612f4e600083018961245a565b612f5b60208301886124b1565b612f6860408301876124b1565b612f75606083018661239c565b612f82608083018561239c565b612f8f60a083018461239c565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612fd0601e836121a1565b9150612fdb82612f9a565b602082019050919050565b60006020820190508181036000830152612fff81612fc3565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130626024836121a1565b915061306d82613006565b604082019050919050565b6000602082019050818103600083015261309181613055565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006130f46022836121a1565b91506130ff82613098565b604082019050919050565b60006020820190508181036000830152613123816130e7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000613160601d836121a1565b915061316b8261312a565b602082019050919050565b6000602082019050818103600083015261318f81613153565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006131f26025836121a1565b91506131fd82613196565b604082019050919050565b60006020820190508181036000830152613221816131e5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006132846023836121a1565b915061328f82613228565b604082019050919050565b600060208201905081810360008301526132b381613277565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006133166026836121a1565b9150613321826132ba565b604082019050919050565b6000602082019050818103600083015261334581613309565b9050919050565b600060a082019050613361600083018861245a565b61336e602083018761245a565b61337b604083018661245a565b613388606083018561239c565b61339560808301846124b1565b9695505050505050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006133fb6021836121a1565b91506134068261339f565b604082019050919050565b6000602082019050818103600083015261342a816133ee565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061348d6022836121a1565b915061349882613431565b604082019050919050565b600060208201905081810360008301526134bc81613480565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006134f9601f836121a1565b9150613504826134c3565b602082019050919050565b60006020820190508181036000830152613528816134ec565b9050919050565b6000604082019050818103600083015261354981856121f6565b9050818103602083015261355d81846121f6565b90509392505050565b600061357182612732565b61357b8185612de2565b935061358b8185602086016121b2565b80840191505092915050565b60006135a38284613566565b915081905092915050565b60006080820190506135c3600083018761245a565b6135d06020830186612426565b6135dd604083018561245a565b6135ea606083018461245a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006136586018836121a1565b915061366382613622565b602082019050919050565b600060208201905081810360008301526136878161364b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006136c4601f836121a1565b91506136cf8261368e565b602082019050919050565b600060208201905081810360008301526136f3816136b7565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006137566022836121a1565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006137c2601d836121a1565b91506137cd8261378c565b602082019050919050565b600060208201905081810360008301526137f1816137b5565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220eccc2c36efcd63d6f1dc32ac7c7359a5b92d630963416d3a65e0aac587c6158464736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3aa7ba9bd5d546100dd6d4d9875d7ce43a0de82000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000015b6a759f4835dc24000000000000000000000000000000000000000000000000000000000000000000000642616e616e6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000642414e414e4f0000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _defaultAdmin (address): 0xF3Aa7bA9BD5d546100dD6D4d9875d7CE43A0de82
Arg [1] : _name (string): Banano
Arg [2] : _symbol (string): BANANO
Arg [3] : _maxTotalSupply (uint256): 420000000000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3aa7ba9bd5d546100dd6d4d9875d7ce43a0de82
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000015b6a759f4835dc24000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 42616e616e6f0000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 42414e414e4f0000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
67655:1944:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6743:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9094:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60429:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7863:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9875:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7705:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43016:278;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10545:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64504:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68851:315;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8034:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64977:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42758:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60159:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46129:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6962:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11288:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8367:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57549:579;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42022:670;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69259:111;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69461:135;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8623:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45681:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6743:100;6797:13;6830:5;6823:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6743:100;:::o;9094:201::-;9177:4;9194:13;9210:12;:10;:12::i;:::-;9194:28;;9233:32;9242:5;9249:7;9258:6;9233:8;:32::i;:::-;9283:4;9276:11;;;9094:201;;;;:::o;60429:182::-;60500:14;:12;:14::i;:::-;60495:76;;60538:21;;;;;;;;;;;;;;60495:76;60581:22;60593:9;60581:11;:22::i;:::-;60429:182;:::o;7863:108::-;7924:7;7951:12;;7944:19;;7863:108;:::o;9875:261::-;9972:4;9989:15;10007:12;:10;:12::i;:::-;9989:30;;10030:38;10046:4;10052:7;10061:6;10030:15;:38::i;:::-;10079:27;10089:4;10095:2;10099:6;10079:9;:27::i;:::-;10124:4;10117:11;;;9875:261;;;;;:::o;7705:93::-;7763:5;7788:2;7781:9;;7705:93;:::o;43016:278::-;43074:7;43115:12;43098:29;;43106:4;43098:29;;;:66;;;;;43148:16;43131:13;:33;43098:66;43094:193;;;43188:24;43181:31;;;;43094:193;43252:23;:21;:23::i;:::-;43245:30;;43016:278;;:::o;10545:240::-;10633:4;10650:13;10666:12;:10;:12::i;:::-;10650:28;;10689:66;10698:5;10705:7;10744:10;10714:11;:18;10726:5;10714:18;;;;;;;;;;;;;;;:27;10733:7;10714:27;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;10689:8;:66::i;:::-;10773:4;10766:11;;;10545:240;;;;:::o;64504:167::-;64596:7;64571:21;64581:10;64571:9;:21::i;:::-;:32;;64563:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;64637:26;64643:10;64655:7;64637:5;:26::i;:::-;64504:167;:::o;68851:315::-;68940:10;:8;:10::i;:::-;68932:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;69008:1;68997:7;:12;;68989:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;69091:7;69075:13;:11;:13::i;:::-;:23;;;;:::i;:::-;69053:17;:46;;69045:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;69139:19;69145:3;69150:7;69139:5;:19::i;:::-;68851:315;;:::o;8034:127::-;8108:7;8135:9;:18;8145:7;8135:18;;;;;;;;;;;;;;;;8128:25;;8034:127;;;:::o;64977:437::-;65075:10;:8;:10::i;:::-;65067:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;65155:7;65132:19;65142:8;65132:9;:19::i;:::-;:30;;65124:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65196:26;65259:7;65225:31;65235:8;65245:10;65225:9;:31::i;:::-;:41;;;;:::i;:::-;65196:70;;65277:33;65286:8;65296:10;65308:1;65277:8;:33::i;:::-;65321:50;65330:8;65340:10;65352:18;65321:8;:50::i;:::-;65382:24;65388:8;65398:7;65382:5;:24::i;:::-;65056:358;64977:437;;:::o;42758:128::-;42827:7;42854:24;:7;:14;42862:5;42854:14;;;;;;;;;;;;;;;:22;:24::i;:::-;42847:31;;42758:128;;;:::o;60159:88::-;60206:7;60233:6;;;;;;;;;;;60226:13;;60159:88;:::o;46129:207::-;46207:20;:18;:20::i;:::-;46202:91;;46251:30;;;;;;;;;;;;;;46202:91;46305:23;46323:4;46305:17;:23::i;:::-;46129:207;:::o;6962:104::-;7018:13;7051:7;7044:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6962:104;:::o;11288:438::-;11381:4;11398:13;11414:12;:10;:12::i;:::-;11398:28;;11437:24;11464:11;:18;11476:5;11464:18;;;;;;;;;;;;;;;:27;11483:7;11464:27;;;;;;;;;;;;;;;;11437:54;;11530:15;11510:16;:35;;11502:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;11623:60;11632:5;11639:7;11667:15;11648:16;:34;11623:8;:60::i;:::-;11714:4;11707:11;;;;11288:438;;;;:::o;8367:193::-;8446:4;8463:13;8479:12;:10;:12::i;:::-;8463:28;;8502;8512:5;8519:2;8523:6;8502:9;:28::i;:::-;8548:4;8541:11;;;8367:193;;;;:::o;57549:579::-;57609:22;57666:4;;:11;;57654:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57644:34;;57689:14;57706:12;:10;:12::i;:::-;57689:29;;57729:16;57762:6;57748:20;;:10;:20;;;;57729:39;;57784:9;57779:317;57803:4;;:11;;57799:1;:15;57779:317;;;57840:11;57836:249;;;57885:78;57922:4;57946;;57951:1;57946:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;57955:6;57929:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57885:28;:78::i;:::-;57872:7;57880:1;57872:10;;;;;;;;:::i;:::-;;;;;;;:91;;;;57836:249;;;58017:52;58054:4;58061;;58066:1;58061:7;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;58017:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:28;:52::i;:::-;58004:7;58012:1;58004:10;;;;;;;;:::i;:::-;;;;;;;:65;;;;57836:249;57816:3;;;;;:::i;:::-;;;;57779:317;;;;58106:14;;57549:579;;;;:::o;42022:670::-;42266:8;42247:15;:27;;42239:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42321:18;42363:16;42381:5;42388:7;42397:5;42404:16;42414:5;42404:9;:16::i;:::-;42422:8;42352:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42342:90;;;;;;42321:111;;42445:12;42460:53;42482:18;:16;:18::i;:::-;42502:10;42460:21;:53::i;:::-;42445:68;;42526:14;42543:28;42557:4;42563:1;42566;42569;42543:13;:28::i;:::-;42526:45;;42600:5;42590:15;;:6;:15;;;42582:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42653:31;42662:5;42669:7;42678:5;42653:8;:31::i;:::-;42228:464;;;42022:670;;;;;;;:::o;69259:111::-;69318:7;69345:17;69338:24;;69259:111;:::o;69461:135::-;69526:7;69574:13;:11;:13::i;:::-;69554:17;:33;;;;:::i;:::-;69546:42;;69461:135;:::o;8623:151::-;8712:7;8739:11;:18;8751:5;8739:18;;;;;;;;;;;;;;;:27;8758:7;8739:27;;;;;;;;;;;;;;;;8732:34;;8623:151;;;;:::o;45681:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66507:119::-;66581:7;66608:10;66601:17;;66507:119;:::o;14890:346::-;15009:1;14992:19;;:5;:19;;;;14984:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15090:1;15071:21;;:7;:21;;;;15063:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15174:6;15144:11;:18;15156:5;15144:18;;;;;;;;;;;;;;;:27;15163:7;15144:27;;;;;;;;;;;;;;;:36;;;;15212:7;15196:32;;15205:5;15196:32;;;15221:6;15196:32;;;;;;:::i;:::-;;;;;;;;14890:346;;;:::o;66314:117::-;66378:4;66416:7;:5;:7::i;:::-;66402:21;;:10;:21;;;66395:28;;66314:117;:::o;60729:177::-;60789:18;60810:6;;;;;;;;;;;60789:27;;60836:9;60827:6;;:18;;;;;;;;;;;;;;;;;;60888:9;60863:35;;60876:10;60863:35;;;;;;;;;;;;60778:128;60729:177;:::o;15523:419::-;15624:24;15651:25;15661:5;15668:7;15651:9;:25::i;:::-;15624:52;;15711:17;15691:16;:37;15687:248;;15773:6;15753:16;:26;;15745:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15857:51;15866:5;15873:7;15901:6;15882:16;:25;15857:8;:51::i;:::-;15687:248;15613:329;15523:419;;;:::o;12205:637::-;12318:1;12302:18;;:4;:18;;;;12294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12395:1;12381:16;;:2;:16;;;;12373:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;12450:38;12471:4;12477:2;12481:6;12450:20;:38::i;:::-;12501:19;12523:9;:15;12533:4;12523:15;;;;;;;;;;;;;;;;12501:37;;12572:6;12557:11;:21;;12549:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;12689:6;12675:11;:20;12657:9;:15;12667:4;12657:15;;;;;;;;;;;;;;;:38;;;;12734:6;12717:9;:13;12727:2;12717:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;12773:2;12758:26;;12767:4;12758:26;;;12777:6;12758:26;;;;;;:::i;:::-;;;;;;;;12797:37;12817:4;12823:2;12827:6;12797:19;:37::i;:::-;12283:559;12205:637;;;:::o;43302:449::-;43357:7;43458:95;43592:6;:4;:6::i;:::-;43576:24;;;;;;43623:14;43660:13;43704:4;43425:303;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43397:346;;;;;;43377:366;;43302:449;:::o;13861:591::-;13964:1;13945:21;;:7;:21;;;;13937:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;14017:49;14038:7;14055:1;14059:6;14017:20;:49::i;:::-;14079:22;14104:9;:18;14114:7;14104:18;;;;;;;;;;;;;;;;14079:43;;14159:6;14141:14;:24;;14133:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14278:6;14261:14;:23;14240:9;:18;14250:7;14240:18;;;;;;;;;;;;;;;:44;;;;14322:6;14306:12;;:22;;;;;;;:::i;:::-;;;;;;;;14372:1;14346:37;;14355:7;14346:37;;;14376:6;14346:37;;;;;;:::i;:::-;;;;;;;;14396:48;14416:7;14433:1;14437:6;14396:19;:48::i;:::-;13926:526;13861:591;;:::o;65928:104::-;65979:4;66017:7;:5;:7::i;:::-;66003:21;;:10;:21;;;65996:28;;65928:104;:::o;13129:399::-;13232:1;13213:21;;:7;:21;;;;13205:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:49;13312:1;13316:7;13325:6;13283:20;:49::i;:::-;13361:6;13345:12;;:22;;;;;;;:::i;:::-;;;;;;;;13400:6;13378:9;:18;13388:7;13378:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;13443:7;13422:37;;13439:1;13422:37;;;13452:6;13422:37;;;;;;:::i;:::-;;;;;;;;13472:48;13500:1;13504:7;13513:6;13472:19;:48::i;:::-;13129:399;;:::o;66123:104::-;66174:4;66212:7;:5;:7::i;:::-;66198:21;;:10;:21;;;66191:28;;66123:104;:::o;39460:114::-;39525:7;39552;:14;;;39545:21;;39460:114;;;:::o;65714:123::-;65784:4;65822:7;:5;:7::i;:::-;65808:21;;:10;:21;;;65801:28;;65714:123;:::o;46421:190::-;46488:21;46512:11;46488:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46548:4;46534:11;:18;;;;;;;;;;;;:::i;:::-;;46570:33;46589:7;46598:4;46570:33;;;;;;;:::i;:::-;;;;;;;;46477:134;46421:190;:::o;53638:200::-;53721:12;53753:77;53774:6;53782:4;53753:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;53746:84;;53638:200;;;;:::o;43889:207::-;43949:15;43977:30;44010:7;:14;44018:5;44010:14;;;;;;;;;;;;;;;43977:47;;44045:15;:5;:13;:15::i;:::-;44035:25;;44071:17;:5;:15;:17::i;:::-;43966:130;43889:207;;;:::o;33091:406::-;33184:12;33294:4;33288:11;33325:10;33320:3;33313:23;33373:15;33366:4;33361:3;33357:14;33350:39;33426:10;33419:4;33414:3;33410:14;33403:34;33474:4;33469:3;33459:20;33451:28;;33262:228;33091:406;;;;:::o;31307:236::-;31392:7;31413:17;31432:18;31454:25;31465:4;31471:1;31474;31477;31454:10;:25::i;:::-;31412:67;;;;31490:18;31502:5;31490:11;:18::i;:::-;31526:9;31519:16;;;;31307:236;;;;;;:::o;16542:91::-;;;;:::o;17237:90::-;;;;:::o;54032:332::-;54177:12;54203;54217:23;54244:6;:19;;54264:4;54244:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54202:67;;;;54287:69;54314:6;54322:7;54331:10;54343:12;54287:26;:69::i;:::-;54280:76;;;;54032:332;;;;;:::o;39582:127::-;39689:1;39671:7;:14;;;:19;;;;;;;;;;;39582:127;:::o;29691:1477::-;29779:7;29788:12;30713:66;30708:1;30700:10;;:79;30696:163;;;30812:1;30816:30;30796:51;;;;;;30696:163;30956:14;30973:24;30983:4;30989:1;30992;30995;30973:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30956:41;;31030:1;31012:20;;:6;:20;;;31008:103;;;31065:1;31069:29;31049:50;;;;;;;31008:103;31131:6;31139:20;31123:37;;;;;29691:1477;;;;;;;;:::o;25151:521::-;25229:20;25220:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;25216:449;;;25266:7;;25216:449;25327:29;25318:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;25314:351;;;25373:34;;;;;;;;;;:::i;:::-;;;;;;;;25314:351;25438:35;25429:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;25425:240;;;25490:41;;;;;;;;;;:::i;:::-;;;;;;;;25425:240;25562:30;25553:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;25549:116;;;25609:44;;;;;;;;;;:::i;:::-;;;;;;;;25549:116;25151:521;;:::o;54660:644::-;54845:12;54874:7;54870:427;;;54923:1;54902:10;:17;:22;54898:290;;;55120:18;55131:6;55120:10;:18::i;:::-;55112:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54898:290;55209:10;55202:17;;;;54870:427;55252:33;55260:10;55272:12;55252:7;:33::i;:::-;54660:644;;;;;;;:::o;48242:326::-;48302:4;48559:1;48537:7;:19;;;:23;48530:30;;48242:326;;;:::o;55846:552::-;56027:1;56007:10;:17;:21;56003:388;;;56239:10;56233:17;56296:15;56283:10;56279:2;56275:19;56268:44;56003:388;56366:12;56359:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1397:75::-;1430:6;1463:2;1457:9;1447:19;;1397:75;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:329::-;3553:6;3602:2;3590:9;3581:7;3577:23;3573:32;3570:119;;;3608:79;;:::i;:::-;3570:119;3728:1;3753:53;3798:7;3789:6;3778:9;3774:22;3753:53;:::i;:::-;3743:63;;3699:117;3494:329;;;;:::o;3829:118::-;3916:24;3934:5;3916:24;:::i;:::-;3911:3;3904:37;3829:118;;:::o;3953:222::-;4046:4;4084:2;4073:9;4069:18;4061:26;;4097:71;4165:1;4154:9;4150:17;4141:6;4097:71;:::i;:::-;3953:222;;;;:::o;4181:619::-;4258:6;4266;4274;4323:2;4311:9;4302:7;4298:23;4294:32;4291:119;;;4329:79;;:::i;:::-;4291:119;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4704:2;4730:53;4775:7;4766:6;4755:9;4751:22;4730:53;:::i;:::-;4720:63;;4675:118;4181:619;;;;;:::o;4806:86::-;4841:7;4881:4;4874:5;4870:16;4859:27;;4806:86;;;:::o;4898:112::-;4981:22;4997:5;4981:22;:::i;:::-;4976:3;4969:35;4898:112;;:::o;5016:214::-;5105:4;5143:2;5132:9;5128:18;5120:26;;5156:67;5220:1;5209:9;5205:17;5196:6;5156:67;:::i;:::-;5016:214;;;;:::o;5236:77::-;5273:7;5302:5;5291:16;;5236:77;;;:::o;5319:118::-;5406:24;5424:5;5406:24;:::i;:::-;5401:3;5394:37;5319:118;;:::o;5443:222::-;5536:4;5574:2;5563:9;5559:18;5551:26;;5587:71;5655:1;5644:9;5640:17;5631:6;5587:71;:::i;:::-;5443:222;;;;:::o;5671:329::-;5730:6;5779:2;5767:9;5758:7;5754:23;5750:32;5747:119;;;5785:79;;:::i;:::-;5747:119;5905:1;5930:53;5975:7;5966:6;5955:9;5951:22;5930:53;:::i;:::-;5920:63;;5876:117;5671:329;;;;:::o;6006:118::-;6093:24;6111:5;6093:24;:::i;:::-;6088:3;6081:37;6006:118;;:::o;6130:222::-;6223:4;6261:2;6250:9;6246:18;6238:26;;6274:71;6342:1;6331:9;6327:17;6318:6;6274:71;:::i;:::-;6130:222;;;;:::o;6358:117::-;6467:1;6464;6457:12;6481:117;6590:1;6587;6580:12;6604:180;6652:77;6649:1;6642:88;6749:4;6746:1;6739:15;6773:4;6770:1;6763:15;6790:281;6873:27;6895:4;6873:27;:::i;:::-;6865:6;6861:40;7003:6;6991:10;6988:22;6967:18;6955:10;6952:34;6949:62;6946:88;;;7014:18;;:::i;:::-;6946:88;7054:10;7050:2;7043:22;6833:238;6790:281;;:::o;7077:129::-;7111:6;7138:20;;:::i;:::-;7128:30;;7167:33;7195:4;7187:6;7167:33;:::i;:::-;7077:129;;;:::o;7212:308::-;7274:4;7364:18;7356:6;7353:30;7350:56;;;7386:18;;:::i;:::-;7350:56;7424:29;7446:6;7424:29;:::i;:::-;7416:37;;7508:4;7502;7498:15;7490:23;;7212:308;;;:::o;7526:154::-;7610:6;7605:3;7600;7587:30;7672:1;7663:6;7658:3;7654:16;7647:27;7526:154;;;:::o;7686:412::-;7764:5;7789:66;7805:49;7847:6;7805:49;:::i;:::-;7789:66;:::i;:::-;7780:75;;7878:6;7871:5;7864:21;7916:4;7909:5;7905:16;7954:3;7945:6;7940:3;7936:16;7933:25;7930:112;;;7961:79;;:::i;:::-;7930:112;8051:41;8085:6;8080:3;8075;8051:41;:::i;:::-;7770:328;7686:412;;;;;:::o;8118:340::-;8174:5;8223:3;8216:4;8208:6;8204:17;8200:27;8190:122;;8231:79;;:::i;:::-;8190:122;8348:6;8335:20;8373:79;8448:3;8440:6;8433:4;8425:6;8421:17;8373:79;:::i;:::-;8364:88;;8180:278;8118:340;;;;:::o;8464:509::-;8533:6;8582:2;8570:9;8561:7;8557:23;8553:32;8550:119;;;8588:79;;:::i;:::-;8550:119;8736:1;8725:9;8721:17;8708:31;8766:18;8758:6;8755:30;8752:117;;;8788:79;;:::i;:::-;8752:117;8893:63;8948:7;8939:6;8928:9;8924:22;8893:63;:::i;:::-;8883:73;;8679:287;8464:509;;;;:::o;8979:117::-;9088:1;9085;9078:12;9102:117;9211:1;9208;9201:12;9240:579;9324:8;9334:6;9384:3;9377:4;9369:6;9365:17;9361:27;9351:122;;9392:79;;:::i;:::-;9351:122;9505:6;9492:20;9482:30;;9535:18;9527:6;9524:30;9521:117;;;9557:79;;:::i;:::-;9521:117;9671:4;9663:6;9659:17;9647:29;;9725:3;9717:4;9709:6;9705:17;9695:8;9691:32;9688:41;9685:128;;;9732:79;;:::i;:::-;9685:128;9240:579;;;;;:::o;9825:581::-;9922:6;9930;9979:2;9967:9;9958:7;9954:23;9950:32;9947:119;;;9985:79;;:::i;:::-;9947:119;10133:1;10122:9;10118:17;10105:31;10163:18;10155:6;10152:30;10149:117;;;10185:79;;:::i;:::-;10149:117;10298:91;10381:7;10372:6;10361:9;10357:22;10298:91;:::i;:::-;10280:109;;;;10076:323;9825:581;;;;;:::o;10412:123::-;10488:6;10522:5;10516:12;10506:22;;10412:123;;;:::o;10541:193::-;10649:11;10683:6;10678:3;10671:19;10723:4;10718:3;10714:14;10699:29;;10541:193;;;;:::o;10740:141::-;10816:4;10839:3;10831:11;;10869:4;10864:3;10860:14;10852:22;;10740:141;;;:::o;10887:98::-;10938:6;10972:5;10966:12;10956:22;;10887:98;;;:::o;10991:158::-;11064:11;11098:6;11093:3;11086:19;11138:4;11133:3;11129:14;11114:29;;10991:158;;;;:::o;11155:340::-;11231:3;11259:38;11291:5;11259:38;:::i;:::-;11313:60;11366:6;11361:3;11313:60;:::i;:::-;11306:67;;11382:52;11427:6;11422:3;11415:4;11408:5;11404:16;11382:52;:::i;:::-;11459:29;11481:6;11459:29;:::i;:::-;11454:3;11450:39;11443:46;;11235:260;11155:340;;;;:::o;11501:192::-;11588:10;11623:64;11683:3;11675:6;11623:64;:::i;:::-;11609:78;;11501:192;;;;:::o;11699:122::-;11778:4;11810;11805:3;11801:14;11793:22;;11699:122;;;:::o;11853:983::-;11990:3;12019:63;12076:5;12019:63;:::i;:::-;12098:95;12186:6;12181:3;12098:95;:::i;:::-;12091:102;;12219:3;12264:4;12256:6;12252:17;12247:3;12243:27;12294:65;12353:5;12294:65;:::i;:::-;12382:7;12413:1;12398:393;12423:6;12420:1;12417:13;12398:393;;;12494:9;12488:4;12484:20;12479:3;12472:33;12545:6;12539:13;12573:82;12650:4;12635:13;12573:82;:::i;:::-;12565:90;;12678:69;12740:6;12678:69;:::i;:::-;12668:79;;12776:4;12771:3;12767:14;12760:21;;12458:333;12445:1;12442;12438:9;12433:14;;12398:393;;;12402:14;12807:4;12800:11;;12827:3;12820:10;;11995:841;;;;;11853:983;;;;:::o;12842:409::-;13003:4;13041:2;13030:9;13026:18;13018:26;;13090:9;13084:4;13080:20;13076:1;13065:9;13061:17;13054:47;13118:126;13239:4;13230:6;13118:126;:::i;:::-;13110:134;;12842:409;;;;:::o;13257:118::-;13328:22;13344:5;13328:22;:::i;:::-;13321:5;13318:33;13308:61;;13365:1;13362;13355:12;13308:61;13257:118;:::o;13381:135::-;13425:5;13463:6;13450:20;13441:29;;13479:31;13504:5;13479:31;:::i;:::-;13381:135;;;;:::o;13522:122::-;13595:24;13613:5;13595:24;:::i;:::-;13588:5;13585:35;13575:63;;13634:1;13631;13624:12;13575:63;13522:122;:::o;13650:139::-;13696:5;13734:6;13721:20;13712:29;;13750:33;13777:5;13750:33;:::i;:::-;13650:139;;;;:::o;13795:1199::-;13906:6;13914;13922;13930;13938;13946;13954;14003:3;13991:9;13982:7;13978:23;13974:33;13971:120;;;14010:79;;:::i;:::-;13971:120;14130:1;14155:53;14200:7;14191:6;14180:9;14176:22;14155:53;:::i;:::-;14145:63;;14101:117;14257:2;14283:53;14328:7;14319:6;14308:9;14304:22;14283:53;:::i;:::-;14273:63;;14228:118;14385:2;14411:53;14456:7;14447:6;14436:9;14432:22;14411:53;:::i;:::-;14401:63;;14356:118;14513:2;14539:53;14584:7;14575:6;14564:9;14560:22;14539:53;:::i;:::-;14529:63;;14484:118;14641:3;14668:51;14711:7;14702:6;14691:9;14687:22;14668:51;:::i;:::-;14658:61;;14612:117;14768:3;14795:53;14840:7;14831:6;14820:9;14816:22;14795:53;:::i;:::-;14785:63;;14739:119;14897:3;14924:53;14969:7;14960:6;14949:9;14945:22;14924:53;:::i;:::-;14914:63;;14868:119;13795:1199;;;;;;;;;;:::o;15000:474::-;15068:6;15076;15125:2;15113:9;15104:7;15100:23;15096:32;15093:119;;;15131:79;;:::i;:::-;15093:119;15251:1;15276:53;15321:7;15312:6;15301:9;15297:22;15276:53;:::i;:::-;15266:63;;15222:117;15378:2;15404:53;15449:7;15440:6;15429:9;15425:22;15404:53;:::i;:::-;15394:63;;15349:118;15000:474;;;;;:::o;15480:180::-;15528:77;15525:1;15518:88;15625:4;15622:1;15615:15;15649:4;15646:1;15639:15;15666:320;15710:6;15747:1;15741:4;15737:12;15727:22;;15794:1;15788:4;15784:12;15815:18;15805:81;;15871:4;15863:6;15859:17;15849:27;;15805:81;15933:2;15925:6;15922:14;15902:18;15899:38;15896:84;;;15952:18;;:::i;:::-;15896:84;15717:269;15666:320;;;:::o;15992:180::-;16040:77;16037:1;16030:88;16137:4;16134:1;16127:15;16161:4;16158:1;16151:15;16178:305;16218:3;16237:20;16255:1;16237:20;:::i;:::-;16232:25;;16271:20;16289:1;16271:20;:::i;:::-;16266:25;;16425:1;16357:66;16353:74;16350:1;16347:81;16344:107;;;16431:18;;:::i;:::-;16344:107;16475:1;16472;16468:9;16461:16;;16178:305;;;;:::o;16489:168::-;16629:20;16625:1;16617:6;16613:14;16606:44;16489:168;:::o;16663:366::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:419::-;17201:4;17239:2;17228:9;17224:18;17216:26;;17288:9;17282:4;17278:20;17274:1;17263:9;17259:17;17252:47;17316:131;17442:4;17316:131;:::i;:::-;17308:139;;17035:419;;;:::o;17460:173::-;17600:25;17596:1;17588:6;17584:14;17577:49;17460:173;:::o;17639:366::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:419::-;18177:4;18215:2;18204:9;18200:18;18192:26;;18264:9;18258:4;18254:20;18250:1;18239:9;18235:17;18228:47;18292:131;18418:4;18292:131;:::i;:::-;18284:139;;18011:419;;;:::o;18436:170::-;18576:22;18572:1;18564:6;18560:14;18553:46;18436:170;:::o;18612:366::-;18754:3;18775:67;18839:2;18834:3;18775:67;:::i;:::-;18768:74;;18851:93;18940:3;18851:93;:::i;:::-;18969:2;18964:3;18960:12;18953:19;;18612:366;;;:::o;18984:419::-;19150:4;19188:2;19177:9;19173:18;19165:26;;19237:9;19231:4;19227:20;19223:1;19212:9;19208:17;19201:47;19265:131;19391:4;19265:131;:::i;:::-;19257:139;;18984:419;;;:::o;19409:174::-;19549:26;19545:1;19537:6;19533:14;19526:50;19409:174;:::o;19589:366::-;19731:3;19752:67;19816:2;19811:3;19752:67;:::i;:::-;19745:74;;19828:93;19917:3;19828:93;:::i;:::-;19946:2;19941:3;19937:12;19930:19;;19589:366;;;:::o;19961:419::-;20127:4;20165:2;20154:9;20150:18;20142:26;;20214:9;20208:4;20204:20;20200:1;20189:9;20185:17;20178:47;20242:131;20368:4;20242:131;:::i;:::-;20234:139;;19961:419;;;:::o;20386:173::-;20526:25;20522:1;20514:6;20510:14;20503:49;20386:173;:::o;20565:366::-;20707:3;20728:67;20792:2;20787:3;20728:67;:::i;:::-;20721:74;;20804:93;20893:3;20804:93;:::i;:::-;20922:2;20917:3;20913:12;20906:19;;20565:366;;;:::o;20937:419::-;21103:4;21141:2;21130:9;21126:18;21118:26;;21190:9;21184:4;21180:20;21176:1;21165:9;21161:17;21154:47;21218:131;21344:4;21218:131;:::i;:::-;21210:139;;20937:419;;;:::o;21362:191::-;21402:4;21422:20;21440:1;21422:20;:::i;:::-;21417:25;;21456:20;21474:1;21456:20;:::i;:::-;21451:25;;21495:1;21492;21489:8;21486:34;;;21500:18;;:::i;:::-;21486:34;21545:1;21542;21538:9;21530:17;;21362:191;;;;:::o;21559:224::-;21699:34;21695:1;21687:6;21683:14;21676:58;21768:7;21763:2;21755:6;21751:15;21744:32;21559:224;:::o;21789:366::-;21931:3;21952:67;22016:2;22011:3;21952:67;:::i;:::-;21945:74;;22028:93;22117:3;22028:93;:::i;:::-;22146:2;22141:3;22137:12;22130:19;;21789:366;;;:::o;22161:419::-;22327:4;22365:2;22354:9;22350:18;22342:26;;22414:9;22408:4;22404:20;22400:1;22389:9;22385:17;22378:47;22442:131;22568:4;22442:131;:::i;:::-;22434:139;;22161:419;;;:::o;22586:180::-;22634:77;22631:1;22624:88;22731:4;22728:1;22721:15;22755:4;22752:1;22745:15;22772:117;22881:1;22878;22871:12;22895:117;23004:1;23001;22994:12;23018:117;23127:1;23124;23117:12;23141:724;23218:4;23224:6;23280:11;23267:25;23380:1;23374:4;23370:12;23359:8;23343:14;23339:29;23335:48;23315:18;23311:73;23301:168;;23388:79;;:::i;:::-;23301:168;23500:18;23490:8;23486:33;23478:41;;23552:4;23539:18;23529:28;;23580:18;23572:6;23569:30;23566:117;;;23602:79;;:::i;:::-;23566:117;23710:2;23704:4;23700:13;23692:21;;23767:4;23759:6;23755:17;23739:14;23735:38;23729:4;23725:49;23722:136;;;23777:79;;:::i;:::-;23722:136;23231:634;23141:724;;;;;:::o;23871:147::-;23972:11;24009:3;23994:18;;23871:147;;;;:::o;24046:314::-;24160:3;24181:88;24262:6;24257:3;24181:88;:::i;:::-;24174:95;;24279:43;24315:6;24310:3;24303:5;24279:43;:::i;:::-;24347:6;24342:3;24338:16;24331:23;;24046:314;;;;;:::o;24366:94::-;24399:8;24447:5;24443:2;24439:14;24418:35;;24366:94;;;:::o;24466:::-;24505:7;24534:20;24548:5;24534:20;:::i;:::-;24523:31;;24466:94;;;:::o;24566:100::-;24605:7;24634:26;24654:5;24634:26;:::i;:::-;24623:37;;24566:100;;;:::o;24672:157::-;24777:45;24797:24;24815:5;24797:24;:::i;:::-;24777:45;:::i;:::-;24772:3;24765:58;24672:157;;:::o;24835:432::-;25003:3;25025:103;25124:3;25115:6;25107;25025:103;:::i;:::-;25018:110;;25138:75;25209:3;25200:6;25138:75;:::i;:::-;25238:2;25233:3;25229:12;25222:19;;25258:3;25251:10;;24835:432;;;;;;:::o;25273:233::-;25312:3;25335:24;25353:5;25335:24;:::i;:::-;25326:33;;25381:66;25374:5;25371:77;25368:103;;;25451:18;;:::i;:::-;25368:103;25498:1;25491:5;25487:13;25480:20;;25273:233;;;:::o;25512:179::-;25652:31;25648:1;25640:6;25636:14;25629:55;25512:179;:::o;25697:366::-;25839:3;25860:67;25924:2;25919:3;25860:67;:::i;:::-;25853:74;;25936:93;26025:3;25936:93;:::i;:::-;26054:2;26049:3;26045:12;26038:19;;25697:366;;;:::o;26069:419::-;26235:4;26273:2;26262:9;26258:18;26250:26;;26322:9;26316:4;26312:20;26308:1;26297:9;26293:17;26286:47;26350:131;26476:4;26350:131;:::i;:::-;26342:139;;26069:419;;;:::o;26494:775::-;26727:4;26765:3;26754:9;26750:19;26742:27;;26779:71;26847:1;26836:9;26832:17;26823:6;26779:71;:::i;:::-;26860:72;26928:2;26917:9;26913:18;26904:6;26860:72;:::i;:::-;26942;27010:2;26999:9;26995:18;26986:6;26942:72;:::i;:::-;27024;27092:2;27081:9;27077:18;27068:6;27024:72;:::i;:::-;27106:73;27174:3;27163:9;27159:19;27150:6;27106:73;:::i;:::-;27189;27257:3;27246:9;27242:19;27233:6;27189:73;:::i;:::-;26494:775;;;;;;;;;:::o;27275:180::-;27415:32;27411:1;27403:6;27399:14;27392:56;27275:180;:::o;27461:366::-;27603:3;27624:67;27688:2;27683:3;27624:67;:::i;:::-;27617:74;;27700:93;27789:3;27700:93;:::i;:::-;27818:2;27813:3;27809:12;27802:19;;27461:366;;;:::o;27833:419::-;27999:4;28037:2;28026:9;28022:18;28014:26;;28086:9;28080:4;28076:20;28072:1;28061:9;28057:17;28050:47;28114:131;28240:4;28114:131;:::i;:::-;28106:139;;27833:419;;;:::o;28258:223::-;28398:34;28394:1;28386:6;28382:14;28375:58;28467:6;28462:2;28454:6;28450:15;28443:31;28258:223;:::o;28487:366::-;28629:3;28650:67;28714:2;28709:3;28650:67;:::i;:::-;28643:74;;28726:93;28815:3;28726:93;:::i;:::-;28844:2;28839:3;28835:12;28828:19;;28487:366;;;:::o;28859:419::-;29025:4;29063:2;29052:9;29048:18;29040:26;;29112:9;29106:4;29102:20;29098:1;29087:9;29083:17;29076:47;29140:131;29266:4;29140:131;:::i;:::-;29132:139;;28859:419;;;:::o;29284:221::-;29424:34;29420:1;29412:6;29408:14;29401:58;29493:4;29488:2;29480:6;29476:15;29469:29;29284:221;:::o;29511:366::-;29653:3;29674:67;29738:2;29733:3;29674:67;:::i;:::-;29667:74;;29750:93;29839:3;29750:93;:::i;:::-;29868:2;29863:3;29859:12;29852:19;;29511:366;;;:::o;29883:419::-;30049:4;30087:2;30076:9;30072:18;30064:26;;30136:9;30130:4;30126:20;30122:1;30111:9;30107:17;30100:47;30164:131;30290:4;30164:131;:::i;:::-;30156:139;;29883:419;;;:::o;30308:179::-;30448:31;30444:1;30436:6;30432:14;30425:55;30308:179;:::o;30493:366::-;30635:3;30656:67;30720:2;30715:3;30656:67;:::i;:::-;30649:74;;30732:93;30821:3;30732:93;:::i;:::-;30850:2;30845:3;30841:12;30834:19;;30493:366;;;:::o;30865:419::-;31031:4;31069:2;31058:9;31054:18;31046:26;;31118:9;31112:4;31108:20;31104:1;31093:9;31089:17;31082:47;31146:131;31272:4;31146:131;:::i;:::-;31138:139;;30865:419;;;:::o;31290:224::-;31430:34;31426:1;31418:6;31414:14;31407:58;31499:7;31494:2;31486:6;31482:15;31475:32;31290:224;:::o;31520:366::-;31662:3;31683:67;31747:2;31742:3;31683:67;:::i;:::-;31676:74;;31759:93;31848:3;31759:93;:::i;:::-;31877:2;31872:3;31868:12;31861:19;;31520:366;;;:::o;31892:419::-;32058:4;32096:2;32085:9;32081:18;32073:26;;32145:9;32139:4;32135:20;32131:1;32120:9;32116:17;32109:47;32173:131;32299:4;32173:131;:::i;:::-;32165:139;;31892:419;;;:::o;32317:222::-;32457:34;32453:1;32445:6;32441:14;32434:58;32526:5;32521:2;32513:6;32509:15;32502:30;32317:222;:::o;32545:366::-;32687:3;32708:67;32772:2;32767:3;32708:67;:::i;:::-;32701:74;;32784:93;32873:3;32784:93;:::i;:::-;32902:2;32897:3;32893:12;32886:19;;32545:366;;;:::o;32917:419::-;33083:4;33121:2;33110:9;33106:18;33098:26;;33170:9;33164:4;33160:20;33156:1;33145:9;33141:17;33134:47;33198:131;33324:4;33198:131;:::i;:::-;33190:139;;32917:419;;;:::o;33342:225::-;33482:34;33478:1;33470:6;33466:14;33459:58;33551:8;33546:2;33538:6;33534:15;33527:33;33342:225;:::o;33573:366::-;33715:3;33736:67;33800:2;33795:3;33736:67;:::i;:::-;33729:74;;33812:93;33901:3;33812:93;:::i;:::-;33930:2;33925:3;33921:12;33914:19;;33573:366;;;:::o;33945:419::-;34111:4;34149:2;34138:9;34134:18;34126:26;;34198:9;34192:4;34188:20;34184:1;34173:9;34169:17;34162:47;34226:131;34352:4;34226:131;:::i;:::-;34218:139;;33945:419;;;:::o;34370:664::-;34575:4;34613:3;34602:9;34598:19;34590:27;;34627:71;34695:1;34684:9;34680:17;34671:6;34627:71;:::i;:::-;34708:72;34776:2;34765:9;34761:18;34752:6;34708:72;:::i;:::-;34790;34858:2;34847:9;34843:18;34834:6;34790:72;:::i;:::-;34872;34940:2;34929:9;34925:18;34916:6;34872:72;:::i;:::-;34954:73;35022:3;35011:9;35007:19;34998:6;34954:73;:::i;:::-;34370:664;;;;;;;;:::o;35040:220::-;35180:34;35176:1;35168:6;35164:14;35157:58;35249:3;35244:2;35236:6;35232:15;35225:28;35040:220;:::o;35266:366::-;35408:3;35429:67;35493:2;35488:3;35429:67;:::i;:::-;35422:74;;35505:93;35594:3;35505:93;:::i;:::-;35623:2;35618:3;35614:12;35607:19;;35266:366;;;:::o;35638:419::-;35804:4;35842:2;35831:9;35827:18;35819:26;;35891:9;35885:4;35881:20;35877:1;35866:9;35862:17;35855:47;35919:131;36045:4;35919:131;:::i;:::-;35911:139;;35638:419;;;:::o;36063:221::-;36203:34;36199:1;36191:6;36187:14;36180:58;36272:4;36267:2;36259:6;36255:15;36248:29;36063:221;:::o;36290:366::-;36432:3;36453:67;36517:2;36512:3;36453:67;:::i;:::-;36446:74;;36529:93;36618:3;36529:93;:::i;:::-;36647:2;36642:3;36638:12;36631:19;;36290:366;;;:::o;36662:419::-;36828:4;36866:2;36855:9;36851:18;36843:26;;36915:9;36909:4;36905:20;36901:1;36890:9;36886:17;36879:47;36943:131;37069:4;36943:131;:::i;:::-;36935:139;;36662:419;;;:::o;37087:181::-;37227:33;37223:1;37215:6;37211:14;37204:57;37087:181;:::o;37274:366::-;37416:3;37437:67;37501:2;37496:3;37437:67;:::i;:::-;37430:74;;37513:93;37602:3;37513:93;:::i;:::-;37631:2;37626:3;37622:12;37615:19;;37274:366;;;:::o;37646:419::-;37812:4;37850:2;37839:9;37835:18;37827:26;;37899:9;37893:4;37889:20;37885:1;37874:9;37870:17;37863:47;37927:131;38053:4;37927:131;:::i;:::-;37919:139;;37646:419;;;:::o;38071:514::-;38232:4;38270:2;38259:9;38255:18;38247:26;;38319:9;38313:4;38309:20;38305:1;38294:9;38290:17;38283:47;38347:78;38420:4;38411:6;38347:78;:::i;:::-;38339:86;;38472:9;38466:4;38462:20;38457:2;38446:9;38442:18;38435:48;38500:78;38573:4;38564:6;38500:78;:::i;:::-;38492:86;;38071:514;;;;;:::o;38591:373::-;38695:3;38723:38;38755:5;38723:38;:::i;:::-;38777:88;38858:6;38853:3;38777:88;:::i;:::-;38770:95;;38874:52;38919:6;38914:3;38907:4;38900:5;38896:16;38874:52;:::i;:::-;38951:6;38946:3;38942:16;38935:23;;38699:265;38591:373;;;;:::o;38970:271::-;39100:3;39122:93;39211:3;39202:6;39122:93;:::i;:::-;39115:100;;39232:3;39225:10;;38970:271;;;;:::o;39247:545::-;39420:4;39458:3;39447:9;39443:19;39435:27;;39472:71;39540:1;39529:9;39525:17;39516:6;39472:71;:::i;:::-;39553:68;39617:2;39606:9;39602:18;39593:6;39553:68;:::i;:::-;39631:72;39699:2;39688:9;39684:18;39675:6;39631:72;:::i;:::-;39713;39781:2;39770:9;39766:18;39757:6;39713:72;:::i;:::-;39247:545;;;;;;;:::o;39798:180::-;39846:77;39843:1;39836:88;39943:4;39940:1;39933:15;39967:4;39964:1;39957:15;39984:174;40124:26;40120:1;40112:6;40108:14;40101:50;39984:174;:::o;40164:366::-;40306:3;40327:67;40391:2;40386:3;40327:67;:::i;:::-;40320:74;;40403:93;40492:3;40403:93;:::i;:::-;40521:2;40516:3;40512:12;40505:19;;40164:366;;;:::o;40536:419::-;40702:4;40740:2;40729:9;40725:18;40717:26;;40789:9;40783:4;40779:20;40775:1;40764:9;40760:17;40753:47;40817:131;40943:4;40817:131;:::i;:::-;40809:139;;40536:419;;;:::o;40961:181::-;41101:33;41097:1;41089:6;41085:14;41078:57;40961:181;:::o;41148:366::-;41290:3;41311:67;41375:2;41370:3;41311:67;:::i;:::-;41304:74;;41387:93;41476:3;41387:93;:::i;:::-;41505:2;41500:3;41496:12;41489:19;;41148:366;;;:::o;41520:419::-;41686:4;41724:2;41713:9;41709:18;41701:26;;41773:9;41767:4;41763:20;41759:1;41748:9;41744:17;41737:47;41801:131;41927:4;41801:131;:::i;:::-;41793:139;;41520:419;;;:::o;41945:221::-;42085:34;42081:1;42073:6;42069:14;42062:58;42154:4;42149:2;42141:6;42137:15;42130:29;41945:221;:::o;42172:366::-;42314:3;42335:67;42399:2;42394:3;42335:67;:::i;:::-;42328:74;;42411:93;42500:3;42411:93;:::i;:::-;42529:2;42524:3;42520:12;42513:19;;42172:366;;;:::o;42544:419::-;42710:4;42748:2;42737:9;42733:18;42725:26;;42797:9;42791:4;42787:20;42783:1;42772:9;42768:17;42761:47;42825:131;42951:4;42825:131;:::i;:::-;42817:139;;42544:419;;;:::o;42969:179::-;43109:31;43105:1;43097:6;43093:14;43086:55;42969:179;:::o;43154:366::-;43296:3;43317:67;43381:2;43376:3;43317:67;:::i;:::-;43310:74;;43393:93;43482:3;43393:93;:::i;:::-;43511:2;43506:3;43502:12;43495:19;;43154:366;;;:::o;43526:419::-;43692:4;43730:2;43719:9;43715:18;43707:26;;43779:9;43773:4;43769:20;43765:1;43754:9;43750:17;43743:47;43807:131;43933:4;43807:131;:::i;:::-;43799:139;;43526:419;;;:::o
Swarm Source
ipfs://eccc2c36efcd63d6f1dc32ac7c7359a5b92d630963416d3a65e0aac587c61584
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.