Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 AGP
Holders
330
Market
Volume (24H)
0.099 ETH
Min Price (24H)
$171.09 @ 0.049474 ETH
Max Price (24H)
$171.18 @ 0.049500 ETH
Other Info
Token Contract
Balance
0 AGPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AnomalyGenesisPassport
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-06-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.17; /// @title Anomaly Genesis Passport /// @author Andre Costa @ LuxLabs.io // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * 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; address internal _oldOwner; uint256 internal lastOwnershipTransfer; 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 Returns the address of the previous owner. */ function oldOwner() public view virtual returns (address) { return _oldOwner; } /** * @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; _oldOwner = oldOwner_; _owner = newOwner; lastOwnershipTransfer = block.timestamp; emit OwnershipTransferred(oldOwner_, newOwner); } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } contract AnomalyGenesisPassport is ERC721, Ownable { /// @notice The base uri of the project string public baseURI; /// @notice The collection's max supply uint256 public maxSupply = 888; /// @notice Total reserved uint256 public reserved = 41; uint256 public reservedMinted; /// @notice Total guaranteed mint count uint256 public guaranteed; /// @dev Merkle tree root hash for guaranteed list bytes32 public rootForGuaranteed; /// @dev Merkle tree root hash for allowed list bytes32 public rootForOversubscribed; /// @dev Mapping to check if an address has already minted to avoid double mints on allow list mints mapping(address => bool) public mintedOnGuaranteed; mapping(address => bool) public mintedOnOversubscribed; /// @dev Counters library to track token id and counts using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; Counters.Counter private _guaranteedAllowListMintedCounter; Counters.Counter private _oversubscribedAllowListMintedCounter; /// @dev Different states of minting enum MintState { PAUSED, // Minting is paused GUARANTEED, // Guaranteed allow list OVERSUBSCRIBED, // General allow list PUBLIC // Open to public } MintState public mintState = MintState.PAUSED; constructor() ERC721("Anomaly Genesis Passport", "AGP") { baseURI = "ipfs:///"; } /// Base uri functions ///@notice Returns the base uri ///@return Base uri function _baseURI() internal view override returns (string memory) { return baseURI; } ///@notice Sets a new base uri ///@dev Only callable by owner ///@param newBaseURI The new base uri function setBaseURI(string memory newBaseURI) external onlyOwner { baseURI = newBaseURI; } ///@notice Returns the token uri ///@dev Updated to include json ///@param tokenId Token id function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(tokenId <= _tokenIdCounter.current(), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string.concat(baseURI, Strings.toString(tokenId), ".json") : ""; } /// Minting functions ///@notice Mints nft token for allowed list addresses ///@dev Uses Merkle tree proof ///@param proof The Merkle tree proof of the allow list address function mintAllowlist(bytes32[] calldata proof) external { /// Check if the sale is paused require(mintState == MintState.GUARANTEED || mintState == MintState.OVERSUBSCRIBED, "Not in allowlist minting states"); require(_tokenIdCounter.current() < maxSupply, "Max supply minted"); /// Check if user is on the allow list bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); /// Update the root based on the state bytes32 root; // If current state is for guaranteed mints, set to the guaranteed hash if (mintState == MintState.GUARANTEED) { /// Set the correct root hash root = rootForGuaranteed; /// Check that user has not minted on guaranteed list require(mintedOnGuaranteed[_msgSender()] == false, "User already minted on guaranteed list"); // Check there is sufficient guaranteed mint supply left require(totalGuaranteedAllowListMinted() < guaranteed, "Max guaranteed supply minted"); /// Increase the allow list minted count _guaranteedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnGuaranteed[_msgSender()] = true; } // If current state is for oversubscribed, set to the oversubscribed hash if (mintState == MintState.OVERSUBSCRIBED) { /// Set the correct root hash root = rootForOversubscribed; /// Check that user has not minted on oversubscribed list require(mintedOnOversubscribed[_msgSender()] == false, "User already minted on oversubscribed list"); /// Check there is sufficient oversubscribed supply left /// Balance for oversubscribed mint = max supply minus reserved and guaranteed count require(totalOversubscribedAllowListMinted() < maxSupply - reserved - guaranteed, "Max allow list supply minted"); _oversubscribedAllowListMintedCounter.increment(); /// Set that address has minted mintedOnOversubscribed[_msgSender()] = true; } // Check the merkle proof require(MerkleProof.verify(proof, root, leaf), "Invalid proof"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mints a token to caller addresses function mintPublic() external { require(mintState == MintState.PUBLIC, "Public mint inactive"); /// Check balance of supply /// Total supply minus reserved require(_tokenIdCounter.current() < maxSupply - reserved, "Max available public supply minted"); /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(_msgSender(), tokenId); } ///@notice Mint from reserve supply ///@dev Only callable by owner ///@param to Array of addresses to receive airdrop function mintFromReserved(address to, uint256 amount) external onlyOwner { /// Check balance of supply require(amount + reservedMinted <= reserved, "Amount exceeds reserved supply"); for(uint i; i < amount;) { /// Get current token id then increase it uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); /// Mint the token _safeMint(to, tokenId); /// Unchecked i to save gas unchecked { i++; } } reservedMinted += amount; } /// Other view and admin functions /** * @param merkleRoot_ The new merkle root */ function setMerkleRootGuaranteed(bytes32 merkleRoot_) external onlyOwner { rootForGuaranteed = merkleRoot_; } /** * @param merkleRoot_ The new merkle root */ function setMerkleOversubscribed(bytes32 merkleRoot_) external onlyOwner { rootForOversubscribed = merkleRoot_; } ///@notice Returns the total number of nftes minted function totalMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _tokenIdCounter.current(); } ///@notice Returns the current number of guaranteed allow list minted function totalGuaranteedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current(); } ///@notice Returns the current number of oversubscribed allow list minted function totalOversubscribedAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _oversubscribedAllowListMintedCounter.current(); } ///@notice Returns the total allow list minted function totalAllowListMinted() public view returns(uint256) { /// Token id starts from index 0 and counter is always incremented after mint, representing the total minted count return _guaranteedAllowListMintedCounter.current() + _oversubscribedAllowListMintedCounter.current(); } /** * Set mint state. * @param mintState_ The new state of the contract. */ function setMintState(uint256 mintState_) external onlyOwner { require(mintState_ < 5, "Invalid State!"); if (mintState_ == 0) { mintState = MintState.PAUSED; } else if (mintState_ == 1) { mintState = MintState.GUARANTEED; } else if (mintState_ == 2) { mintState = MintState.OVERSUBSCRIBED; } else { mintState = MintState.PUBLIC; } } ///@notice Function to update guaranteed mint count ///@param count New guaranteed mint count function setGuaranteedCount(uint256 count) external onlyOwner { guaranteed = count; } ///@notice Function to update reserved mint count ///@param count New reserved mint count function setReservedCount(uint256 count) external onlyOwner { reserved = count; } }
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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guaranteed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"enum AnomalyGenesisPassport.MintState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnGuaranteed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOnOversubscribed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForGuaranteed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rootForOversubscribed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setGuaranteedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleOversubscribed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootGuaranteed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintState_","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setReservedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGuaranteedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalOversubscribedAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610378600a556029600b556015805460ff1916905534801562000025575f80fd5b506040518060400160405280601881526020017f416e6f6d616c792047656e657369732050617373706f727400000000000000008152506040518060400160405280600381526020016204147560ec1b815250815f9081620000889190620001ee565b506001620000978282620001ee565b505050620000b4620000ae620000e960201b60201c565b620000ed565b604080518082019091526008815267697066733a2f2f2f60c01b6020820152600990620000e29082620001ee565b50620002b6565b3390565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200017757607f821691505b6020821081036200019657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001e9575f81815260208120601f850160051c81016020861015620001c45750805b601f850160051c820191505b81811015620001e557828155600101620001d0565b5050505b505050565b81516001600160401b038111156200020a576200020a6200014e565b62000222816200021b845462000162565b846200019c565b602080601f83116001811462000258575f8415620002405750858301515b5f19600386901b1c1916600185901b178555620001e5565b5f85815260208120601f198616915b82811015620002885788860151825594840194600190910190840162000267565b5085821015620002a657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61237980620002c45f395ff3fe608060405234801561000f575f80fd5b506004361061023f575f3560e01c8063893807aa11610135578063c87b56dd116100b4578063f204231411610079578063f2042314146104bf578063f2fde38b146104c7578063f487404f146104da578063f9c957d8146104eb578063fe60d12c146104fe575f80fd5b8063c87b56dd1461047f578063d371f76b14610492578063d5abeb011461049a578063e921dad2146104a3578063e985e9c5146104ac575f80fd5b8063a2309ff8116100fa578063a2309ff814610415578063ad8c3f331461041d578063b242223214610430578063b88d4fde14610452578063c051e38a14610465575f80fd5b8063893807aa146103bf5780638c874ebd146103e15780638da5cb5b146103e957806395d89b41146103fa578063a22cb46514610402575f80fd5b806335d5959a116101c15780636352211e116101865780636352211e146103765780636c0360eb146103895780636c96b0831461039157806370a08231146103a4578063715018a6146103b7575f80fd5b806335d5959a1461032c5780633c1860181461033f57806342842e0e146103475780634f297ccc1461035a57806355f804b314610363575f80fd5b80630bb862d1116102075780630bb862d1146102d357806316f9b707146102e657806323b872dd146102f95780632dc7b8551461030c57806332f4681c14610323575f80fd5b806301ffc9a71461024357806306fdde031461026b578063081812fc14610280578063084520b4146102ab578063095ea7b3146102c0575b5f80fd5b610256610251366004611bdc565b610507565b60405190151581526020015b60405180910390f35b610273610558565b6040516102629190611c4b565b61029361028e366004611c5d565b6105e7565b6040516001600160a01b039091168152602001610262565b6102be6102b9366004611c8f565b61060c565b005b6102be6102ce366004611c8f565b6106ef565b6102be6102e1366004611c5d565b610803565b6102be6102f4366004611c5d565b6108d4565b6102be610307366004611cb7565b610903565b610315600e5481565b604051908152602001610262565b610315600d5481565b6102be61033a366004611c5d565b610934565b610315610963565b6102be610355366004611cb7565b61097f565b610315600c5481565b6102be610371366004611d77565b610999565b610293610384366004611c5d565b6109d3565b610273610a32565b6102be61039f366004611dbc565b610abe565b6103156103b2366004611e2b565b610eac565b6102be610f30565b6102566103cd366004611e2b565b60116020525f908152604090205460ff1681565b6102be610f65565b6006546001600160a01b0316610293565b610273611050565b6102be610410366004611e44565b61105f565b61031561106a565b6102be61042b366004611c5d565b611074565b61025661043e366004611e2b565b60106020525f908152604090205460ff1681565b6102be610460366004611e7d565b6110a3565b6015546104729060ff1681565b6040516102629190611f08565b61027361048d366004611c5d565b6110db565b61031561118f565b610315600a5481565b610315600f5481565b6102566104ba366004611f2e565b611199565b6103156111c6565b6102be6104d5366004611e2b565b6111d0565b6007546001600160a01b0316610293565b6102be6104f9366004611c5d565b611268565b610315600b5481565b5f6001600160e01b031982166380ac58cd60e01b148061053757506001600160e01b03198216635b5e139f60e01b145b8061055257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461056690611f5f565b80601f016020809104026020016040519081016040528092919081815260200182805461059290611f5f565b80156105dd5780601f106105b4576101008083540402835291602001916105dd565b820191905f5260205f20905b8154815290600101906020018083116105c057829003601f168201915b5050505050905090565b5f6105f182611297565b505f908152600460205260409020546001600160a01b031690565b6006546001600160a01b0316331461063f5760405162461bcd60e51b815260040161063690611f97565b60405180910390fd5b600b54600c5461064f9083611fe0565b111561069d5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c7900006044820152606401610636565b5f5b818110156106d4575f6106b160125490565b90506106c1601280546001019055565b6106cb84826112f5565b5060010161069f565b5080600c5f8282546106e69190611fe0565b90915550505050565b5f6106f9826109d3565b9050806001600160a01b0316836001600160a01b0316036107665760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610636565b336001600160a01b038216148061078257506107828133611199565b6107f45760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610636565b6107fe838361130e565b505050565b6006546001600160a01b0316331461082d5760405162461bcd60e51b815260040161063690611f97565b6005811061086e5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b6044820152606401610636565b805f0361088c57601580545f919060ff19166001835b021790555050565b806001036108a757601580546001919060ff19168280610884565b806002036108c357601580546002919060ff1916600183610884565b6015805460ff191660031790555b50565b6006546001600160a01b031633146108fe5760405162461bcd60e51b815260040161063690611f97565b600b55565b61090d338261137b565b6109295760405162461bcd60e51b815260040161063690611ff3565b6107fe838383611450565b6006546001600160a01b0316331461095e5760405162461bcd60e51b815260040161063690611f97565b600e55565b5f61096d60145490565b60135461097a9190611fe0565b905090565b6107fe83838360405180602001604052805f8152506110a3565b6006546001600160a01b031633146109c35760405162461bcd60e51b815260040161063690611f97565b60096109cf828261208d565b5050565b5f818152600260205260408120546001600160a01b0316806105525760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610636565b60098054610a3f90611f5f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90611f5f565b8015610ab65780601f10610a8d57610100808354040283529160200191610ab6565b820191905f5260205f20905b815481529060010190602001808311610a9957829003601f168201915b505050505081565b600160155460ff166003811115610ad757610ad7611ef4565b1480610af95750600260155460ff166003811115610af757610af7611ef4565b145b610b455760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573006044820152606401610636565b600a5460125410610b8c5760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610636565b6040516bffffffffffffffffffffffff193360601b1660208201525f9060340160408051601f19818403018152919052805160209091012090505f600160155460ff166003811115610be057610be0611ef4565b03610cd75750600e54335f9081526010602052604090205460ff1615610c575760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b6064820152608401610636565b600d54610c626111c6565b10610caf5760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e746564000000006044820152606401610636565b610cbd601380546001019055565b335f908152601060205260409020805460ff191660011790555b600260155460ff166003811115610cf057610cf0611ef4565b03610e055750600f54335f9081526011602052604090205460ff1615610d6b5760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b6064820152608401610636565b600d54600b54600a54610d7e9190612149565b610d889190612149565b610d9061118f565b10610ddd5760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000006044820152606401610636565b610deb601480546001019055565b335f908152601160205260409020805460ff191660011790555b610e448484808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508592508691506115f39050565b610e805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610636565b5f610e8a60125490565b9050610e9a601280546001019055565b610ea5335b826112f5565b5050505050565b5f6001600160a01b038216610f155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610636565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610f5a5760405162461bcd60e51b815260040161063690611f97565b610f635f611608565b565b600360155460ff166003811115610f7e57610f7e611ef4565b14610fc25760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b6044820152606401610636565b600b54600a54610fd29190612149565b6012541061102d5760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b6064820152608401610636565b5f61103760125490565b9050611047601280546001019055565b6108d133610e9f565b60606001805461056690611f5f565b6109cf338383611669565b5f61097a60125490565b6006546001600160a01b0316331461109e5760405162461bcd60e51b815260040161063690611f97565b600f55565b6110ad338361137b565b6110c95760405162461bcd60e51b815260040161063690611ff3565b6110d584848484611736565b50505050565b60606110e660125490565b8211156111355760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610636565b5f6009805461114390611f5f565b90501161115e5760405180602001604052805f815250610552565b600961116983611769565b60405160200161117a92919061215c565b60405160208183030381529060405292915050565b5f61097a60145490565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f61097a60135490565b6006546001600160a01b031633146111fa5760405162461bcd60e51b815260040161063690611f97565b6001600160a01b03811661125f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610636565b6108d181611608565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161063690611f97565b600d55565b5f818152600260205260409020546001600160a01b03166108d15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610636565b6109cf828260405180602001604052805f815250611866565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611342826109d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b03166113f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610636565b5f6113fd836109d3565b9050806001600160a01b0316846001600160a01b0316148061142457506114248185611199565b806114485750836001600160a01b031661143d846105e7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611463826109d3565b6001600160a01b0316146114895760405162461bcd60e51b8152600401610636906121ef565b6001600160a01b0382166114eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610636565b826001600160a01b03166114fe826109d3565b6001600160a01b0316146115245760405162461bcd60e51b8152600401610636906121ef565b5f81815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290611566908490612149565b90915550506001600160a01b0382165f908152600360205260408120805460019290611593908490611fe0565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f826115ff8584611898565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b816001600160a01b0316836001600160a01b0316036116ca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610636565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611741848484611450565b61174d84848484611942565b6110d55760405162461bcd60e51b815260040161063690612234565b6060815f0361178f5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156117b857806117a281612286565b91506117b19050600a836122b2565b9150611792565b5f8167ffffffffffffffff8111156117d2576117d2611cf0565b6040519080825280601f01601f1916602001820160405280156117fc576020820181803683370190505b5090505b841561144857611811600183612149565b915061181e600a866122c5565b611829906030611fe0565b60f81b81838151811061183e5761183e6122d8565b60200101906001600160f81b03191690815f1a90535061185f600a866122b2565b9450611800565b6118708383611a3f565b61187c5f848484611942565b6107fe5760405162461bcd60e51b815260040161063690612234565b5f81815b845181101561193a575f8582815181106118b8576118b86122d8565b602002602001015190508083116118fa576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611927565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061193281612286565b91505061189c565b509392505050565b5f6001600160a01b0384163b15611a3457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119859033908990889088906004016122ec565b6020604051808303815f875af19250505080156119bf575060408051601f3d908101601f191682019092526119bc91810190612328565b60015b611a1a573d8080156119ec576040519150601f19603f3d011682016040523d82523d5f602084013e6119f1565b606091505b5080515f03611a125760405162461bcd60e51b815260040161063690612234565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611448565b506001949350505050565b6001600160a01b038216611a955760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610636565b5f818152600260205260409020546001600160a01b031615611af95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610636565b5f818152600260205260409020546001600160a01b031615611b5d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610636565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146108d1575f80fd5b5f60208284031215611bec575f80fd5b8135611bf781611bc7565b9392505050565b5f5b83811015611c18578181015183820152602001611c00565b50505f910152565b5f8151808452611c37816020860160208601611bfe565b601f01601f19169290920160200192915050565b602081525f611bf76020830184611c20565b5f60208284031215611c6d575f80fd5b5035919050565b80356001600160a01b0381168114611c8a575f80fd5b919050565b5f8060408385031215611ca0575f80fd5b611ca983611c74565b946020939093013593505050565b5f805f60608486031215611cc9575f80fd5b611cd284611c74565b9250611ce060208501611c74565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611d1e57611d1e611cf0565b604051601f8501601f19908116603f01168101908282118183101715611d4657611d46611cf0565b81604052809350858152868686011115611d5e575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611d87575f80fd5b813567ffffffffffffffff811115611d9d575f80fd5b8201601f81018413611dad575f80fd5b61144884823560208401611d04565b5f8060208385031215611dcd575f80fd5b823567ffffffffffffffff80821115611de4575f80fd5b818501915085601f830112611df7575f80fd5b813581811115611e05575f80fd5b8660208260051b8501011115611e19575f80fd5b60209290920196919550909350505050565b5f60208284031215611e3b575f80fd5b611bf782611c74565b5f8060408385031215611e55575f80fd5b611e5e83611c74565b915060208301358015158114611e72575f80fd5b809150509250929050565b5f805f8060808587031215611e90575f80fd5b611e9985611c74565b9350611ea760208601611c74565b925060408501359150606085013567ffffffffffffffff811115611ec9575f80fd5b8501601f81018713611ed9575f80fd5b611ee887823560208401611d04565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310611f2857634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8060408385031215611f3f575f80fd5b611f4883611c74565b9150611f5660208401611c74565b90509250929050565b600181811c90821680611f7357607f821691505b602082108103611f9157634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561055257610552611fcc565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f8211156107fe575f81815260208120601f850160051c810160208610156120665750805b601f850160051c820191505b8181101561208557828155600101612072565b505050505050565b815167ffffffffffffffff8111156120a7576120a7611cf0565b6120bb816120b58454611f5f565b84612040565b602080601f8311600181146120ee575f84156120d75750858301515b5f19600386901b1c1916600185901b178555612085565b5f85815260208120601f198616915b8281101561211c578886015182559484019460019091019084016120fd565b508582101561213957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561055257610552611fcc565b5f80845461216981611f5f565b600182811680156121815760018114612196576121c2565b60ff19841687528215158302870194506121c2565b885f526020805f205f5b858110156121b95781548a8201529084019082016121a0565b50505082870194505b5050505083516121d6818360208801611bfe565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f6001820161229757612297611fcc565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826122c0576122c061229e565b500490565b5f826122d3576122d361229e565b500690565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061231e90830184611c20565b9695505050505050565b5f60208284031215612338575f80fd5b8151611bf781611bc756fea26469706673582212201748566d90f0535e20de92cb723dcf8d1e5b63f7c15b8b4d1e27e4562485e20364736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061023f575f3560e01c8063893807aa11610135578063c87b56dd116100b4578063f204231411610079578063f2042314146104bf578063f2fde38b146104c7578063f487404f146104da578063f9c957d8146104eb578063fe60d12c146104fe575f80fd5b8063c87b56dd1461047f578063d371f76b14610492578063d5abeb011461049a578063e921dad2146104a3578063e985e9c5146104ac575f80fd5b8063a2309ff8116100fa578063a2309ff814610415578063ad8c3f331461041d578063b242223214610430578063b88d4fde14610452578063c051e38a14610465575f80fd5b8063893807aa146103bf5780638c874ebd146103e15780638da5cb5b146103e957806395d89b41146103fa578063a22cb46514610402575f80fd5b806335d5959a116101c15780636352211e116101865780636352211e146103765780636c0360eb146103895780636c96b0831461039157806370a08231146103a4578063715018a6146103b7575f80fd5b806335d5959a1461032c5780633c1860181461033f57806342842e0e146103475780634f297ccc1461035a57806355f804b314610363575f80fd5b80630bb862d1116102075780630bb862d1146102d357806316f9b707146102e657806323b872dd146102f95780632dc7b8551461030c57806332f4681c14610323575f80fd5b806301ffc9a71461024357806306fdde031461026b578063081812fc14610280578063084520b4146102ab578063095ea7b3146102c0575b5f80fd5b610256610251366004611bdc565b610507565b60405190151581526020015b60405180910390f35b610273610558565b6040516102629190611c4b565b61029361028e366004611c5d565b6105e7565b6040516001600160a01b039091168152602001610262565b6102be6102b9366004611c8f565b61060c565b005b6102be6102ce366004611c8f565b6106ef565b6102be6102e1366004611c5d565b610803565b6102be6102f4366004611c5d565b6108d4565b6102be610307366004611cb7565b610903565b610315600e5481565b604051908152602001610262565b610315600d5481565b6102be61033a366004611c5d565b610934565b610315610963565b6102be610355366004611cb7565b61097f565b610315600c5481565b6102be610371366004611d77565b610999565b610293610384366004611c5d565b6109d3565b610273610a32565b6102be61039f366004611dbc565b610abe565b6103156103b2366004611e2b565b610eac565b6102be610f30565b6102566103cd366004611e2b565b60116020525f908152604090205460ff1681565b6102be610f65565b6006546001600160a01b0316610293565b610273611050565b6102be610410366004611e44565b61105f565b61031561106a565b6102be61042b366004611c5d565b611074565b61025661043e366004611e2b565b60106020525f908152604090205460ff1681565b6102be610460366004611e7d565b6110a3565b6015546104729060ff1681565b6040516102629190611f08565b61027361048d366004611c5d565b6110db565b61031561118f565b610315600a5481565b610315600f5481565b6102566104ba366004611f2e565b611199565b6103156111c6565b6102be6104d5366004611e2b565b6111d0565b6007546001600160a01b0316610293565b6102be6104f9366004611c5d565b611268565b610315600b5481565b5f6001600160e01b031982166380ac58cd60e01b148061053757506001600160e01b03198216635b5e139f60e01b145b8061055257506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461056690611f5f565b80601f016020809104026020016040519081016040528092919081815260200182805461059290611f5f565b80156105dd5780601f106105b4576101008083540402835291602001916105dd565b820191905f5260205f20905b8154815290600101906020018083116105c057829003601f168201915b5050505050905090565b5f6105f182611297565b505f908152600460205260409020546001600160a01b031690565b6006546001600160a01b0316331461063f5760405162461bcd60e51b815260040161063690611f97565b60405180910390fd5b600b54600c5461064f9083611fe0565b111561069d5760405162461bcd60e51b815260206004820152601e60248201527f416d6f756e74206578636565647320726573657276656420737570706c7900006044820152606401610636565b5f5b818110156106d4575f6106b160125490565b90506106c1601280546001019055565b6106cb84826112f5565b5060010161069f565b5080600c5f8282546106e69190611fe0565b90915550505050565b5f6106f9826109d3565b9050806001600160a01b0316836001600160a01b0316036107665760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610636565b336001600160a01b038216148061078257506107828133611199565b6107f45760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610636565b6107fe838361130e565b505050565b6006546001600160a01b0316331461082d5760405162461bcd60e51b815260040161063690611f97565b6005811061086e5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642053746174652160901b6044820152606401610636565b805f0361088c57601580545f919060ff19166001835b021790555050565b806001036108a757601580546001919060ff19168280610884565b806002036108c357601580546002919060ff1916600183610884565b6015805460ff191660031790555b50565b6006546001600160a01b031633146108fe5760405162461bcd60e51b815260040161063690611f97565b600b55565b61090d338261137b565b6109295760405162461bcd60e51b815260040161063690611ff3565b6107fe838383611450565b6006546001600160a01b0316331461095e5760405162461bcd60e51b815260040161063690611f97565b600e55565b5f61096d60145490565b60135461097a9190611fe0565b905090565b6107fe83838360405180602001604052805f8152506110a3565b6006546001600160a01b031633146109c35760405162461bcd60e51b815260040161063690611f97565b60096109cf828261208d565b5050565b5f818152600260205260408120546001600160a01b0316806105525760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610636565b60098054610a3f90611f5f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90611f5f565b8015610ab65780601f10610a8d57610100808354040283529160200191610ab6565b820191905f5260205f20905b815481529060010190602001808311610a9957829003601f168201915b505050505081565b600160155460ff166003811115610ad757610ad7611ef4565b1480610af95750600260155460ff166003811115610af757610af7611ef4565b145b610b455760405162461bcd60e51b815260206004820152601f60248201527f4e6f7420696e20616c6c6f776c697374206d696e74696e6720737461746573006044820152606401610636565b600a5460125410610b8c5760405162461bcd60e51b815260206004820152601160248201527013585e081cdd5c1c1b1e481b5a5b9d1959607a1b6044820152606401610636565b6040516bffffffffffffffffffffffff193360601b1660208201525f9060340160408051601f19818403018152919052805160209091012090505f600160155460ff166003811115610be057610be0611ef4565b03610cd75750600e54335f9081526010602052604090205460ff1615610c575760405162461bcd60e51b815260206004820152602660248201527f5573657220616c7265616479206d696e746564206f6e2067756172616e74656560448201526519081b1a5cdd60d21b6064820152608401610636565b600d54610c626111c6565b10610caf5760405162461bcd60e51b815260206004820152601c60248201527f4d61782067756172616e7465656420737570706c79206d696e746564000000006044820152606401610636565b610cbd601380546001019055565b335f908152601060205260409020805460ff191660011790555b600260155460ff166003811115610cf057610cf0611ef4565b03610e055750600f54335f9081526011602052604090205460ff1615610d6b5760405162461bcd60e51b815260206004820152602a60248201527f5573657220616c7265616479206d696e746564206f6e206f76657273756273636044820152691c9a589959081b1a5cdd60b21b6064820152608401610636565b600d54600b54600a54610d7e9190612149565b610d889190612149565b610d9061118f565b10610ddd5760405162461bcd60e51b815260206004820152601c60248201527f4d617820616c6c6f77206c69737420737570706c79206d696e746564000000006044820152606401610636565b610deb601480546001019055565b335f908152601160205260409020805460ff191660011790555b610e448484808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508592508691506115f39050565b610e805760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b6044820152606401610636565b5f610e8a60125490565b9050610e9a601280546001019055565b610ea5335b826112f5565b5050505050565b5f6001600160a01b038216610f155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610636565b506001600160a01b03165f9081526003602052604090205490565b6006546001600160a01b03163314610f5a5760405162461bcd60e51b815260040161063690611f97565b610f635f611608565b565b600360155460ff166003811115610f7e57610f7e611ef4565b14610fc25760405162461bcd60e51b81526020600482015260146024820152735075626c6963206d696e7420696e61637469766560601b6044820152606401610636565b600b54600a54610fd29190612149565b6012541061102d5760405162461bcd60e51b815260206004820152602260248201527f4d617820617661696c61626c65207075626c696320737570706c79206d696e74604482015261195960f21b6064820152608401610636565b5f61103760125490565b9050611047601280546001019055565b6108d133610e9f565b60606001805461056690611f5f565b6109cf338383611669565b5f61097a60125490565b6006546001600160a01b0316331461109e5760405162461bcd60e51b815260040161063690611f97565b600f55565b6110ad338361137b565b6110c95760405162461bcd60e51b815260040161063690611ff3565b6110d584848484611736565b50505050565b60606110e660125490565b8211156111355760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610636565b5f6009805461114390611f5f565b90501161115e5760405180602001604052805f815250610552565b600961116983611769565b60405160200161117a92919061215c565b60405160208183030381529060405292915050565b5f61097a60145490565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b5f61097a60135490565b6006546001600160a01b031633146111fa5760405162461bcd60e51b815260040161063690611f97565b6001600160a01b03811661125f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610636565b6108d181611608565b6006546001600160a01b031633146112925760405162461bcd60e51b815260040161063690611f97565b600d55565b5f818152600260205260409020546001600160a01b03166108d15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610636565b6109cf828260405180602001604052805f815250611866565b5f81815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611342826109d3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f818152600260205260408120546001600160a01b03166113f35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610636565b5f6113fd836109d3565b9050806001600160a01b0316846001600160a01b0316148061142457506114248185611199565b806114485750836001600160a01b031661143d846105e7565b6001600160a01b0316145b949350505050565b826001600160a01b0316611463826109d3565b6001600160a01b0316146114895760405162461bcd60e51b8152600401610636906121ef565b6001600160a01b0382166114eb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610636565b826001600160a01b03166114fe826109d3565b6001600160a01b0316146115245760405162461bcd60e51b8152600401610636906121ef565b5f81815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290611566908490612149565b90915550506001600160a01b0382165f908152600360205260408120805460019290611593908490611fe0565b90915550505f8181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5f826115ff8584611898565b14949350505050565b60068054600780546001600160a01b03199081166001600160a01b03808516918217909355918516921682179092554260085560405182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b816001600160a01b0316836001600160a01b0316036116ca5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610636565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611741848484611450565b61174d84848484611942565b6110d55760405162461bcd60e51b815260040161063690612234565b6060815f0361178f5750506040805180820190915260018152600360fc1b602082015290565b815f5b81156117b857806117a281612286565b91506117b19050600a836122b2565b9150611792565b5f8167ffffffffffffffff8111156117d2576117d2611cf0565b6040519080825280601f01601f1916602001820160405280156117fc576020820181803683370190505b5090505b841561144857611811600183612149565b915061181e600a866122c5565b611829906030611fe0565b60f81b81838151811061183e5761183e6122d8565b60200101906001600160f81b03191690815f1a90535061185f600a866122b2565b9450611800565b6118708383611a3f565b61187c5f848484611942565b6107fe5760405162461bcd60e51b815260040161063690612234565b5f81815b845181101561193a575f8582815181106118b8576118b86122d8565b602002602001015190508083116118fa576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611927565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061193281612286565b91505061189c565b509392505050565b5f6001600160a01b0384163b15611a3457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119859033908990889088906004016122ec565b6020604051808303815f875af19250505080156119bf575060408051601f3d908101601f191682019092526119bc91810190612328565b60015b611a1a573d8080156119ec576040519150601f19603f3d011682016040523d82523d5f602084013e6119f1565b606091505b5080515f03611a125760405162461bcd60e51b815260040161063690612234565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611448565b506001949350505050565b6001600160a01b038216611a955760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610636565b5f818152600260205260409020546001600160a01b031615611af95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610636565b5f818152600260205260409020546001600160a01b031615611b5d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610636565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146108d1575f80fd5b5f60208284031215611bec575f80fd5b8135611bf781611bc7565b9392505050565b5f5b83811015611c18578181015183820152602001611c00565b50505f910152565b5f8151808452611c37816020860160208601611bfe565b601f01601f19169290920160200192915050565b602081525f611bf76020830184611c20565b5f60208284031215611c6d575f80fd5b5035919050565b80356001600160a01b0381168114611c8a575f80fd5b919050565b5f8060408385031215611ca0575f80fd5b611ca983611c74565b946020939093013593505050565b5f805f60608486031215611cc9575f80fd5b611cd284611c74565b9250611ce060208501611c74565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611d1e57611d1e611cf0565b604051601f8501601f19908116603f01168101908282118183101715611d4657611d46611cf0565b81604052809350858152868686011115611d5e575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611d87575f80fd5b813567ffffffffffffffff811115611d9d575f80fd5b8201601f81018413611dad575f80fd5b61144884823560208401611d04565b5f8060208385031215611dcd575f80fd5b823567ffffffffffffffff80821115611de4575f80fd5b818501915085601f830112611df7575f80fd5b813581811115611e05575f80fd5b8660208260051b8501011115611e19575f80fd5b60209290920196919550909350505050565b5f60208284031215611e3b575f80fd5b611bf782611c74565b5f8060408385031215611e55575f80fd5b611e5e83611c74565b915060208301358015158114611e72575f80fd5b809150509250929050565b5f805f8060808587031215611e90575f80fd5b611e9985611c74565b9350611ea760208601611c74565b925060408501359150606085013567ffffffffffffffff811115611ec9575f80fd5b8501601f81018713611ed9575f80fd5b611ee887823560208401611d04565b91505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b6020810160048310611f2857634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8060408385031215611f3f575f80fd5b611f4883611c74565b9150611f5660208401611c74565b90509250929050565b600181811c90821680611f7357607f821691505b602082108103611f9157634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561055257610552611fcc565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f8211156107fe575f81815260208120601f850160051c810160208610156120665750805b601f850160051c820191505b8181101561208557828155600101612072565b505050505050565b815167ffffffffffffffff8111156120a7576120a7611cf0565b6120bb816120b58454611f5f565b84612040565b602080601f8311600181146120ee575f84156120d75750858301515b5f19600386901b1c1916600185901b178555612085565b5f85815260208120601f198616915b8281101561211c578886015182559484019460019091019084016120fd565b508582101561213957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b8181038181111561055257610552611fcc565b5f80845461216981611f5f565b600182811680156121815760018114612196576121c2565b60ff19841687528215158302870194506121c2565b885f526020805f205f5b858110156121b95781548a8201529084019082016121a0565b50505082870194505b5050505083516121d6818360208801611bfe565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f6001820161229757612297611fcc565b5060010190565b634e487b7160e01b5f52601260045260245ffd5b5f826122c0576122c061229e565b500490565b5f826122d3576122d361229e565b500690565b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061231e90830184611c20565b9695505050505050565b5f60208284031215612338575f80fd5b8151611bf781611bc756fea26469706673582212201748566d90f0535e20de92cb723dcf8d1e5b63f7c15b8b4d1e27e4562485e20364736f6c63430008140033
Deployed Bytecode Sourcemap
42370:9281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27086:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27086:305:0;;;;;;;;28014:100;;;:::i;:::-;;;;;;;:::i;29526:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;29526:171:0;1533:203:1;48206:631:0;;;;;;:::i;:::-;;:::i;:::-;;29044:416;;;;;;:::i;:::-;;:::i;50745:481::-;;;;;;:::i;:::-;;:::i;51548:96::-;;;;;;:::i;:::-;;:::i;30226:301::-;;;;;;:::i;:::-;;:::i;42835:32::-;;;;;;;;;2657:25:1;;;2645:2;2630:18;42835:32:0;2511:177:1;42744:25:0;;;;;;48952:123;;;;;;:::i;:::-;;:::i;50334:304::-;;;:::i;30598:151::-;;;;;;:::i;:::-;;:::i;42660:29::-;;;;;;44203:104;;;;;;:::i;:::-;;:::i;27724:223::-;;;;;;:::i;:::-;;:::i;42476:21::-;;;:::i;44921:2563::-;;;;;;:::i;:::-;;:::i;27455:207::-;;;;;;:::i;:::-;;:::i;21932:103::-;;;:::i;43138:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47543:521;;;:::i;21106:87::-;21179:6;;-1:-1:-1;;;;;21179:6:0;21106:87;;28183:104;;;:::i;29769:155::-;;;;;;:::i;:::-;;:::i;49340:227::-;;;:::i;49148:127::-;;;;;;:::i;:::-;;:::i;43080:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30820:279;;;;;;:::i;:::-;;:::i;43728:45::-;;;;;;;;;;;;;;;;:::i;44423:298::-;;;;;;:::i;:::-;;:::i;50001:272::-;;;:::i;42552:30::-;;;;;;42929:36;;;;;;29995:164;;;;;;:::i;:::-;;:::i;49650:264::-;;;:::i;22190:201::-;;;;;;:::i;:::-;;:::i;21275:93::-;21351:9;;-1:-1:-1;;;;;21351:9:0;21275:93;;51339:100;;;;;;:::i;:::-;;:::i;42624:28::-;;;;;;27086:305;27188:4;-1:-1:-1;;;;;;27225:40:0;;-1:-1:-1;;;27225:40:0;;:105;;-1:-1:-1;;;;;;;27282:48:0;;-1:-1:-1;;;27282:48:0;27225:105;:158;;;-1:-1:-1;;;;;;;;;;25804:40:0;;;27347:36;27205:178;27086:305;-1:-1:-1;;27086:305:0:o;28014:100::-;28068:13;28101:5;28094:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28014:100;:::o;29526:171::-;29602:7;29622:23;29637:7;29622:14;:23::i;:::-;-1:-1:-1;29665:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29665:24:0;;29526:171::o;48206:631::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;;;;;;;;;48362:8:::1;::::0;48344:14:::1;::::0;48335:23:::1;::::0;:6;:23:::1;:::i;:::-;:35;;48327:78;;;::::0;-1:-1:-1;;;48327:78:0;;8074:2:1;48327:78:0::1;::::0;::::1;8056:21:1::0;8113:2;8093:18;;;8086:30;8152:32;8132:18;;;8125:60;8202:18;;48327:78:0::1;7872:354:1::0;48327:78:0::1;48431:6;48427:368;48443:6;48439:1;:10;48427:368;;;48522:15;48540:25;:15;1047:14:::0;;955:114;48540:25:::1;48522:43;;48580:27;:15;1166:19:::0;;1184:1;1166:19;;;1077:127;48580:27:::1;48656:22;48666:2;48670:7;48656:9;:22::i;:::-;-1:-1:-1::0;48765:3:0::1;;48427:368;;;;48823:6;48805:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;48206:631:0:o;29044:416::-;29125:13;29141:23;29156:7;29141:14;:23::i;:::-;29125:39;;29189:5;-1:-1:-1;;;;;29183:11:0;:2;-1:-1:-1;;;;;29183:11:0;;29175:57;;;;-1:-1:-1;;;29175:57:0;;8433:2:1;29175:57:0;;;8415:21:1;8472:2;8452:18;;;8445:30;8511:34;8491:18;;;8484:62;-1:-1:-1;;;8562:18:1;;;8555:31;8603:19;;29175:57:0;8231:397:1;29175:57:0;19830:10;-1:-1:-1;;;;;29267:21:0;;;;:62;;-1:-1:-1;29292:37:0;29309:5;19830:10;29995:164;:::i;29292:37::-;29245:173;;;;-1:-1:-1;;;29245:173:0;;8835:2:1;29245:173:0;;;8817:21:1;8874:2;8854:18;;;8847:30;8913:34;8893:18;;;8886:62;8984:31;8964:18;;;8957:59;9033:19;;29245:173:0;8633:425:1;29245:173:0;29431:21;29440:2;29444:7;29431:8;:21::i;:::-;29114:346;29044:416;;:::o;50745:481::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;50838:1:::1;50825:10;:14;50817:41;;;::::0;-1:-1:-1;;;50817:41:0;;9265:2:1;50817:41:0::1;::::0;::::1;9247:21:1::0;9304:2;9284:18;;;9277:30;-1:-1:-1;;;9323:18:1;;;9316:44;9377:18;;50817:41:0::1;9063:338:1::0;50817:41:0::1;50883:10;50897:1;50883:15:::0;50879:340:::1;;50915:9;:28:::0;;50927:16:::1;::::0;50915:9;-1:-1:-1;;50915:28:0::1;::::0;50927:16;50915:28:::1;;;;;;50745:481:::0;:::o;50879:340::-:1;50974:10;50988:1;50974:15:::0;50970:249:::1;;51006:9;:32:::0;;51018:20:::1;::::0;51006:9;-1:-1:-1;;51006:32:0::1;51018:20:::0;;51006:32:::1;::::0;50970:249:::1;51069:10;51083:1;51069:15:::0;51065:154:::1;;51101:9;:36:::0;;51113:24:::1;::::0;51101:9;-1:-1:-1;;51101:36:0::1;::::0;51113:24;51101:36:::1;::::0;51065:154:::1;51179:9;:28:::0;;-1:-1:-1;;51179:28:0::1;51191:16;51179:28;::::0;;51065:154:::1;50745:481:::0;:::o;51548:96::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;51619:8:::1;:16:::0;51548:96::o;30226:301::-;30387:41;19830:10;30420:7;30387:18;:41::i;:::-;30379:99;;;;-1:-1:-1;;;30379:99:0;;;;;;;:::i;:::-;30491:28;30501:4;30507:2;30511:7;30491:9;:28::i;48952:123::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;49036:17:::1;:31:::0;48952:123::o;50334:304::-;50386:7;50582:47;:37;1047:14;;955:114;50582:47;50536:33;1047:14;50536:93;;;;:::i;:::-;50529:100;;50334:304;:::o;30598:151::-;30702:39;30719:4;30725:2;30729:7;30702:39;;;;;;;;;;;;:16;:39::i;44203:104::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;44279:7:::1;:20;44289:10:::0;44279:7;:20:::1;:::i;:::-;;44203:104:::0;:::o;27724:223::-;27796:7;32457:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32457:16:0;;27860:56;;;;-1:-1:-1;;;27860:56:0;;12226:2:1;27860:56:0;;;12208:21:1;12265:2;12245:18;;;12238:30;-1:-1:-1;;;12284:18:1;;;12277:54;12348:18;;27860:56:0;12024:348:1;42476:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44921:2563::-;45052:20;45039:9;;;;:33;;;;;;;;:::i;:::-;;:74;;;-1:-1:-1;45089:24:0;45076:9;;;;:37;;;;;;;;:::i;:::-;;45039:74;45031:118;;;;-1:-1:-1;;;45031:118:0;;12579:2:1;45031:118:0;;;12561:21:1;12618:2;12598:18;;;12591:30;12657:33;12637:18;;;12630:61;12708:18;;45031:118:0;12377:355:1;45031:118:0;45198:9;;45170:15;1047:14;45170:37;45162:67;;;;-1:-1:-1;;;45162:67:0;;12939:2:1;45162:67:0;;;12921:21:1;12978:2;12958:18;;;12951:30;-1:-1:-1;;;12997:18:1;;;12990:47;13054:18;;45162:67:0;12737:341:1;45162:67:0;45316:30;;-1:-1:-1;;19830:10:0;13232:2:1;13228:15;13224:53;45316:30:0;;;13212:66:1;45291:12:0;;13294::1;;45316:30:0;;;-1:-1:-1;;45316:30:0;;;;;;;;;45306:41;;45316:30;45306:41;;;;;-1:-1:-1;45416:12:0;45539:20;45526:9;;;;:33;;;;;;;;:::i;:::-;;45522:728;;-1:-1:-1;45628:17:0;;19830:10;45738:32;;;;:18;:32;;;;;;;;:41;45730:92;;;;-1:-1:-1;;;45730:92:0;;13519:2:1;45730:92:0;;;13501:21:1;13558:2;13538:18;;;13531:30;13597:34;13577:18;;;13570:62;-1:-1:-1;;;13648:18:1;;;13641:36;13694:19;;45730:92:0;13317:402:1;45730:92:0;45965:10;;45930:32;:30;:32::i;:::-;:45;45922:86;;;;-1:-1:-1;;;45922:86:0;;13926:2:1;45922:86:0;;;13908:21:1;13965:2;13945:18;;;13938:30;14004;13984:18;;;13977:58;14052:18;;45922:86:0;13724:352:1;45922:86:0;46092:45;:33;1166:19;;1184:1;1166:19;;;1077:127;46092:45;19830:10;46199:32;;;;:18;:32;;;;;:39;;-1:-1:-1;;46199:39:0;46234:4;46199:39;;;45522:728;46363:24;46350:9;;;;:37;;;;;;;;:::i;:::-;;46346:802;;-1:-1:-1;46456:21:0;;19830:10;46574:36;;;;:22;:36;;;;;;;;:45;46566:100;;;;-1:-1:-1;;;46566:100:0;;14283:2:1;46566:100:0;;;14265:21:1;14322:2;14302:18;;;14295:30;14361:34;14341:18;;;14334:62;-1:-1:-1;;;14412:18:1;;;14405:40;14462:19;;46566:100:0;14081:406:1;46566:100:0;46921:10;;46910:8;;46898:9;;:20;;;;:::i;:::-;:33;;;;:::i;:::-;46859:36;:34;:36::i;:::-;:72;46851:113;;;;-1:-1:-1;;;46851:113:0;;14827:2:1;46851:113:0;;;14809:21:1;14866:2;14846:18;;;14839:30;14905;14885:18;;;14878:58;14953:18;;46851:113:0;14625:352:1;46851:113:0;46982:49;:37;1166:19;;1184:1;1166:19;;;1077:127;46982:49;19830:10;47093:36;;;;:22;:36;;;;;:43;;-1:-1:-1;;47093:43:0;47132:4;47093:43;;;46346:802;47203:37;47222:5;;47203:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47229:4:0;;-1:-1:-1;47235:4:0;;-1:-1:-1;47203:18:0;;-1:-1:-1;47203:37:0:i;:::-;47195:63;;;;-1:-1:-1;;;47195:63:0;;15184:2:1;47195:63:0;;;15166:21:1;15223:2;15203:18;;;15196:30;-1:-1:-1;;;15242:18:1;;;15235:43;15295:18;;47195:63:0;14982:337:1;47195:63:0;47322:15;47340:25;:15;1047:14;;955:114;47340:25;47322:43;;47376:27;:15;1166:19;;1184:1;1166:19;;;1077:127;47376:27;47444:32;19830:10;47454:12;47468:7;47444:9;:32::i;:::-;44979:2505;;;44921:2563;;:::o;27455:207::-;27527:7;-1:-1:-1;;;;;27555:19:0;;27547:73;;;;-1:-1:-1;;;27547:73:0;;15526:2:1;27547:73:0;;;15508:21:1;15565:2;15545:18;;;15538:30;15604:34;15584:18;;;15577:62;-1:-1:-1;;;15655:18:1;;;15648:39;15704:19;;27547:73:0;15324:405:1;27547:73:0;-1:-1:-1;;;;;;27638:16:0;;;;;:9;:16;;;;;;;27455:207::o;21932:103::-;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;21997:30:::1;22024:1;21997:18;:30::i;:::-;21932:103::o:0;47543:521::-;47608:16;47595:9;;;;:29;;;;;;;;:::i;:::-;;47587:62;;;;-1:-1:-1;;;47587:62:0;;15936:2:1;47587:62:0;;;15918:21:1;15975:2;15955:18;;;15948:30;-1:-1:-1;;;15994:18:1;;;15987:50;16054:18;;47587:62:0;15734:344:1;47587:62:0;47790:8;;47778:9;;:20;;;;:::i;:::-;47750:15;1047:14;47750:48;47742:95;;;;-1:-1:-1;;;47742:95:0;;16285:2:1;47742:95:0;;;16267:21:1;16324:2;16304:18;;;16297:30;16363:34;16343:18;;;16336:62;-1:-1:-1;;;16414:18:1;;;16407:32;16456:19;;47742:95:0;16083:398:1;47742:95:0;47902:15;47920:25;:15;1047:14;;955:114;47920:25;47902:43;;47956:27;:15;1166:19;;1184:1;1166:19;;;1077:127;47956:27;48024:32;19830:10;48034:12;19750:98;28183:104;28239:13;28272:7;28265:14;;;;;:::i;29769:155::-;29864:52;19830:10;29897:8;29907;29864:18;:52::i;49340:227::-;49383:7;49533:25;:15;1047:14;;955:114;49148:127;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;49232:21:::1;:35:::0;49148:127::o;30820:279::-;30951:41;19830:10;30984:7;30951:18;:41::i;:::-;30943:99;;;;-1:-1:-1;;;30943:99:0;;;;;;;:::i;:::-;31053:38;31067:4;31073:2;31077:7;31086:4;31053:13;:38::i;:::-;30820:279;;;;:::o;44423:298::-;44496:13;44541:25;:15;1047:14;;955:114;44541:25;44530:7;:36;;44522:80;;;;-1:-1:-1;;;44522:80:0;;16688:2:1;44522:80:0;;;16670:21:1;16727:2;16707:18;;;16700:30;16766:33;16746:18;;;16739:61;16817:18;;44522:80:0;16486:355:1;44522:80:0;44646:1;44628:7;44622:21;;;;;:::i;:::-;;;:25;:91;;;;;;;;;;;;;;;;;44664:7;44673:25;44690:7;44673:16;:25::i;:::-;44650:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44615:98;44423:298;-1:-1:-1;;44423:298:0:o;50001:272::-;50067:7;50217:47;:37;1047:14;;955:114;29995:164;-1:-1:-1;;;;;30116:25:0;;;30092:4;30116:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29995:164::o;49650:264::-;49712:7;49862:43;:33;1047:14;;955:114;22190:201;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22279:22:0;::::1;22271:73;;;::::0;-1:-1:-1;;;22271:73:0;;18229:2:1;22271:73:0::1;::::0;::::1;18211:21:1::0;18268:2;18248:18;;;18241:30;18307:34;18287:18;;;18280:62;-1:-1:-1;;;18358:18:1;;;18351:36;18404:19;;22271:73:0::1;18027:402:1::0;22271:73:0::1;22355:28;22374:8;22355:18;:28::i;51339:100::-:0;21179:6;;-1:-1:-1;;;;;21179:6:0;19830:10;21501:23;21493:68;;;;-1:-1:-1;;;21493:68:0;;;;;;;:::i;:::-;51412:10:::1;:18:::0;51339:100::o;38520:135::-;32859:4;32457:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32457:16:0;38594:53;;;;-1:-1:-1;;;38594:53:0;;12226:2:1;38594:53:0;;;12208:21:1;12265:2;12245:18;;;12238:30;-1:-1:-1;;;12284:18:1;;;12277:54;12348:18;;38594:53:0;12024:348:1;33779:110:0;33855:26;33865:2;33869:7;33855:26;;;;;;;;;;;;:9;:26::i;37833:174::-;37908:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37908:29:0;-1:-1:-1;;;;;37908:29:0;;;;;;;;:24;;37962:23;37908:24;37962:14;:23::i;:::-;-1:-1:-1;;;;;37953:46:0;;;;;;;;;;;37833:174;;:::o;33089:348::-;33182:4;32457:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32457:16:0;33199:73;;;;-1:-1:-1;;;33199:73:0;;18636:2:1;33199:73:0;;;18618:21:1;18675:2;18655:18;;;18648:30;18714:34;18694:18;;;18687:62;-1:-1:-1;;;18765:18:1;;;18758:42;18817:19;;33199:73:0;18434:408:1;33199:73:0;33283:13;33299:23;33314:7;33299:14;:23::i;:::-;33283:39;;33352:5;-1:-1:-1;;;;;33341:16:0;:7;-1:-1:-1;;;;;33341:16:0;;:52;;;;33361:32;33378:5;33385:7;33361:16;:32::i;:::-;33341:87;;;;33421:7;-1:-1:-1;;;;;33397:31:0;:20;33409:7;33397:11;:20::i;:::-;-1:-1:-1;;;;;33397:31:0;;33341:87;33333:96;33089:348;-1:-1:-1;;;;33089:348:0:o;36929:785::-;37054:4;-1:-1:-1;;;;;37027:31:0;:23;37042:7;37027:14;:23::i;:::-;-1:-1:-1;;;;;37027:31:0;;37019:81;;;;-1:-1:-1;;;37019:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37119:16:0;;37111:65;;;;-1:-1:-1;;;37111:65:0;;19455:2:1;37111:65:0;;;19437:21:1;19494:2;19474:18;;;19467:30;19533:34;19513:18;;;19506:62;-1:-1:-1;;;19584:18:1;;;19577:34;19628:19;;37111:65:0;19253:400:1;37111:65:0;37361:4;-1:-1:-1;;;;;37334:31:0;:23;37349:7;37334:14;:23::i;:::-;-1:-1:-1;;;;;37334:31:0;;37326:81;;;;-1:-1:-1;;;37326:81:0;;;;;;;:::i;:::-;37479:24;;;;:15;:24;;;;;;;;37472:31;;-1:-1:-1;;;;;;37472:31:0;;;-1:-1:-1;;;;;37516:15:0;;;;:9;:15;;;;;:20;;37472:31;;37479:24;37516:20;;37472:31;;37516:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37547:13:0;;;;;;:9;:13;;;;;:18;;37564:1;;37547:13;:18;;37564:1;;37547:18;:::i;:::-;;;;-1:-1:-1;;37586:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37586:21:0;-1:-1:-1;;;;;37586:21:0;;;;;;;;;37625:27;;37586:16;;37625:27;;;;;;;29114:346;29044:416;;:::o;2383:190::-;2508:4;2561;2532:25;2545:5;2552:4;2532:12;:25::i;:::-;:33;;2383:190;-1:-1:-1;;;;2383:190:0:o;22551:275::-;22645:6;;;22662:9;:21;;-1:-1:-1;;;;;;22662:21:0;;;-1:-1:-1;;;;;22645:6:0;;;22662:21;;;;;;22694:17;;;;;;;;;;22746:15;22722:21;:39;22777:41;;22645:6;;22777:41;;22625:17;;22777:41;22614:212;22551:275;:::o;38150:281::-;38271:8;-1:-1:-1;;;;;38262:17:0;:5;-1:-1:-1;;;;;38262:17:0;;38254:55;;;;-1:-1:-1;;;38254:55:0;;19860:2:1;38254:55:0;;;19842:21:1;19899:2;19879:18;;;19872:30;19938:27;19918:18;;;19911:55;19983:18;;38254:55:0;19658:349:1;38254:55:0;-1:-1:-1;;;;;38320:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;38320:46:0;;;;;;;;;;38382:41;;540::1;;;38382::0;;513:18:1;38382:41:0;;;;;;;38150:281;;;:::o;31980:270::-;32093:28;32103:4;32109:2;32113:7;32093:9;:28::i;:::-;32140:47;32163:4;32169:2;32173:7;32182:4;32140:22;:47::i;:::-;32132:110;;;;-1:-1:-1;;;32132:110:0;;;;;;;:::i;23142:723::-;23198:13;23419:5;23428:1;23419:10;23415:53;;-1:-1:-1;;23446:10:0;;;;;;;;;;;;-1:-1:-1;;;23446:10:0;;;;;23142:723::o;23415:53::-;23493:5;23478:12;23534:78;23541:9;;23534:78;;23567:8;;;;:::i;:::-;;-1:-1:-1;23590:10:0;;-1:-1:-1;23598:2:0;23590:10;;:::i;:::-;;;23534:78;;;23622:19;23654:6;23644:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23644:17:0;;23622:39;;23672:154;23679:10;;23672:154;;23706:11;23716:1;23706:11;;:::i;:::-;;-1:-1:-1;23775:10:0;23783:2;23775:5;:10;:::i;:::-;23762:24;;:2;:24;:::i;:::-;23749:39;;23732:6;23739;23732:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;23732:56:0;;;;;;;;-1:-1:-1;23803:11:0;23812:2;23803:11;;:::i;:::-;;;23672:154;;34116:285;34211:18;34217:2;34221:7;34211:5;:18::i;:::-;34262:53;34293:1;34297:2;34301:7;34310:4;34262:22;:53::i;:::-;34240:153;;;;-1:-1:-1;;;34240:153:0;;;;;;;:::i;2935:701::-;3018:7;3061:4;3018:7;3076:523;3100:5;:12;3096:1;:16;3076:523;;;3134:20;3157:5;3163:1;3157:8;;;;;;;;:::i;:::-;;;;;;;3134:31;;3200:12;3184;:28;3180:408;;3337:44;;;;;;21234:19:1;;;21269:12;;;21262:28;;;21306:12;;3337:44:0;;;;;;;;;;;;3327:55;;;;;;3312:70;;3180:408;;;3527:44;;;;;;21234:19:1;;;21269:12;;;21262:28;;;21306:12;;3527:44:0;;;;;;;;;;;;3517:55;;;;;;3502:70;;3180:408;-1:-1:-1;3114:3:0;;;;:::i;:::-;;;;3076:523;;;-1:-1:-1;3616:12:0;2935:701;-1:-1:-1;;;2935:701:0:o;39219:853::-;39373:4;-1:-1:-1;;;;;39394:13:0;;12063:20;12111:8;39390:675;;39430:71;;-1:-1:-1;;;39430:71:0;;-1:-1:-1;;;;;39430:36:0;;;;;:71;;19830:10;;39481:4;;39487:7;;39496:4;;39430:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39430:71:0;;;;;;;;-1:-1:-1;;39430:71:0;;;;;;;;;;;;:::i;:::-;;;39426:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39671:6;:13;39688:1;39671:18;39667:328;;39714:60;;-1:-1:-1;;;39714:60:0;;;;;;;:::i;39667:328::-;39945:6;39939:13;39930:6;39926:2;39922:15;39915:38;39426:584;-1:-1:-1;;;;;;39552:51:0;-1:-1:-1;;;39552:51:0;;-1:-1:-1;39545:58:0;;39390:675;-1:-1:-1;40049:4:0;39219:853;;;;;;:::o;34737:942::-;-1:-1:-1;;;;;34817:16:0;;34809:61;;;;-1:-1:-1;;;34809:61:0;;22279:2:1;34809:61:0;;;22261:21:1;;;22298:18;;;22291:30;22357:34;22337:18;;;22330:62;22409:18;;34809:61:0;22077:356:1;34809:61:0;32859:4;32457:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32457:16:0;32883:31;34881:58;;;;-1:-1:-1;;;34881:58:0;;22640:2:1;34881:58:0;;;22622:21:1;22679:2;22659:18;;;22652:30;22718;22698:18;;;22691:58;22766:18;;34881:58:0;22438:352:1;34881:58:0;32859:4;32457:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32457:16:0;32883:31;35090:58;;;;-1:-1:-1;;;35090:58:0;;22640:2:1;35090:58:0;;;22622:21:1;22679:2;22659:18;;;22652:30;22718;22698:18;;;22691:58;22766:18;;35090:58:0;22438:352:1;35090:58:0;-1:-1:-1;;;;;35497:13:0;;;;;;:9;:13;;;;;;;;:18;;35514:1;35497:18;;;35539:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35539:21:0;;;;;35578:33;35547:7;;35497:13;;35578:33;;35497:13;;35578:33;44279:20:::1;44203:104:::0;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:328::-;2255:6;2263;2271;2324:2;2312:9;2303:7;2299:23;2295:32;2292:52;;;2340:1;2337;2330:12;2292:52;2363:29;2382:9;2363:29;:::i;:::-;2353:39;;2411:38;2445:2;2434:9;2430:18;2411:38;:::i;:::-;2401:48;;2496:2;2485:9;2481:18;2468:32;2458:42;;2178:328;;;;;:::o;3060:127::-;3121:10;3116:3;3112:20;3109:1;3102:31;3152:4;3149:1;3142:15;3176:4;3173:1;3166:15;3192:632;3257:5;3287:18;3328:2;3320:6;3317:14;3314:40;;;3334:18;;:::i;:::-;3409:2;3403:9;3377:2;3463:15;;-1:-1:-1;;3459:24:1;;;3485:2;3455:33;3451:42;3439:55;;;3509:18;;;3529:22;;;3506:46;3503:72;;;3555:18;;:::i;:::-;3595:10;3591:2;3584:22;3624:6;3615:15;;3654:6;3646;3639:22;3694:3;3685:6;3680:3;3676:16;3673:25;3670:45;;;3711:1;3708;3701:12;3670:45;3761:6;3756:3;3749:4;3741:6;3737:17;3724:44;3816:1;3809:4;3800:6;3792;3788:19;3784:30;3777:41;;;;3192:632;;;;;:::o;3829:451::-;3898:6;3951:2;3939:9;3930:7;3926:23;3922:32;3919:52;;;3967:1;3964;3957:12;3919:52;4007:9;3994:23;4040:18;4032:6;4029:30;4026:50;;;4072:1;4069;4062:12;4026:50;4095:22;;4148:4;4140:13;;4136:27;-1:-1:-1;4126:55:1;;4177:1;4174;4167:12;4126:55;4200:74;4266:7;4261:2;4248:16;4243:2;4239;4235:11;4200:74;:::i;4285:615::-;4371:6;4379;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4488:9;4475:23;4517:18;4558:2;4550:6;4547:14;4544:34;;;4574:1;4571;4564:12;4544:34;4612:6;4601:9;4597:22;4587:32;;4657:7;4650:4;4646:2;4642:13;4638:27;4628:55;;4679:1;4676;4669:12;4628:55;4719:2;4706:16;4745:2;4737:6;4734:14;4731:34;;;4761:1;4758;4751:12;4731:34;4814:7;4809:2;4799:6;4796:1;4792:14;4788:2;4784:23;4780:32;4777:45;4774:65;;;4835:1;4832;4825:12;4774:65;4866:2;4858:11;;;;;4888:6;;-1:-1:-1;4285:615:1;;-1:-1:-1;;;;4285:615:1:o;4905:186::-;4964:6;5017:2;5005:9;4996:7;4992:23;4988:32;4985:52;;;5033:1;5030;5023:12;4985:52;5056:29;5075:9;5056:29;:::i;5096:347::-;5161:6;5169;5222:2;5210:9;5201:7;5197:23;5193:32;5190:52;;;5238:1;5235;5228:12;5190:52;5261:29;5280:9;5261:29;:::i;:::-;5251:39;;5340:2;5329:9;5325:18;5312:32;5387:5;5380:13;5373:21;5366:5;5363:32;5353:60;;5409:1;5406;5399:12;5353:60;5432:5;5422:15;;;5096:347;;;;;:::o;5448:667::-;5543:6;5551;5559;5567;5620:3;5608:9;5599:7;5595:23;5591:33;5588:53;;;5637:1;5634;5627:12;5588:53;5660:29;5679:9;5660:29;:::i;:::-;5650:39;;5708:38;5742:2;5731:9;5727:18;5708:38;:::i;:::-;5698:48;;5793:2;5782:9;5778:18;5765:32;5755:42;;5848:2;5837:9;5833:18;5820:32;5875:18;5867:6;5864:30;5861:50;;;5907:1;5904;5897:12;5861:50;5930:22;;5983:4;5975:13;;5971:27;-1:-1:-1;5961:55:1;;6012:1;6009;6002:12;5961:55;6035:74;6101:7;6096:2;6083:16;6078:2;6074;6070:11;6035:74;:::i;:::-;6025:84;;;5448:667;;;;;;;:::o;6120:127::-;6181:10;6176:3;6172:20;6169:1;6162:31;6212:4;6209:1;6202:15;6236:4;6233:1;6226:15;6252:342;6398:2;6383:18;;6431:1;6420:13;;6410:144;;6476:10;6471:3;6467:20;6464:1;6457:31;6511:4;6508:1;6501:15;6539:4;6536:1;6529:15;6410:144;6563:25;;;6252:342;:::o;6599:260::-;6667:6;6675;6728:2;6716:9;6707:7;6703:23;6699:32;6696:52;;;6744:1;6741;6734:12;6696:52;6767:29;6786:9;6767:29;:::i;:::-;6757:39;;6815:38;6849:2;6838:9;6834:18;6815:38;:::i;:::-;6805:48;;6599:260;;;;;:::o;6864:380::-;6943:1;6939:12;;;;6986;;;7007:61;;7061:4;7053:6;7049:17;7039:27;;7007:61;7114:2;7106:6;7103:14;7083:18;7080:38;7077:161;;7160:10;7155:3;7151:20;7148:1;7141:31;7195:4;7192:1;7185:15;7223:4;7220:1;7213:15;7077:161;;6864:380;;;:::o;7249:356::-;7451:2;7433:21;;;7470:18;;;7463:30;7529:34;7524:2;7509:18;;7502:62;7596:2;7581:18;;7249:356::o;7610:127::-;7671:10;7666:3;7662:20;7659:1;7652:31;7702:4;7699:1;7692:15;7726:4;7723:1;7716:15;7742:125;7807:9;;;7828:10;;;7825:36;;;7841:18;;:::i;9406:409::-;9608:2;9590:21;;;9647:2;9627:18;;;9620:30;9686:34;9681:2;9666:18;;9659:62;-1:-1:-1;;;9752:2:1;9737:18;;9730:43;9805:3;9790:19;;9406:409::o;9946:545::-;10048:2;10043:3;10040:11;10037:448;;;10084:1;10109:5;10105:2;10098:17;10154:4;10150:2;10140:19;10224:2;10212:10;10208:19;10205:1;10201:27;10195:4;10191:38;10260:4;10248:10;10245:20;10242:47;;;-1:-1:-1;10283:4:1;10242:47;10338:2;10333:3;10329:12;10326:1;10322:20;10316:4;10312:31;10302:41;;10393:82;10411:2;10404:5;10401:13;10393:82;;;10456:17;;;10437:1;10426:13;10393:82;;;10397:3;;;9946:545;;;:::o;10667:1352::-;10793:3;10787:10;10820:18;10812:6;10809:30;10806:56;;;10842:18;;:::i;:::-;10871:97;10961:6;10921:38;10953:4;10947:11;10921:38;:::i;:::-;10915:4;10871:97;:::i;:::-;11023:4;;11087:2;11076:14;;11104:1;11099:663;;;;11806:1;11823:6;11820:89;;;-1:-1:-1;11875:19:1;;;11869:26;11820:89;-1:-1:-1;;10624:1:1;10620:11;;;10616:24;10612:29;10602:40;10648:1;10644:11;;;10599:57;11922:81;;11069:944;;11099:663;9893:1;9886:14;;;9930:4;9917:18;;-1:-1:-1;;11135:20:1;;;11253:236;11267:7;11264:1;11261:14;11253:236;;;11356:19;;;11350:26;11335:42;;11448:27;;;;11416:1;11404:14;;;;11283:19;;11253:236;;;11257:3;11517:6;11508:7;11505:19;11502:201;;;11578:19;;;11572:26;-1:-1:-1;;11661:1:1;11657:14;;;11673:3;11653:24;11649:37;11645:42;11630:58;11615:74;;11502:201;-1:-1:-1;;;;;11749:1:1;11733:14;;;11729:22;11716:36;;-1:-1:-1;10667:1352:1:o;14492:128::-;14559:9;;;14580:11;;;14577:37;;;14594:18;;:::i;16846:1176::-;17112:3;17141:1;17174:6;17168:13;17204:36;17230:9;17204:36;:::i;:::-;17259:1;17276:18;;;17303:133;;;;17450:1;17445:356;;;;17269:532;;17303:133;-1:-1:-1;;17336:24:1;;17324:37;;17409:14;;17402:22;17390:35;;17381:45;;;-1:-1:-1;17303:133:1;;17445:356;17476:6;17473:1;17466:17;17506:4;17551:2;17548:1;17538:16;17576:1;17590:165;17604:6;17601:1;17598:13;17590:165;;;17682:14;;17669:11;;;17662:35;17725:16;;;;17619:10;;17590:165;;;17594:3;;;17784:6;17779:3;17775:16;17768:23;;17269:532;;;;;17832:6;17826:13;17848:68;17907:8;17902:3;17895:4;17887:6;17883:17;17848:68;:::i;:::-;-1:-1:-1;;;17938:18:1;;17965:22;;;18014:1;18003:13;;16846:1176;-1:-1:-1;;;;16846:1176:1:o;18847:401::-;19049:2;19031:21;;;19088:2;19068:18;;;19061:30;19127:34;19122:2;19107:18;;19100:62;-1:-1:-1;;;19193:2:1;19178:18;;19171:35;19238:3;19223:19;;18847:401::o;20012:414::-;20214:2;20196:21;;;20253:2;20233:18;;;20226:30;20292:34;20287:2;20272:18;;20265:62;-1:-1:-1;;;20358:2:1;20343:18;;20336:48;20416:3;20401:19;;20012:414::o;20431:135::-;20470:3;20491:17;;;20488:43;;20511:18;;:::i;:::-;-1:-1:-1;20558:1:1;20547:13;;20431:135::o;20571:127::-;20632:10;20627:3;20623:20;20620:1;20613:31;20663:4;20660:1;20653:15;20687:4;20684:1;20677:15;20703:120;20743:1;20769;20759:35;;20774:18;;:::i;:::-;-1:-1:-1;20808:9:1;;20703:120::o;20828:112::-;20860:1;20886;20876:35;;20891:18;;:::i;:::-;-1:-1:-1;20925:9:1;;20828:112::o;20945:127::-;21006:10;21001:3;20997:20;20994:1;20987:31;21037:4;21034:1;21027:15;21061:4;21058:1;21051:15;21329:489;-1:-1:-1;;;;;21598:15:1;;;21580:34;;21650:15;;21645:2;21630:18;;21623:43;21697:2;21682:18;;21675:34;;;21745:3;21740:2;21725:18;;21718:31;;;21523:4;;21766:46;;21792:19;;21784:6;21766:46;:::i;:::-;21758:54;21329:489;-1:-1:-1;;;;;;21329:489:1:o;21823:249::-;21892:6;21945:2;21933:9;21924:7;21920:23;21916:32;21913:52;;;21961:1;21958;21951:12;21913:52;21993:9;21987:16;22012:30;22036:5;22012:30;:::i
Swarm Source
ipfs://1748566d90f0535e20de92cb723dcf8d1e5b63f7c15b8b4d1e27e4562485e203
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.