ERC-20
Overview
Max Total Supply
2,433,920.98935184985421352 RNCT
Holders
548
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RNCT
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-18 */ // Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) // pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // Dependency file: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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; } } // Dependency file: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; // import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), 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}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - 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) { _approve(_msgSender(), spender, _allowances[_msgSender()][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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), 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: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, 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 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 {} } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/ERC20Burnable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @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) public virtual { uint256 currentAllowance = allowance(account, _msgSender()); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.0 (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); } // Dependency file: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) // pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // Dependency file: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/Strings.sol"; /** * @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 } 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"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' 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) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ 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. 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 if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } 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; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 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 (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // 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) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @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) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // Dependency file: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/draft-EIP712.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @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); } } // Dependency file: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.0 (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; } } // Dependency file: @openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-ERC20Permit.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; // import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; // import "@openzeppelin/contracts/utils/Counters.sol"; /** * @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, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // 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) EIP712(name, "1") {} /** * @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 = _hashTypedDataV4(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() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @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(); } } // Dependency file: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Dependency file: contracts/RecoverableErc20ByOwner.sol // pragma solidity ^0.8.0; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; abstract contract RecoverableErc20ByOwner is Ownable { function recoverErc20(address tokenAddress, uint256 amount, address to) external onlyOwner { uint256 recoverableAmount = _getRecoverableAmount(tokenAddress); require(amount <= recoverableAmount, "RecoverableByOwner: RECOVERABLE_AMOUNT_NOT_ENOUGH"); _sendErc20(tokenAddress, amount, to); } function _getRecoverableAmount(address tokenAddress) private view returns (uint256) { return IERC20(tokenAddress).balanceOf(address(this)); } function _sendErc20(address tokenAddress, uint256 amount, address to) private { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = tokenAddress.call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "RecoverableByOwner: ERC20_TRANSFER_FAILED"); } } // Dependency file: contracts/interfaces/IRoboShort.sol // pragma solidity ^0.8.0; interface IRoboShort { function rawOwnerOf(uint256 tokenId) external view returns (address owner); function isMintedBeforeSale(uint256 tokenId) external view returns (bool); function tokenName(uint256 tokenId) external view returns (string memory); } // Root file: contracts/RNCT.sol pragma solidity ^0.8.0; // import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; // import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "contracts/RecoverableErc20ByOwner.sol"; // import "contracts/interfaces/IRoboShort.sol"; contract RNCT is Ownable, RecoverableErc20ByOwner, ERC20, ERC20Burnable, ERC20Permit { address public ROBO; uint256 public constant BONUS = 1830 ether; uint256 public constant EMISSION_START = 1645279170; uint256 public constant EMISSION_END = 1960639170; uint256 public constant EMISSION_RATE = 10 ether / uint256(86400); mapping(uint256 => uint256) private _lastClaim; constructor() ERC20("Roborovski NameChangeToken", "RNCT") ERC20Permit("Roborovski NameChangeToken") { _mint(_msgSender(), 1000000 ether); } function lastClaim(uint256 tokenId) public view returns (uint256) { require(IRoboShort(ROBO).rawOwnerOf(tokenId) != address(0), "RNCT: owner cannot be zero address"); uint256 lastClaimed = uint256(_lastClaim[tokenId]) != 0 ? uint256(_lastClaim[tokenId]) : EMISSION_START; return lastClaimed; } function accumulated(uint256 tokenId) public view returns (uint256) { uint256 lastClaimed = lastClaim(tokenId); if (lastClaimed >= EMISSION_END) return 0; uint256 accumulationPeriod = block.timestamp < EMISSION_END ? block.timestamp : EMISSION_END; uint256 total = EMISSION_RATE * (accumulationPeriod - lastClaimed); if (lastClaimed == EMISSION_START) { uint256 bonus = IRoboShort(ROBO).isMintedBeforeSale(tokenId) == true ? BONUS : 0; total = total + bonus; } return total; } function accumulatedBatch(uint256[] memory tokenIds) public view returns (uint256) { uint256 total = 0; for (uint256 i = 0; i < tokenIds.length; i++) { for (uint256 j = i + 1; j < tokenIds.length; j++) { require(tokenIds[i] != tokenIds[j], "RNCT: duplicate tokenId"); } uint256 amount = accumulated(tokenIds[i]); if (amount != 0) { total = total + amount; } } return total; } function claim(uint256[] memory tokenIds) public returns (uint256) { require(block.timestamp > EMISSION_START, "RNCT: emission has not started yet"); uint256 totalClaimQty = 0; for (uint256 i = 0; i < tokenIds.length; i++) { for (uint256 j = i + 1; j < tokenIds.length; j++) { require(tokenIds[i] != tokenIds[j], "RNCT: duplicate tokenId"); } uint256 tokenId = tokenIds[i]; require(IRoboShort(ROBO).rawOwnerOf(tokenId) == _msgSender(), "RNCT: sender is not the owner"); uint256 claimQty = accumulated(tokenId); if (claimQty != 0) { totalClaimQty = totalClaimQty + claimQty; _lastClaim[tokenId] = block.timestamp; } } require(totalClaimQty != 0, "RNCT: no accumulated RNCT"); _mint(_msgSender(), totalClaimQty); return totalClaimQty; } function setRobo(address robo) public onlyOwner { require(ROBO == address(0), "RNCT: ROBO is already set"); ROBO = robo; } // The following functions are overrides required by Solidity. function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { if (_msgSender() == ROBO) { _transfer(sender, recipient, amount); return true; } return super.transferFrom(sender, recipient, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BONUS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSION_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROBO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"accumulated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"accumulatedBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"lastClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"robo","type":"address"}],"name":"setRobo","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b506040518060400160405280601a81526020017f526f626f726f76736b69204e616d654368616e6765546f6b656e00000000000081525080604051806040016040528060018152602001603160f81b8152506040518060400160405280601a81526020017f526f626f726f76736b69204e616d654368616e6765546f6b656e00000000000081525060405180604001604052806004815260200163149390d560e21b815250620000f6620000f0620001d160201b60201c565b620001d5565b81516200010b9060049060208501906200030d565b508051620001219060059060208401906200030d565b5050825160209384012082519284019290922060e08390526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818901819052818301979097526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909601209052929092526101205250620001cb90503369d3c21bcecceda100000062000225565b62000417565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620002805760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620002949190620003b3565b90915550506001600160a01b03821660009081526001602052604081208054839290620002c3908490620003b3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200031b90620003da565b90600052602060002090601f0160209004810192826200033f57600085556200038a565b82601f106200035a57805160ff19168380011785556200038a565b828001600101855582156200038a579182015b828111156200038a5782518255916020019190600101906200036d565b50620003989291506200039c565b5090565b5b808211156200039857600081556001016200039d565b60008219821115620003d557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620003ef57607f821691505b602082108114156200041157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161014051612130620004726000396000610eac0152600061147a015260006114c9015260006114a4015260006113fd015260006114270152600061145101526121306000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e146103d6578063eec4c0bf1461040f578063f2fde38b1461041a578063fda16e301461042d57600080fd5b8063a457c2d71461038a578063a9059cbb1461039d578063c607cde7146103b0578063d505accf146103c357600080fd5b80637ecebe00116100de5780637ecebe0014610337578063819bea4b1461034a5780638da5cb5b1461035d57806395d89b411461038257600080fd5b806370a08231146102f3578063715018a61461031c57806379cc67901461032457600080fd5b8063342f9d051161017c57806342966c681161014b57806342966c68146102aa5780634b8624c4146102bd5780635df03aa6146102cd5780636ba4c138146102e057600080fd5b8063342f9d05146102675780633644e5151461027c57806339509351146102845780633d3728b51461029757600080fd5b80630fe3633c116101b85780630fe3633c1461023257806318160ddd1461023d57806323b872dd14610245578063313ce5671461025857600080fd5b806301b8199a146101df57806306fdde03146101fa578063095ea7b31461020f575b600080fd5b6101e7610440565b6040519081526020015b60405180910390f35b610202610458565b6040516101f19190611c9e565b61022261021d366004611ce6565b6104ea565b60405190151581526020016101f1565b6101e76374dcfac281565b6003546101e7565b610222610253366004611d12565b610500565b604051601281526020016101f1565b61027a610275366004611d53565b610547565b005b6101e76105f5565b610222610292366004611ce6565b610604565b6101e76102a5366004611d70565b610640565b61027a6102b8366004611d70565b610745565b6101e76863345a083e94d8000081565b6101e76102db366004611d9f565b610752565b6101e76102ee366004611d9f565b61085b565b6101e7610301366004611d53565b6001600160a01b031660009081526001602052604090205490565b61027a610b00565b61027a610332366004611ce6565b610b36565b6101e7610345366004611d53565b610bbc565b61027a610358366004611e5d565b610bda565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101f1565b610202610c8c565b610222610398366004611ce6565b610c9b565b6102226103ab366004611ce6565b610d34565b6101e76103be366004611d70565b610d41565b61027a6103d1366004611e9f565b610e58565b6101e76103e4366004611f16565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e7636210f7c281565b61027a610428366004611d53565b610fbc565b60075461036a906001600160a01b031681565b61045562015180678ac7230489e80000611f65565b81565b60606004805461046790611f87565b80601f016020809104026020016040519081016040528092919081815260200182805461049390611f87565b80156104e05780601f106104b5576101008083540402835291602001916104e0565b820191906000526020600020905b8154815290600101906020018083116104c357829003601f168201915b5050505050905090565b60006104f7338484611054565b50600192915050565b6007546000906001600160a01b0316336001600160a01b031614156105325761052a848484611178565b506001610540565b61053d848484611346565b90505b9392505050565b6000546001600160a01b0316331461057a5760405162461bcd60e51b815260040161057190611fbc565b60405180910390fd5b6007546001600160a01b0316156105d35760405162461bcd60e51b815260206004820152601960248201527f524e43543a20524f424f20697320616c726561647920736574000000000000006044820152606401610571565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006105ff6113f0565b905090565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104f791859061063b908690611ff1565b611054565b600754604051637f81be6960e01b81526004810183905260009182916001600160a01b0390911690637f81be6990602401602060405180830381865afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b29190612009565b6001600160a01b031614156107145760405162461bcd60e51b815260206004820152602260248201527f524e43543a206f776e65722063616e6e6f74206265207a65726f206164647265604482015261737360f01b6064820152608401610571565b60008281526008602052604081205461073157636210f7c2610540565b505060009081526008602052604090205490565b61074f3382611517565b50565b600080805b835181101561085457600061076d826001611ff1565b90505b84518110156108075784818151811061078b5761078b612026565b60200260200101518583815181106107a5576107a5612026565b602002602001015114156107f55760405162461bcd60e51b8152602060048201526017602482015276149390d50e88191d5c1b1a58d85d19481d1bdad95b9259604a1b6044820152606401610571565b806107ff8161203c565b915050610770565b50600061082c85838151811061081f5761081f612026565b6020026020010151610d41565b905080156108415761083e8184611ff1565b92505b508061084c8161203c565b915050610757565b5092915050565b6000636210f7c242116108bb5760405162461bcd60e51b815260206004820152602260248201527f524e43543a20656d697373696f6e20686173206e6f7420737461727465642079604482015261195d60f21b6064820152608401610571565b6000805b8351811015610aa25760006108d5826001611ff1565b90505b845181101561096f578481815181106108f3576108f3612026565b602002602001015185838151811061090d5761090d612026565b6020026020010151141561095d5760405162461bcd60e51b8152602060048201526017602482015276149390d50e88191d5c1b1a58d85d19481d1bdad95b9259604a1b6044820152606401610571565b806109678161203c565b9150506108d8565b50600084828151811061098457610984612026565b602002602001015190506109953390565b600754604051637f81be6960e01b8152600481018490526001600160a01b039283169290911690637f81be6990602401602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190612009565b6001600160a01b031614610a5c5760405162461bcd60e51b815260206004820152601d60248201527f524e43543a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610571565b6000610a6782610d41565b90508015610a8d57610a798185611ff1565b600083815260086020526040902042905593505b50508080610a9a9061203c565b9150506108bf565b5080610af05760405162461bcd60e51b815260206004820152601960248201527f524e43543a206e6f20616363756d756c6174656420524e4354000000000000006044820152606401610571565b610afa3382611665565b92915050565b6000546001600160a01b03163314610b2a5760405162461bcd60e51b815260040161057190611fbc565b610b346000611744565b565b6000610b4283336103e4565b905081811015610ba05760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610571565b610bad8333848403611054565b610bb78383611517565b505050565b6001600160a01b038116600090815260066020526040812054610afa565b6000546001600160a01b03163314610c045760405162461bcd60e51b815260040161057190611fbc565b6000610c0f84611794565b905080831115610c7b5760405162461bcd60e51b815260206004820152603160248201527f5265636f76657261626c6542794f776e65723a205245434f56455241424c455f6044820152700829a9eaa9ca8be9c9ea8be8a9c9eaa8e9607b1b6064820152608401610571565b610c868484846117ff565b50505050565b60606005805461046790611f87565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610d1d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610571565b610d2a3385858403611054565b5060019392505050565b60006104f7338484611178565b600080610d4d83610640565b90506374dcfac28110610d635750600092915050565b60006374dcfac24210610d7a576374dcfac2610d7c565b425b90506000610d8a8383612057565b610d9f62015180678ac7230489e80000611f65565b610da9919061206e565b9050636210f7c2831415610e5057600754604051631424241960e31b8152600481018790526000916001600160a01b03169063a12120c890602401602060405180830381865afa158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e25919061208d565b1515600114610e35576000610e40565b6863345a083e94d800005b9050610e4c8183611ff1565b9150505b949350505050565b83421115610ea85760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610571565b60007f0000000000000000000000000000000000000000000000000000000000000000888888610ed78c61192c565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f3282611954565b90506000610f42828787876119a2565b9050896001600160a01b0316816001600160a01b031614610fa55760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610571565b610fb08a8a8a611054565b50505050505050505050565b6000546001600160a01b03163314610fe65760405162461bcd60e51b815260040161057190611fbc565b6001600160a01b03811661104b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610571565b61074f81611744565b6001600160a01b0383166110b65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610571565b6001600160a01b0382166111175760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610571565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111dc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610571565b6001600160a01b03821661123e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610571565b6001600160a01b038316600090815260016020526040902054818110156112b65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610571565b6001600160a01b038085166000908152600160205260408082208585039055918516815290812080548492906112ed908490611ff1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161133991815260200190565b60405180910390a3610c86565b6000611353848484611178565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156113d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610571565b6113e58533858403611054565b506001949350505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561144957507f000000000000000000000000000000000000000000000000000000000000000046145b1561147357507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b0382166115775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610571565b6001600160a01b038216600090815260016020526040902054818110156115eb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610571565b6001600160a01b038316600090815260016020526040812083830390556003805484929061161a908490612057565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b0382166116bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610571565b80600360008282546116cd9190611ff1565b90915550506001600160a01b038216600090815260016020526040812080548392906116fa908490611ff1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa91906120af565b604080516001600160a01b038381166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161185b91906120c8565b6000604051808303816000865af19150503d8060008114611898576040519150601f19603f3d011682016040523d82523d6000602084013e61189d565b606091505b50915091508180156118c75750805115806118c75750808060200190518101906118c7919061208d565b6119255760405162461bcd60e51b815260206004820152602960248201527f5265636f76657261626c6542794f776e65723a2045524332305f5452414e5346604482015268115497d1905253115160ba1b6064820152608401610571565b5050505050565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b6000610afa6119616113f0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006119b3878787876119ca565b915091506119c081611ab7565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611a015750600090506003611aae565b8460ff16601b14158015611a1957508460ff16601c14155b15611a2a5750600090506004611aae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a7e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611aa757600060019250925050611aae565b9150600090505b94509492505050565b6000816004811115611acb57611acb6120e4565b1415611ad45750565b6001816004811115611ae857611ae86120e4565b1415611b365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610571565b6002816004811115611b4a57611b4a6120e4565b1415611b985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610571565b6003816004811115611bac57611bac6120e4565b1415611c055760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610571565b6004816004811115611c1957611c196120e4565b141561074f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610571565b60005b83811015611c8d578181015183820152602001611c75565b83811115610c865750506000910152565b6020815260008251806020840152611cbd816040850160208701611c72565b601f01601f19169190910160400192915050565b6001600160a01b038116811461074f57600080fd5b60008060408385031215611cf957600080fd5b8235611d0481611cd1565b946020939093013593505050565b600080600060608486031215611d2757600080fd5b8335611d3281611cd1565b92506020840135611d4281611cd1565b929592945050506040919091013590565b600060208284031215611d6557600080fd5b813561054081611cd1565b600060208284031215611d8257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611db257600080fd5b823567ffffffffffffffff80821115611dca57600080fd5b818501915085601f830112611dde57600080fd5b813581811115611df057611df0611d89565b8060051b604051601f19603f83011681018181108582111715611e1557611e15611d89565b604052918252848201925083810185019188831115611e3357600080fd5b938501935b82851015611e5157843584529385019392850192611e38565b98975050505050505050565b600080600060608486031215611e7257600080fd5b8335611e7d81611cd1565b9250602084013591506040840135611e9481611cd1565b809150509250925092565b600080600080600080600060e0888a031215611eba57600080fd5b8735611ec581611cd1565b96506020880135611ed581611cd1565b95506040880135945060608801359350608088013560ff81168114611ef957600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611f2957600080fd5b8235611f3481611cd1565b91506020830135611f4481611cd1565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082611f8257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680611f9b57607f821691505b6020821081141561194e57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561200457612004611f4f565b500190565b60006020828403121561201b57600080fd5b815161054081611cd1565b634e487b7160e01b600052603260045260246000fd5b600060001982141561205057612050611f4f565b5060010190565b60008282101561206957612069611f4f565b500390565b600081600019048311821515161561208857612088611f4f565b500290565b60006020828403121561209f57600080fd5b8151801515811461054057600080fd5b6000602082840312156120c157600080fd5b5051919050565b600082516120da818460208701611c72565b9190910192915050565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220ea7033e333da990a5302de50d71beb1057b0f96e94bbd48823724f66976a661564736f6c634300080a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e146103d6578063eec4c0bf1461040f578063f2fde38b1461041a578063fda16e301461042d57600080fd5b8063a457c2d71461038a578063a9059cbb1461039d578063c607cde7146103b0578063d505accf146103c357600080fd5b80637ecebe00116100de5780637ecebe0014610337578063819bea4b1461034a5780638da5cb5b1461035d57806395d89b411461038257600080fd5b806370a08231146102f3578063715018a61461031c57806379cc67901461032457600080fd5b8063342f9d051161017c57806342966c681161014b57806342966c68146102aa5780634b8624c4146102bd5780635df03aa6146102cd5780636ba4c138146102e057600080fd5b8063342f9d05146102675780633644e5151461027c57806339509351146102845780633d3728b51461029757600080fd5b80630fe3633c116101b85780630fe3633c1461023257806318160ddd1461023d57806323b872dd14610245578063313ce5671461025857600080fd5b806301b8199a146101df57806306fdde03146101fa578063095ea7b31461020f575b600080fd5b6101e7610440565b6040519081526020015b60405180910390f35b610202610458565b6040516101f19190611c9e565b61022261021d366004611ce6565b6104ea565b60405190151581526020016101f1565b6101e76374dcfac281565b6003546101e7565b610222610253366004611d12565b610500565b604051601281526020016101f1565b61027a610275366004611d53565b610547565b005b6101e76105f5565b610222610292366004611ce6565b610604565b6101e76102a5366004611d70565b610640565b61027a6102b8366004611d70565b610745565b6101e76863345a083e94d8000081565b6101e76102db366004611d9f565b610752565b6101e76102ee366004611d9f565b61085b565b6101e7610301366004611d53565b6001600160a01b031660009081526001602052604090205490565b61027a610b00565b61027a610332366004611ce6565b610b36565b6101e7610345366004611d53565b610bbc565b61027a610358366004611e5d565b610bda565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101f1565b610202610c8c565b610222610398366004611ce6565b610c9b565b6102226103ab366004611ce6565b610d34565b6101e76103be366004611d70565b610d41565b61027a6103d1366004611e9f565b610e58565b6101e76103e4366004611f16565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e7636210f7c281565b61027a610428366004611d53565b610fbc565b60075461036a906001600160a01b031681565b61045562015180678ac7230489e80000611f65565b81565b60606004805461046790611f87565b80601f016020809104026020016040519081016040528092919081815260200182805461049390611f87565b80156104e05780601f106104b5576101008083540402835291602001916104e0565b820191906000526020600020905b8154815290600101906020018083116104c357829003601f168201915b5050505050905090565b60006104f7338484611054565b50600192915050565b6007546000906001600160a01b0316336001600160a01b031614156105325761052a848484611178565b506001610540565b61053d848484611346565b90505b9392505050565b6000546001600160a01b0316331461057a5760405162461bcd60e51b815260040161057190611fbc565b60405180910390fd5b6007546001600160a01b0316156105d35760405162461bcd60e51b815260206004820152601960248201527f524e43543a20524f424f20697320616c726561647920736574000000000000006044820152606401610571565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006105ff6113f0565b905090565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104f791859061063b908690611ff1565b611054565b600754604051637f81be6960e01b81526004810183905260009182916001600160a01b0390911690637f81be6990602401602060405180830381865afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b29190612009565b6001600160a01b031614156107145760405162461bcd60e51b815260206004820152602260248201527f524e43543a206f776e65722063616e6e6f74206265207a65726f206164647265604482015261737360f01b6064820152608401610571565b60008281526008602052604081205461073157636210f7c2610540565b505060009081526008602052604090205490565b61074f3382611517565b50565b600080805b835181101561085457600061076d826001611ff1565b90505b84518110156108075784818151811061078b5761078b612026565b60200260200101518583815181106107a5576107a5612026565b602002602001015114156107f55760405162461bcd60e51b8152602060048201526017602482015276149390d50e88191d5c1b1a58d85d19481d1bdad95b9259604a1b6044820152606401610571565b806107ff8161203c565b915050610770565b50600061082c85838151811061081f5761081f612026565b6020026020010151610d41565b905080156108415761083e8184611ff1565b92505b508061084c8161203c565b915050610757565b5092915050565b6000636210f7c242116108bb5760405162461bcd60e51b815260206004820152602260248201527f524e43543a20656d697373696f6e20686173206e6f7420737461727465642079604482015261195d60f21b6064820152608401610571565b6000805b8351811015610aa25760006108d5826001611ff1565b90505b845181101561096f578481815181106108f3576108f3612026565b602002602001015185838151811061090d5761090d612026565b6020026020010151141561095d5760405162461bcd60e51b8152602060048201526017602482015276149390d50e88191d5c1b1a58d85d19481d1bdad95b9259604a1b6044820152606401610571565b806109678161203c565b9150506108d8565b50600084828151811061098457610984612026565b602002602001015190506109953390565b600754604051637f81be6960e01b8152600481018490526001600160a01b039283169290911690637f81be6990602401602060405180830381865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190612009565b6001600160a01b031614610a5c5760405162461bcd60e51b815260206004820152601d60248201527f524e43543a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610571565b6000610a6782610d41565b90508015610a8d57610a798185611ff1565b600083815260086020526040902042905593505b50508080610a9a9061203c565b9150506108bf565b5080610af05760405162461bcd60e51b815260206004820152601960248201527f524e43543a206e6f20616363756d756c6174656420524e4354000000000000006044820152606401610571565b610afa3382611665565b92915050565b6000546001600160a01b03163314610b2a5760405162461bcd60e51b815260040161057190611fbc565b610b346000611744565b565b6000610b4283336103e4565b905081811015610ba05760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b6064820152608401610571565b610bad8333848403611054565b610bb78383611517565b505050565b6001600160a01b038116600090815260066020526040812054610afa565b6000546001600160a01b03163314610c045760405162461bcd60e51b815260040161057190611fbc565b6000610c0f84611794565b905080831115610c7b5760405162461bcd60e51b815260206004820152603160248201527f5265636f76657261626c6542794f776e65723a205245434f56455241424c455f6044820152700829a9eaa9ca8be9c9ea8be8a9c9eaa8e9607b1b6064820152608401610571565b610c868484846117ff565b50505050565b60606005805461046790611f87565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610d1d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610571565b610d2a3385858403611054565b5060019392505050565b60006104f7338484611178565b600080610d4d83610640565b90506374dcfac28110610d635750600092915050565b60006374dcfac24210610d7a576374dcfac2610d7c565b425b90506000610d8a8383612057565b610d9f62015180678ac7230489e80000611f65565b610da9919061206e565b9050636210f7c2831415610e5057600754604051631424241960e31b8152600481018790526000916001600160a01b03169063a12120c890602401602060405180830381865afa158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e25919061208d565b1515600114610e35576000610e40565b6863345a083e94d800005b9050610e4c8183611ff1565b9150505b949350505050565b83421115610ea85760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610571565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610ed78c61192c565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f3282611954565b90506000610f42828787876119a2565b9050896001600160a01b0316816001600160a01b031614610fa55760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610571565b610fb08a8a8a611054565b50505050505050505050565b6000546001600160a01b03163314610fe65760405162461bcd60e51b815260040161057190611fbc565b6001600160a01b03811661104b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610571565b61074f81611744565b6001600160a01b0383166110b65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610571565b6001600160a01b0382166111175760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610571565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111dc5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610571565b6001600160a01b03821661123e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610571565b6001600160a01b038316600090815260016020526040902054818110156112b65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610571565b6001600160a01b038085166000908152600160205260408082208585039055918516815290812080548492906112ed908490611ff1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161133991815260200190565b60405180910390a3610c86565b6000611353848484611178565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156113d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610571565b6113e58533858403611054565b506001949350505050565b6000306001600160a01b037f0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b51614801561144957507f000000000000000000000000000000000000000000000000000000000000000146145b1561147357507f399affcddd5c13f108422b1f1da315fad24b81c194c2744b4feccd1d5bdf6a3b90565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f74a30380666705d28418d1c196d090938e421c7812d8b2abc7a0f57e79d2390e828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6001600160a01b0382166115775760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610571565b6001600160a01b038216600090815260016020526040902054818110156115eb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610571565b6001600160a01b038316600090815260016020526040812083830390556003805484929061161a908490612057565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6001600160a01b0382166116bb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610571565b80600360008282546116cd9190611ff1565b90915550506001600160a01b038216600090815260016020526040812080548392906116fa908490611ff1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156117db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa91906120af565b604080516001600160a01b038381166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161185b91906120c8565b6000604051808303816000865af19150503d8060008114611898576040519150601f19603f3d011682016040523d82523d6000602084013e61189d565b606091505b50915091508180156118c75750805115806118c75750808060200190518101906118c7919061208d565b6119255760405162461bcd60e51b815260206004820152602960248201527f5265636f76657261626c6542794f776e65723a2045524332305f5452414e5346604482015268115497d1905253115160ba1b6064820152608401610571565b5050505050565b6001600160a01b03811660009081526006602052604090208054600181018255905b50919050565b6000610afa6119616113f0565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b60008060006119b3878787876119ca565b915091506119c081611ab7565b5095945050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611a015750600090506003611aae565b8460ff16601b14158015611a1957508460ff16601c14155b15611a2a5750600090506004611aae565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611a7e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611aa757600060019250925050611aae565b9150600090505b94509492505050565b6000816004811115611acb57611acb6120e4565b1415611ad45750565b6001816004811115611ae857611ae86120e4565b1415611b365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610571565b6002816004811115611b4a57611b4a6120e4565b1415611b985760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610571565b6003816004811115611bac57611bac6120e4565b1415611c055760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610571565b6004816004811115611c1957611c196120e4565b141561074f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610571565b60005b83811015611c8d578181015183820152602001611c75565b83811115610c865750506000910152565b6020815260008251806020840152611cbd816040850160208701611c72565b601f01601f19169190910160400192915050565b6001600160a01b038116811461074f57600080fd5b60008060408385031215611cf957600080fd5b8235611d0481611cd1565b946020939093013593505050565b600080600060608486031215611d2757600080fd5b8335611d3281611cd1565b92506020840135611d4281611cd1565b929592945050506040919091013590565b600060208284031215611d6557600080fd5b813561054081611cd1565b600060208284031215611d8257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611db257600080fd5b823567ffffffffffffffff80821115611dca57600080fd5b818501915085601f830112611dde57600080fd5b813581811115611df057611df0611d89565b8060051b604051601f19603f83011681018181108582111715611e1557611e15611d89565b604052918252848201925083810185019188831115611e3357600080fd5b938501935b82851015611e5157843584529385019392850192611e38565b98975050505050505050565b600080600060608486031215611e7257600080fd5b8335611e7d81611cd1565b9250602084013591506040840135611e9481611cd1565b809150509250925092565b600080600080600080600060e0888a031215611eba57600080fd5b8735611ec581611cd1565b96506020880135611ed581611cd1565b95506040880135945060608801359350608088013560ff81168114611ef957600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611f2957600080fd5b8235611f3481611cd1565b91506020830135611f4481611cd1565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b600082611f8257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680611f9b57607f821691505b6020821081141561194e57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561200457612004611f4f565b500190565b60006020828403121561201b57600080fd5b815161054081611cd1565b634e487b7160e01b600052603260045260246000fd5b600060001982141561205057612050611f4f565b5060010190565b60008282101561206957612069611f4f565b500390565b600081600019048311821515161561208857612088611f4f565b500290565b60006020828403121561209f57600080fd5b8151801515811461054057600080fd5b6000602082840312156120c157600080fd5b5051919050565b600082516120da818460208701611c72565b9190910192915050565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220ea7033e333da990a5302de50d71beb1057b0f96e94bbd48823724f66976a661564736f6c634300080a0033
Deployed Bytecode Sourcemap
46596:3617:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46877:65;;;:::i;:::-;;;160:25:1;;;148:2;133:18;46877:65:0;;;;;;;;6996:100;;;:::i;:::-;;;;;;;:::i;9163:169::-;;;;;;:::i;:::-;;:::i;:::-;;;1468:14:1;;1461:22;1443:41;;1431:2;1416:18;9163:169:0;1303:187:1;46821:49:0;;46860:10;46821:49;;8116:108;8204:12;;8116:108;;49910:300;;;;;;:::i;:::-;;:::i;7958:93::-;;;8041:2;2098:36:1;;2086:2;2071:18;7958:93:0;1956:184:1;49689:145:0;;;;;;:::i;:::-;;:::i;:::-;;41562:115;;;:::i;10715:215::-;;;;;;:::i;:::-;;:::i;47188:353::-;;;;;;:::i;:::-;;:::i;17653:91::-;;;;;;:::i;:::-;;:::i;46714:42::-;;46746:10;46714:42;;48206:517;;;;;;:::i;:::-;;:::i;48731:950::-;;;;;;:::i;:::-;;:::i;8287:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8388:18:0;8361:7;8388:18;;;:9;:18;;;;;;;8287:127;43812:103;;;:::i;18063:368::-;;;;;;:::i;:::-;;:::i;41304:128::-;;;;;;:::i;:::-;;:::i;44902:320::-;;;;;;:::i;:::-;;:::i;43161:87::-;43207:7;43234:6;-1:-1:-1;;;;;43234:6:0;43161:87;;;-1:-1:-1;;;;;4641:32:1;;;4623:51;;4611:2;4596:18;43161:87:0;4477:203:1;7215:104:0;;;:::i;11433:413::-;;;;;;:::i;:::-;;:::i;8627:175::-;;;;;;:::i;:::-;;:::i;47549:649::-;;;;;;:::i;:::-;;:::i;40593:645::-;;;;;;:::i;:::-;;:::i;8865:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8981:18:0;;;8954:7;8981:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8865:151;46763:51;;46804:10;46763:51;;44070:201;;;;;;:::i;:::-;;:::i;46688:19::-;;;;;-1:-1:-1;;;;;46688:19:0;;;46877:65;46917:25;46936:5;46917:8;:25;:::i;:::-;46877:65;:::o;6996:100::-;7050:13;7083:5;7076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6996:100;:::o;9163:169::-;9246:4;9263:39;4524:10;9286:7;9295:6;9263:8;:39::i;:::-;-1:-1:-1;9320:4:0;9163:169;;;;:::o;49910:300::-;50045:4;;50008;;-1:-1:-1;;;;;50045:4:0;4524:10;-1:-1:-1;;;;;50029:20:0;;50025:115;;;50066:36;50076:6;50084:9;50095:6;50066:9;:36::i;:::-;-1:-1:-1;50124:4:0;50117:11;;50025:115;50157:45;50176:6;50184:9;50195:6;50157:18;:45::i;:::-;50150:52;;49910:300;;;;;;:::o;49689:145::-;43207:7;43234:6;-1:-1:-1;;;;;43234:6:0;4524:10;43381:23;43373:68;;;;-1:-1:-1;;;43373:68:0;;;;;;;:::i;:::-;;;;;;;;;49756:4:::1;::::0;-1:-1:-1;;;;;49756:4:0::1;:18:::0;49748:56:::1;;;::::0;-1:-1:-1;;;49748:56:0;;7214:2:1;49748:56:0::1;::::0;::::1;7196:21:1::0;7253:2;7233:18;;;7226:30;7292:27;7272:18;;;7265:55;7337:18;;49748:56:0::1;7012:349:1::0;49748:56:0::1;49815:4;:11:::0;;-1:-1:-1;;;;;;49815:11:0::1;-1:-1:-1::0;;;;;49815:11:0;;;::::1;::::0;;;::::1;::::0;;49689:145::o;41562:115::-;41622:7;41649:20;:18;:20::i;:::-;41642:27;;41562:115;:::o;10715:215::-;4524:10;10803:4;10852:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10852:34:0;;;;;;;;;;10803:4;;10820:80;;10843:7;;10852:47;;10889:10;;10852:47;:::i;:::-;10820:8;:80::i;47188:353::-;47284:4;;47273:36;;-1:-1:-1;;;47273:36:0;;;;;160:25:1;;;47245:7:0;;;;-1:-1:-1;;;;;47284:4:0;;;;47273:27;;133:18:1;;47273:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47273:50:0;;;47265:97;;;;-1:-1:-1;;;47265:97:0;;7957:2:1;47265:97:0;;;7939:21:1;7996:2;7976:18;;;7969:30;8035:34;8015:18;;;8008:62;-1:-1:-1;;;8086:18:1;;;8079:32;8128:19;;47265:97:0;7755:398:1;47265:97:0;47375:19;47405;;;:10;:19;;;;;;47397:107;;46804:10;47397:107;;;-1:-1:-1;;47454:19:0;;;;:10;:19;;;;;;;47188:353::o;17653:91::-;17709:27;4524:10;17729:6;17709:5;:27::i;:::-;17653:91;:::o;48206:517::-;48280:7;;;48328:365;48352:8;:15;48348:1;:19;48328:365;;;48394:9;48406:5;:1;48410;48406:5;:::i;:::-;48394:17;;48389:147;48417:8;:15;48413:1;:19;48389:147;;;48481:8;48490:1;48481:11;;;;;;;;:::i;:::-;;;;;;;48466:8;48475:1;48466:11;;;;;;;;:::i;:::-;;;;;;;:26;;48458:62;;;;-1:-1:-1;;;48458:62:0;;8492:2:1;48458:62:0;;;8474:21:1;8531:2;8511:18;;;8504:30;-1:-1:-1;;;8550:18:1;;;8543:53;8613:18;;48458:62:0;8290:347:1;48458:62:0;48434:3;;;;:::i;:::-;;;;48389:147;;;;48552:14;48569:24;48581:8;48590:1;48581:11;;;;;;;;:::i;:::-;;;;;;;48569;:24::i;:::-;48552:41;-1:-1:-1;48612:11:0;;48608:74;;48652:14;48660:6;48652:5;:14;:::i;:::-;48644:22;;48608:74;-1:-1:-1;48369:3:0;;;;:::i;:::-;;;;48328:365;;;-1:-1:-1;48710:5:0;48206:517;-1:-1:-1;;48206:517:0:o;48731:950::-;48789:7;46804:10;48817:15;:32;48809:79;;;;-1:-1:-1;;;48809:79:0;;8984:2:1;48809:79:0;;;8966:21:1;9023:2;9003:18;;;8996:30;9062:34;9042:18;;;9035:62;-1:-1:-1;;;9113:18:1;;;9106:32;9155:19;;48809:79:0;8782:398:1;48809:79:0;48899:21;48940:9;48935:594;48959:8;:15;48955:1;:19;48935:594;;;49001:9;49013:5;:1;49017;49013:5;:::i;:::-;49001:17;;48996:147;49024:8;:15;49020:1;:19;48996:147;;;49088:8;49097:1;49088:11;;;;;;;;:::i;:::-;;;;;;;49073:8;49082:1;49073:11;;;;;;;;:::i;:::-;;;;;;;:26;;49065:62;;;;-1:-1:-1;;;49065:62:0;;8492:2:1;49065:62:0;;;8474:21:1;8531:2;8511:18;;;8504:30;-1:-1:-1;;;8550:18:1;;;8543:53;8613:18;;49065:62:0;8290:347:1;49065:62:0;49041:3;;;;:::i;:::-;;;;48996:147;;;;49159:15;49177:8;49186:1;49177:11;;;;;;;;:::i;:::-;;;;;;;49159:29;;49251:12;4524:10;;4444:98;49251:12;49222:4;;49211:36;;-1:-1:-1;;;49211:36:0;;;;;160:25:1;;;-1:-1:-1;;;;;49211:52:0;;;;49222:4;;;;49211:27;;133:18:1;;49211:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49211:52:0;;49203:94;;;;-1:-1:-1;;;49203:94:0;;9387:2:1;49203:94:0;;;9369:21:1;9426:2;9406:18;;;9399:30;9465:31;9445:18;;;9438:59;9514:18;;49203:94:0;9185:353:1;49203:94:0;49314:16;49333:20;49345:7;49333:11;:20::i;:::-;49314:39;-1:-1:-1;49372:13:0;;49368:150;;49422:24;49438:8;49422:13;:24;:::i;:::-;49465:19;;;;:10;:19;;;;;49487:15;49465:37;;49406:40;-1:-1:-1;49368:150:0;48981:548;;48976:3;;;;;:::i;:::-;;;;48935:594;;;-1:-1:-1;49549:18:0;49541:56;;;;-1:-1:-1;;;49541:56:0;;9745:2:1;49541:56:0;;;9727:21:1;9784:2;9764:18;;;9757:30;9823:27;9803:18;;;9796:55;9868:18;;49541:56:0;9543:349:1;49541:56:0;49608:34;4524:10;49628:13;49608:5;:34::i;:::-;49660:13;48731:950;-1:-1:-1;;48731:950:0:o;43812:103::-;43207:7;43234:6;-1:-1:-1;;;;;43234:6:0;4524:10;43381:23;43373:68;;;;-1:-1:-1;;;43373:68:0;;;;;;;:::i;:::-;43877:30:::1;43904:1;43877:18;:30::i;:::-;43812:103::o:0;18063:368::-;18140:24;18167:32;18177:7;4524:10;8865:151;:::i;18167:32::-;18140:59;;18238:6;18218:16;:26;;18210:75;;;;-1:-1:-1;;;18210:75:0;;10099:2:1;18210:75:0;;;10081:21:1;10138:2;10118:18;;;10111:30;10177:34;10157:18;;;10150:62;-1:-1:-1;;;10228:18:1;;;10221:34;10272:19;;18210:75:0;9897:400:1;18210:75:0;18321:58;18330:7;4524:10;18372:6;18353:16;:25;18321:8;:58::i;:::-;18401:22;18407:7;18416:6;18401:5;:22::i;:::-;18129:302;18063:368;;:::o;41304:128::-;-1:-1:-1;;;;;41400:14:0;;41373:7;41400:14;;;:7;:14;;;;;38281;41400:24;38189:114;44902:320;43207:7;43234:6;-1:-1:-1;;;;;43234:6:0;4524:10;43381:23;43373:68;;;;-1:-1:-1;;;43373:68:0;;;;;;;:::i;:::-;45004:25:::1;45032:35;45054:12;45032:21;:35::i;:::-;45004:63;;45096:17;45086:6;:27;;45078:89;;;::::0;-1:-1:-1;;;45078:89:0;;10504:2:1;45078:89:0::1;::::0;::::1;10486:21:1::0;10543:2;10523:18;;;10516:30;10582:34;10562:18;;;10555:62;-1:-1:-1;;;10633:18:1;;;10626:47;10690:19;;45078:89:0::1;10302:413:1::0;45078:89:0::1;45178:36;45189:12;45203:6;45211:2;45178:10;:36::i;:::-;44993:229;44902:320:::0;;;:::o;7215:104::-;7271:13;7304:7;7297:14;;;;;:::i;11433:413::-;4524:10;11526:4;11570:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11570:34:0;;;;;;;;;;11623:35;;;;11615:85;;;;-1:-1:-1;;;11615:85:0;;10922:2:1;11615:85:0;;;10904:21:1;10961:2;10941:18;;;10934:30;11000:34;10980:18;;;10973:62;-1:-1:-1;;;11051:18:1;;;11044:35;11096:19;;11615:85:0;10720:401:1;11615:85:0;11736:67;4524:10;11759:7;11787:15;11768:16;:34;11736:8;:67::i;:::-;-1:-1:-1;11834:4:0;;11433:413;-1:-1:-1;;;11433:413:0:o;8627:175::-;8713:4;8730:42;4524:10;8754:9;8765:6;8730:9;:42::i;47549:649::-;47608:7;47628:19;47650:18;47660:7;47650:9;:18::i;:::-;47628:40;;46860:10;47683:11;:27;47679:54;;-1:-1:-1;47732:1:0;;47549:649;-1:-1:-1;;47549:649:0:o;47679:54::-;47746:26;46860:10;47775:15;:30;:89;;46860:10;47775:89;;;47821:15;47775:89;47746:118;-1:-1:-1;47875:13:0;47908:32;47929:11;47746:118;47908:32;:::i;:::-;46917:25;46936:5;46917:8;:25;:::i;:::-;47891:50;;;;:::i;:::-;47875:66;;46804:10;47958:11;:29;47954:212;;;48031:4;;48020:44;;-1:-1:-1;;;48020:44:0;;;;;160:25:1;;;48004:13:0;;-1:-1:-1;;;;;48031:4:0;;48020:35;;133:18:1;;48020:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;48068:4;48020:52;:98;;48117:1;48020:98;;;46746:10;48020:98;48004:114;-1:-1:-1;48141:13:0;48004:114;48141:5;:13;:::i;:::-;48133:21;;47989:177;47954:212;48185:5;47549:649;-1:-1:-1;;;;47549:649:0:o;40593:645::-;40837:8;40818:15;:27;;40810:69;;;;-1:-1:-1;;;40810:69:0;;11913:2:1;40810:69:0;;;11895:21:1;11952:2;11932:18;;;11925:30;11991:31;11971:18;;;11964:59;12040:18;;40810:69:0;11711:353:1;40810:69:0;40892:18;40934:16;40952:5;40959:7;40968:5;40975:16;40985:5;40975:9;:16::i;:::-;40923:79;;;;;;12356:25:1;;;;-1:-1:-1;;;;;12455:15:1;;;12435:18;;;12428:43;12507:15;;;;12487:18;;;12480:43;12539:18;;;12532:34;12582:19;;;12575:35;12626:19;;;12619:35;;;12328:19;;40923:79:0;;;;;;;;;;;;40913:90;;;;;;40892:111;;41016:12;41031:28;41048:10;41031:16;:28::i;:::-;41016:43;;41072:14;41089:28;41103:4;41109:1;41112;41115;41089:13;:28::i;:::-;41072:45;;41146:5;-1:-1:-1;;;;;41136:15:0;:6;-1:-1:-1;;;;;41136:15:0;;41128:58;;;;-1:-1:-1;;;41128:58:0;;12867:2:1;41128:58:0;;;12849:21:1;12906:2;12886:18;;;12879:30;12945:32;12925:18;;;12918:60;12995:18;;41128:58:0;12665:354:1;41128:58:0;41199:31;41208:5;41215:7;41224:5;41199:8;:31::i;:::-;40799:439;;;40593:645;;;;;;;:::o;44070:201::-;43207:7;43234:6;-1:-1:-1;;;;;43234:6:0;4524:10;43381:23;43373:68;;;;-1:-1:-1;;;43373:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44159:22:0;::::1;44151:73;;;::::0;-1:-1:-1;;;44151:73:0;;13226:2:1;44151:73:0::1;::::0;::::1;13208:21:1::0;13265:2;13245:18;;;13238:30;13304:34;13284:18;;;13277:62;-1:-1:-1;;;13355:18:1;;;13348:36;13401:19;;44151:73:0::1;13024:402:1::0;44151:73:0::1;44235:28;44254:8;44235:18;:28::i;15117:380::-:0;-1:-1:-1;;;;;15253:19:0;;15245:68;;;;-1:-1:-1;;;15245:68:0;;13633:2:1;15245:68:0;;;13615:21:1;13672:2;13652:18;;;13645:30;13711:34;13691:18;;;13684:62;-1:-1:-1;;;13762:18:1;;;13755:34;13806:19;;15245:68:0;13431:400:1;15245:68:0;-1:-1:-1;;;;;15332:21:0;;15324:68;;;;-1:-1:-1;;;15324:68:0;;14038:2:1;15324:68:0;;;14020:21:1;14077:2;14057:18;;;14050:30;14116:34;14096:18;;;14089:62;-1:-1:-1;;;14167:18:1;;;14160:32;14209:19;;15324:68:0;13836:398:1;15324:68:0;-1:-1:-1;;;;;15405:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15457:32;;160:25:1;;;15457:32:0;;133:18:1;15457:32:0;;;;;;;15117:380;;;:::o;12336:733::-;-1:-1:-1;;;;;12476:20:0;;12468:70;;;;-1:-1:-1;;;12468:70:0;;14441:2:1;12468:70:0;;;14423:21:1;14480:2;14460:18;;;14453:30;14519:34;14499:18;;;14492:62;-1:-1:-1;;;14570:18:1;;;14563:35;14615:19;;12468:70:0;14239:401:1;12468:70:0;-1:-1:-1;;;;;12557:23:0;;12549:71;;;;-1:-1:-1;;;12549:71:0;;14847:2:1;12549:71:0;;;14829:21:1;14886:2;14866:18;;;14859:30;14925:34;14905:18;;;14898:62;-1:-1:-1;;;14976:18:1;;;14969:33;15019:19;;12549:71:0;14645:399:1;12549:71:0;-1:-1:-1;;;;;12717:17:0;;12693:21;12717:17;;;:9;:17;;;;;;12753:23;;;;12745:74;;;;-1:-1:-1;;;12745:74:0;;15251:2:1;12745:74:0;;;15233:21:1;15290:2;15270:18;;;15263:30;15329:34;15309:18;;;15302:62;-1:-1:-1;;;15380:18:1;;;15373:36;15426:19;;12745:74:0;15049:402:1;12745:74:0;-1:-1:-1;;;;;12855:17:0;;;;;;;:9;:17;;;;;;12875:22;;;12855:42;;12919:20;;;;;;;;:30;;12891:6;;12855:17;12919:30;;12891:6;;12919:30;:::i;:::-;;;;;;;;12984:9;-1:-1:-1;;;;;12967:35:0;12976:6;-1:-1:-1;;;;;12967:35:0;;12995:6;12967:35;;;;160:25:1;;148:2;133:18;;14:177;12967:35:0;;;;;;;;13015:46;18063:368;9814:492;9954:4;9971:36;9981:6;9989:9;10000:6;9971:9;:36::i;:::-;-1:-1:-1;;;;;10047:19:0;;10020:24;10047:19;;;:11;:19;;;;;;;;4524:10;10047:33;;;;;;;;10099:26;;;;10091:79;;;;-1:-1:-1;;;10091:79:0;;15658:2:1;10091:79:0;;;15640:21:1;15697:2;15677:18;;;15670:30;15736:34;15716:18;;;15709:62;-1:-1:-1;;;15787:18:1;;;15780:38;15835:19;;10091:79:0;15456:404:1;10091:79:0;10206:57;10215:6;4524:10;10256:6;10237:16;:25;10206:8;:57::i;:::-;-1:-1:-1;10294:4:0;;9814:492;-1:-1:-1;;;;9814:492:0:o;35902:314::-;35955:7;35987:4;-1:-1:-1;;;;;35996:12:0;35979:29;;:66;;;;;36029:16;36012:13;:33;35979:66;35975:234;;;-1:-1:-1;36069:24:0;;35902:314::o;35975:234::-;-1:-1:-1;36405:73:0;;;36155:10;36405:73;;;;18446:25:1;;;;36167:12:0;18487:18:1;;;18480:34;36181:15:0;18530:18:1;;;18523:34;36449:13:0;18573:18:1;;;18566:34;36472:4:0;18616:19:1;;;;18609:61;;;;36405:73:0;;;;;;;;;;18418:19:1;;;;36405:73:0;;;36395:84;;;;;;41562:115::o;14088:591::-;-1:-1:-1;;;;;14172:21:0;;14164:67;;;;-1:-1:-1;;;14164:67:0;;16067:2:1;14164:67:0;;;16049:21:1;16106:2;16086:18;;;16079:30;16145:34;16125:18;;;16118:62;-1:-1:-1;;;16196:18:1;;;16189:31;16237:19;;14164:67:0;15865:397:1;14164:67:0;-1:-1:-1;;;;;14331:18:0;;14306:22;14331:18;;;:9;:18;;;;;;14368:24;;;;14360:71;;;;-1:-1:-1;;;14360:71:0;;16469:2:1;14360:71:0;;;16451:21:1;16508:2;16488:18;;;16481:30;16547:34;16527:18;;;16520:62;-1:-1:-1;;;16598:18:1;;;16591:32;16640:19;;14360:71:0;16267:398:1;14360:71:0;-1:-1:-1;;;;;14467:18:0;;;;;;:9;:18;;;;;14488:23;;;14467:44;;14533:12;:22;;14505:6;;14467:18;14533:22;;14505:6;;14533:22;:::i;:::-;;;;-1:-1:-1;;14573:37:0;;160:25:1;;;14599:1:0;;-1:-1:-1;;;;;14573:37:0;;;;;148:2:1;133:18;14573:37:0;;;;;;;18129:302;18063:368;;:::o;13356:399::-;-1:-1:-1;;;;;13440:21:0;;13432:65;;;;-1:-1:-1;;;13432:65:0;;16872:2:1;13432:65:0;;;16854:21:1;16911:2;16891:18;;;16884:30;16950:33;16930:18;;;16923:61;17001:18;;13432:65:0;16670:355:1;13432:65:0;13588:6;13572:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13605:18:0;;;;;;:9;:18;;;;;:28;;13627:6;;13605:18;:28;;13627:6;;13605:28;:::i;:::-;;;;-1:-1:-1;;13649:37:0;;160:25:1;;;-1:-1:-1;;;;;13649:37:0;;;13666:1;;13649:37;;148:2:1;133:18;13649:37:0;;;;;;;13356:399;;:::o;44431:191::-;44505:16;44524:6;;-1:-1:-1;;;;;44541:17:0;;;-1:-1:-1;;;;;;44541:17:0;;;;;;44574:40;;44524:6;;;;;;;44574:40;;44505:16;44574:40;44494:128;44431:191;:::o;45230:155::-;45332:45;;-1:-1:-1;;;45332:45:0;;45371:4;45332:45;;;4623:51:1;45305:7:0;;-1:-1:-1;;;;;45332:30:0;;;;;4596:18:1;;45332:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45393:387::-;45603:46;;;-1:-1:-1;;;;;17411:32:1;;;45603:46:0;;;17393:51:1;17460:18;;;;17453:34;;;45603:46:0;;;;;;;;;;17366:18:1;;;;45603:46:0;;;;;;;-1:-1:-1;;;;;45603:46:0;-1:-1:-1;;;45603:46:0;;;45585:65;;-1:-1:-1;;;;45585:17:0;;;;:65;;45603:46;45585:65;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45549:101;;;;45669:7;:57;;;;-1:-1:-1;45681:11:0;;:16;;:44;;;45712:4;45701:24;;;;;;;;;;;;:::i;:::-;45661:111;;;;-1:-1:-1;;;45661:111:0;;17979:2:1;45661:111:0;;;17961:21:1;18018:2;17998:18;;;17991:30;18057:34;18037:18;;;18030:62;-1:-1:-1;;;18108:18:1;;;18101:39;18157:19;;45661:111:0;17777:405:1;45661:111:0;45471:309;;45393:387;;;:::o;41815:207::-;-1:-1:-1;;;;;41936:14:0;;41875:15;41936:14;;;:7;:14;;;;;38281;;38418:1;38400:19;;;;38281:14;41997:17;41892:130;41815:207;;;:::o;37129:167::-;37206:7;37233:55;37255:20;:18;:20::i;:::-;37277:10;32518:57;;-1:-1:-1;;;32518:57:0;;;18939:27:1;18982:11;;;18975:27;;;19018:12;;;19011:28;;;32481:7:0;;19055:12:1;;32518:57:0;;;;;;;;;;;;32508:68;;;;;;32501:75;;32388:196;;;;;30697:279;30825:7;30846:17;30865:18;30887:25;30898:4;30904:1;30907;30910;30887:10;:25::i;:::-;30845:67;;;;30923:18;30935:5;30923:11;:18::i;:::-;-1:-1:-1;30959:9:0;30697:279;-1:-1:-1;;;;;30697:279:0:o;28926:1632::-;29057:7;;29991:66;29978:79;;29974:163;;;-1:-1:-1;30090:1:0;;-1:-1:-1;30094:30:0;30074:51;;29974:163;30151:1;:7;;30156:2;30151:7;;:18;;;;;30162:1;:7;;30167:2;30162:7;;30151:18;30147:102;;;-1:-1:-1;30202:1:0;;-1:-1:-1;30206:30:0;30186:51;;30147:102;30363:24;;;30346:14;30363:24;;;;;;;;;19305:25:1;;;19378:4;19366:17;;19346:18;;;19339:45;;;;19400:18;;;19393:34;;;19443:18;;;19436:34;;;30363:24:0;;19277:19:1;;30363:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30363:24:0;;-1:-1:-1;;30363:24:0;;;-1:-1:-1;;;;;;;30402:20:0;;30398:103;;30455:1;30459:29;30439:50;;;;;;;30398:103;30521:6;-1:-1:-1;30529:20:0;;-1:-1:-1;28926:1632:0;;;;;;;;:::o;23588:643::-;23666:20;23657:5;:29;;;;;;;;:::i;:::-;;23653:571;;;23588:643;:::o;23653:571::-;23764:29;23755:5;:38;;;;;;;;:::i;:::-;;23751:473;;;23810:34;;-1:-1:-1;;;23810:34:0;;19815:2:1;23810:34:0;;;19797:21:1;19854:2;19834:18;;;19827:30;19893:26;19873:18;;;19866:54;19937:18;;23810:34:0;19613:348:1;23751:473:0;23875:35;23866:5;:44;;;;;;;;:::i;:::-;;23862:362;;;23927:41;;-1:-1:-1;;;23927:41:0;;20168:2:1;23927:41:0;;;20150:21:1;20207:2;20187:18;;;20180:30;20246:33;20226:18;;;20219:61;20297:18;;23927:41:0;19966:355:1;23862:362:0;23999:30;23990:5;:39;;;;;;;;:::i;:::-;;23986:238;;;24046:44;;-1:-1:-1;;;24046:44:0;;20528:2:1;24046:44:0;;;20510:21:1;20567:2;20547:18;;;20540:30;20606:34;20586:18;;;20579:62;-1:-1:-1;;;20657:18:1;;;20650:32;20699:19;;24046:44:0;20326:398:1;23986:238:0;24121:30;24112:5;:39;;;;;;;;:::i;:::-;;24108:116;;;24168:44;;-1:-1:-1;;;24168:44:0;;20931:2:1;24168:44:0;;;20913:21:1;20970:2;20950:18;;;20943:30;21009:34;20989:18;;;20982:62;-1:-1:-1;;;21060:18:1;;;21053:32;21102:19;;24168:44:0;20729:398:1;196:258;268:1;278:113;292:6;289:1;286:13;278:113;;;368:11;;;362:18;349:11;;;342:39;314:2;307:10;278:113;;;409:6;406:1;403:13;400:48;;;-1:-1:-1;;444:1:1;426:16;;419:27;196:258::o;459:383::-;608:2;597:9;590:21;571:4;640:6;634:13;683:6;678:2;667:9;663:18;656:34;699:66;758:6;753:2;742:9;738:18;733:2;725:6;721:15;699:66;:::i;:::-;826:2;805:15;-1:-1:-1;;801:29:1;786:45;;;;833:2;782:54;;459:383;-1:-1:-1;;459:383:1:o;847:131::-;-1:-1:-1;;;;;922:31:1;;912:42;;902:70;;968:1;965;958:12;983:315;1051:6;1059;1112:2;1100:9;1091:7;1087:23;1083:32;1080:52;;;1128:1;1125;1118:12;1080:52;1167:9;1154:23;1186:31;1211:5;1186:31;:::i;:::-;1236:5;1288:2;1273:18;;;;1260:32;;-1:-1:-1;;;983:315:1:o;1495:456::-;1572:6;1580;1588;1641:2;1629:9;1620:7;1616:23;1612:32;1609:52;;;1657:1;1654;1647:12;1609:52;1696:9;1683:23;1715:31;1740:5;1715:31;:::i;:::-;1765:5;-1:-1:-1;1822:2:1;1807:18;;1794:32;1835:33;1794:32;1835:33;:::i;:::-;1495:456;;1887:7;;-1:-1:-1;;;1941:2:1;1926:18;;;;1913:32;;1495:456::o;2145:247::-;2204:6;2257:2;2245:9;2236:7;2232:23;2228:32;2225:52;;;2273:1;2270;2263:12;2225:52;2312:9;2299:23;2331:31;2356:5;2331:31;:::i;2579:180::-;2638:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:52;;;2707:1;2704;2697:12;2659:52;-1:-1:-1;2730:23:1;;2579:180;-1:-1:-1;2579:180:1:o;2764:127::-;2825:10;2820:3;2816:20;2813:1;2806:31;2856:4;2853:1;2846:15;2880:4;2877:1;2870:15;2896:1115;2980:6;3011:2;3054;3042:9;3033:7;3029:23;3025:32;3022:52;;;3070:1;3067;3060:12;3022:52;3110:9;3097:23;3139:18;3180:2;3172:6;3169:14;3166:34;;;3196:1;3193;3186:12;3166:34;3234:6;3223:9;3219:22;3209:32;;3279:7;3272:4;3268:2;3264:13;3260:27;3250:55;;3301:1;3298;3291:12;3250:55;3337:2;3324:16;3359:2;3355;3352:10;3349:36;;;3365:18;;:::i;:::-;3411:2;3408:1;3404:10;3443:2;3437:9;3506:2;3502:7;3497:2;3493;3489:11;3485:25;3477:6;3473:38;3561:6;3549:10;3546:22;3541:2;3529:10;3526:18;3523:46;3520:72;;;3572:18;;:::i;:::-;3608:2;3601:22;3658:18;;;3692:15;;;;-1:-1:-1;3734:11:1;;;3730:20;;;3762:19;;;3759:39;;;3794:1;3791;3784:12;3759:39;3818:11;;;;3838:142;3854:6;3849:3;3846:15;3838:142;;;3920:17;;3908:30;;3871:12;;;;3958;;;;3838:142;;;3999:6;2896:1115;-1:-1:-1;;;;;;;;2896:1115:1:o;4016:456::-;4093:6;4101;4109;4162:2;4150:9;4141:7;4137:23;4133:32;4130:52;;;4178:1;4175;4168:12;4130:52;4217:9;4204:23;4236:31;4261:5;4236:31;:::i;:::-;4286:5;-1:-1:-1;4338:2:1;4323:18;;4310:32;;-1:-1:-1;4394:2:1;4379:18;;4366:32;4407:33;4366:32;4407:33;:::i;:::-;4459:7;4449:17;;;4016:456;;;;;:::o;4685:829::-;4796:6;4804;4812;4820;4828;4836;4844;4897:3;4885:9;4876:7;4872:23;4868:33;4865:53;;;4914:1;4911;4904:12;4865:53;4953:9;4940:23;4972:31;4997:5;4972:31;:::i;:::-;5022:5;-1:-1:-1;5079:2:1;5064:18;;5051:32;5092:33;5051:32;5092:33;:::i;:::-;5144:7;-1:-1:-1;5198:2:1;5183:18;;5170:32;;-1:-1:-1;5249:2:1;5234:18;;5221:32;;-1:-1:-1;5305:3:1;5290:19;;5277:33;5354:4;5341:18;;5329:31;;5319:59;;5374:1;5371;5364:12;5319:59;4685:829;;;;-1:-1:-1;4685:829:1;;;;5397:7;5451:3;5436:19;;5423:33;;-1:-1:-1;5503:3:1;5488:19;;;5475:33;;4685:829;-1:-1:-1;;4685:829:1:o;5519:388::-;5587:6;5595;5648:2;5636:9;5627:7;5623:23;5619:32;5616:52;;;5664:1;5661;5654:12;5616:52;5703:9;5690:23;5722:31;5747:5;5722:31;:::i;:::-;5772:5;-1:-1:-1;5829:2:1;5814:18;;5801:32;5842:33;5801:32;5842:33;:::i;:::-;5894:7;5884:17;;;5519:388;;;;;:::o;5912:127::-;5973:10;5968:3;5964:20;5961:1;5954:31;6004:4;6001:1;5994:15;6028:4;6025:1;6018:15;6044:217;6084:1;6110;6100:132;;6154:10;6149:3;6145:20;6142:1;6135:31;6189:4;6186:1;6179:15;6217:4;6214:1;6207:15;6100:132;-1:-1:-1;6246:9:1;;6044:217::o;6266:380::-;6345:1;6341:12;;;;6388;;;6409:61;;6463:4;6455:6;6451:17;6441:27;;6409:61;6516:2;6508:6;6505:14;6485:18;6482:38;6479:161;;;6562:10;6557:3;6553:20;6550:1;6543:31;6597:4;6594:1;6587:15;6625:4;6622:1;6615:15;6651:356;6853:2;6835:21;;;6872:18;;;6865:30;6931:34;6926:2;6911:18;;6904:62;6998:2;6983:18;;6651:356::o;7366:128::-;7406:3;7437:1;7433:6;7430:1;7427:13;7424:39;;;7443:18;;:::i;:::-;-1:-1:-1;7479:9:1;;7366:128::o;7499:251::-;7569:6;7622:2;7610:9;7601:7;7597:23;7593:32;7590:52;;;7638:1;7635;7628:12;7590:52;7670:9;7664:16;7689:31;7714:5;7689:31;:::i;8158:127::-;8219:10;8214:3;8210:20;8207:1;8200:31;8250:4;8247:1;8240:15;8274:4;8271:1;8264:15;8642:135;8681:3;-1:-1:-1;;8702:17:1;;8699:43;;;8722:18;;:::i;:::-;-1:-1:-1;8769:1:1;8758:13;;8642:135::o;11126:125::-;11166:4;11194:1;11191;11188:8;11185:34;;;11199:18;;:::i;:::-;-1:-1:-1;11236:9:1;;11126:125::o;11256:168::-;11296:7;11362:1;11358;11354:6;11350:14;11347:1;11344:21;11339:1;11332:9;11325:17;11321:45;11318:71;;;11369:18;;:::i;:::-;-1:-1:-1;11409:9:1;;11256:168::o;11429:277::-;11496:6;11549:2;11537:9;11528:7;11524:23;11520:32;11517:52;;;11565:1;11562;11555:12;11517:52;11597:9;11591:16;11650:5;11643:13;11636:21;11629:5;11626:32;11616:60;;11672:1;11669;11662:12;17030:184;17100:6;17153:2;17141:9;17132:7;17128:23;17124:32;17121:52;;;17169:1;17166;17159:12;17121:52;-1:-1:-1;17192:16:1;;17030:184;-1:-1:-1;17030:184:1:o;17498:274::-;17627:3;17665:6;17659:13;17681:53;17727:6;17722:3;17715:4;17707:6;17703:17;17681:53;:::i;:::-;17750:16;;;;;17498:274;-1:-1:-1;;17498:274:1:o;19481:127::-;19542:10;19537:3;19533:20;19530:1;19523:31;19573:4;19570:1;19563:15;19597:4;19594:1;19587:15
Swarm Source
ipfs://ea7033e333da990a5302de50d71beb1057b0f96e94bbd48823724f66976a6615
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.