ETH Price: $3,356.18 (-0.97%)

Token

LEGENDS OF THE FIRSTBORNE (LOTFB)
 

Overview

Max Total Supply

11,111 LOTFB

Holders

1,663

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LOTFB
0x303af56890f4296b29189650027dea2715313168
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LEGEND

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-23
*/

// SPDX-License-Identifier: MIT

//  ███████▓█████▓▓╬╬╬╬╬╬╬╬▓███▓╬╬╬╬╬╬╬▓╬╬▓█ 
//  ████▓▓▓▓╬╬▓█████╬╬╬╬╬╬███▓╬╬╬╬╬╬╬╬╬╬╬╬╬█ 
//  ███▓▓▓▓╬╬╬╬╬╬▓██╬╬╬╬╬╬▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  ████▓▓▓╬╬╬╬╬╬╬▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  ███▓█▓███████▓▓███▓╬╬╬╬╬╬▓███████▓╬╬╬╬▓█ 
//  ████████████████▓█▓╬╬╬╬╬▓▓▓▓▓▓▓▓╬╬╬╬╬╬╬█ 
//  ███▓▓▓▓▓▓▓╬╬▓▓▓▓▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  ████▓▓▓╬╬╬╬▓▓▓▓▓▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  ███▓█▓▓▓▓▓▓▓▓▓▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  █████▓▓▓▓▓▓▓▓█▓▓▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█ 
//  █████▓▓▓▓▓▓▓██▓▓▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██ 
//  █████▓▓▓▓▓████▓▓▓█▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██ 
//  ████▓█▓▓▓▓██▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██ 
//  ████▓▓███▓▓▓▓▓▓▓██▓╬╬╬╬╬╬╬╬╬╬╬╬█▓╬▓╬╬▓██ 
//  █████▓███▓▓▓▓▓▓▓▓████▓▓╬╬╬╬╬╬╬█▓╬╬╬╬╬▓██ 
//  █████▓▓█▓███▓▓▓████╬▓█▓▓╬╬╬▓▓█▓╬╬╬╬╬╬███ 
//  ██████▓██▓███████▓╬╬╬▓▓╬▓▓██▓╬╬╬╬╬╬╬▓███ 
//  ███████▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬████ 
//  ███████▓▓██▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓████ 
//  ████████▓▓▓█████▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓█████ 
//  █████████▓▓▓█▓▓▓▓▓███▓╬╬╬╬╬╬╬╬╬╬╬▓██████ 
//  ██████████▓▓▓█▓▓▓╬▓██╬╬╬╬╬╬╬╬╬╬╬▓███████ 
//  ███████████▓▓█▓▓▓▓███▓╬╬╬╬╬╬╬╬╬▓████████ 
//  ██████████████▓▓▓███▓▓╬╬╬╬╬╬╬╬██████████ 
//  ███████████████▓▓▓██▓▓╬╬╬╬╬╬▓███████████

//  .____     ___________ ___________________ _______  ________    _________                           
//  |    |    \_   _____//  _____/\_   _____/ \      \ \______ \  /   _____/                           
//  |    |     |    __)_/   \  ___ |    __)_  /   |   \ |    |  \ \_____  \                            
//  |    |___  |        \    \_\  \|        \/    |    \|    `   \/        \                           
//  |_______ \/_______  /\______  /_______  /\____|__  /_______  /_______  /                           
//          \/        \/        \/        \/         \/        \/        \/                            
//  ________  ___________    ______________ ______________                                                
//  \_____  \ \_   _____/    \__    ___/   |   \_   _____/                                                
//   /   |   \ |    __)        |    | /    ~    \    __)_                                                 
//  /    |    \|     \         |    | \    Y    /        \                                                
//  \_______  /\___  /         |____|  \___|_  /_______  /                                                
//          \/     \/                        \/        \/                                                 
//  ___________._____________  ______________________________ ________ __________  _______  ___________
//  \_   _____/|   \______   \/   _____/\__    ___/\______   \\_____  \\______   \ \      \ \_   _____/
//   |    __)  |   ||       _/\_____  \   |    |    |    |  _/ /   |   \|       _/ /   |   \ |    __)_ 
//   |     \   |   ||    |   \/        \  |    |    |    |   \/    |    \    |   \/    |    \|        \
//   \___  /   |___||____|_  /_______  /  |____|    |______  /\_______  /____|_  /\____|__  /_______  /
//       \/                \/        \/                    \/         \/       \/         \/        \/ 

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

library MerkleProof {

    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;


library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";


    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);
    }


    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);
    }


    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);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

//  ───────█████████████████████
//  ────████▀─────────────────▀████
//  ──███▀───────────────────────▀███
//  ─██▀───────────────────────────▀██
//  █▀───────────────────────────────▀█
//  █─────────────────────────────────█
//  █─────────────────────────────────█
//  █─────────────────────────────────█
//  █───█████─────────────────█████───█
//  █──██▓▓▓███─────────────███▓▓▓██──█
//  █──██▓▓▓▓▓██───────────██▓▓▓▓▓██──█
//  █──██▓▓▓▓▓▓██─────────██▓▓▓▓▓▓██──█
//  █▄──████▓▓▓▓██───────██▓▓▓▓████──▄█
//  ▀█▄───▀███▓▓▓██─────██▓▓▓███▀───▄█▀
//  ──█▄────▀█████▀─────▀█████▀────▄█
//  ─▄██───────────▄█─█▄───────────██▄
//  ─███───────────██─██───────────███
//  ─███───────────────────────────███
//  ──▀██──██▀██──█──█──█──██▀██──██▀
//  ───▀████▀─██──█──█──█──██─▀████▀
//  ────▀██▀──██──█──█──█──██──▀██▀
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ──────────██──█──█──█──██
//  ───────────█▄▄█▄▄█▄▄█▄▄█


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


    constructor() {
        _transferOwnership(_msgSender());
    }


    function owner() public view virtual returns (address) {
        return _owner;
    }


    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

      function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }


    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;


library Address {
      function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

      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");
    }

      function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }


    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    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");
    }

     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);
    }

      function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }


    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);
    }


    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }


    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);
    }


    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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

interface IERC165 {

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


abstract contract ERC165 is IERC165 {

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;



interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

//                                  ,- 
//                                 //        
//                                /:      ,
//                               ;.(     //
//                     |   ,     /`|    //
//                     |\  |\    |,|   //
//                  |  (\  (\    |`|   |(
//                  (\  \\  \\   |,|   ;|
//              .   ||   \\  \\  |`(   ;( 
//              \\   \\  \\  \\  |.\\  ((                              
//               \\   \\  \\  \\  \\ \;/:\                 
//                 \\  \\  \'. \\_,\\ /\""-._                
//                  \\  \\  \ \-"   \/ `;._ ".
//                 ___\\-\\-" \ \_  /,  |_ "._\
//           _,--""___ \ \,_   "-_"- |".|(._ ".".-.
//       _,-"_,--"""__ ) "."-_    "--\ \"("o\_\ "- ".
//     ,",-""" _.-'''_-"   "-_"-.__   \ \_\_//\)__"\_)
//   ,"    ',-'  ,-""   7"  _ "-.._""_>\__`""'"__ ""``-._
//          ;  ," ,-",'/` ,":\.    `   `  `"""___`""-._  ".   )
//          ;,"_," ,' /`,"}}::\\         `... \____''' "\  '.|\
//         ,","   :  /`/{{)/:::"\__,---._    \  \_____'''\    \
//        , ,"_  ;  /`/ ///::::::::' ,-"-\    \__   \____''\ \ \
//       ,,"   `;| ";; /}}/::'``':::(._``."-.__  """--    '_\ \ \
//      ('       ;// / {;;:'`````':; /`._."""  ""-.._ `"-. " (   )
//      /         )(/ <";"'``   ``/ /_.(             "_  "-_"\`);
//                (/ <";"``     `/ /`,(                "._ _".\; 
//                 |<";"`   ``  / /"-"                    "  
//                 <";"` ``    / /__,;   
//   
//   
//   
//   
//   
//   
//   

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);


    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);


    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/finalcontract.sol


pragma solidity ^0.8.0;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function totalSupply() public view override returns (uint256) {
        return _currentIndex;
    }

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
        return tokenIdsIdx;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }


    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert UnableDetermineTokenOwner();
    }


    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }


    function name() public view virtual override returns (string memory) {
        return _name;
    }


    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }


    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }


    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved();

        _approve(to, tokenId, owner);
    }


    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }


    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }


    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }


    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer();
    }


    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }


    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }


    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }


    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }


    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }


    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();
                else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }


    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}


    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}



contract LEGEND is ERC721A, Ownable{
    using Strings for uint256;
    uint256 public constant MAX_SUPPLY = 11111;
    uint256 public constant MAX_PUBLIC_MINT = 5;
    uint256 public constant MAX_WHITELIST_MINT = 5;
    uint256 public PUBLIC_SALE_PRICE = .00 ether;
    uint256 public WHITELIST_SALE_PRICE = .00 ether;

    string private  baseTokenUri;
    string public   placeholderTokenUri;

    //deploy smart contract, toggle WL, toggle WL when done, toggle publicSale 
    //2 days later toggle reveal
    bool public isRevealed;
    bool public publicSale;
    bool public whiteListSale;
    bool public pause;
    bool public teamMinted;

    bytes32 private merkleRoot;

    mapping(address => uint256) public totalPublicMint;
    mapping(address => uint256) public totalWhitelistMint;

    constructor() ERC721A("LEGENDS OF THE FIRSTBORNE", "LOTFB"){

    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "FIRSTBORNE :: Cannot be called by a contract");
        _;
    }

    function mint(uint256 _quantity) external payable callerIsUser{
        require(publicSale, "FIRSTBORNE :: Not Yet Active.");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "FIRSTBORNE :: Beyond Max Supply");
        require((totalPublicMint[msg.sender] +_quantity) <= MAX_PUBLIC_MINT, "FIRSTBORNE :: Already minted 3 times!");
        require(msg.value >= (PUBLIC_SALE_PRICE * _quantity), "FIRSTBORNE :: Below ");

        totalPublicMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function whitelistMint(bytes32[] memory _merkleProof, uint256 _quantity) external payable callerIsUser{
        require(whiteListSale, "FIRSTBORNE :: Minting is on Pause");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "FIRSTBORNE :: Cannot mint beyond max supply");
        require((totalWhitelistMint[msg.sender] + _quantity)  <= MAX_WHITELIST_MINT, "FIRSTBORNE :: Cannot mint beyond whitelist max mint!");
        require(msg.value >= (WHITELIST_SALE_PRICE * _quantity), "FIRSTBORNE :: Payment is below the price");
        //create leaf node
        bytes32 sender = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, sender), "FIRSTBORNE :: You are not whitelisted");

        totalWhitelistMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function teamMint() external onlyOwner{
        require(!teamMinted, "FIRSTBORNE :: Team already minted");
        teamMinted = true;
        _safeMint(msg.sender, 500);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenUri;
    }

    //return uri for certain token
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        uint256 trueId = tokenId + 1;

        if(!isRevealed){
            return placeholderTokenUri;
        }
        //string memory baseURI = _baseURI();
        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, trueId.toString(), ".json")) : "";
    }

    /// @dev walletOf() function shouldn't be called on-chain due to gas consumption
    function walletOf() external view returns(uint256[] memory){
        address _owner = msg.sender;
        uint256 numberOfOwnedNFT = balanceOf(_owner);
        uint256[] memory ownerIds = new uint256[](numberOfOwnedNFT);

        for(uint256 index = 0; index < numberOfOwnedNFT; index++){
            ownerIds[index] = tokenOfOwnerByIndex(_owner, index);
        }

        return ownerIds;
    }

    function setTokenUri(string memory _baseTokenUri) external onlyOwner{
        baseTokenUri = _baseTokenUri;
    }
    function setPlaceHolderUri(string memory _placeholderTokenUri) external onlyOwner{
        placeholderTokenUri = _placeholderTokenUri;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{
        merkleRoot = _merkleRoot;
    }

    function getMerkleRoot() external view returns (bytes32){
        return merkleRoot;
    }

    function togglePause() external onlyOwner{
        pause = !pause;
    }

    function toggleWhiteListSale() external onlyOwner{
        whiteListSale = !whiteListSale;
    }

    function togglePublicSale() external onlyOwner{
        publicSale = !publicSale;
    }

     function update_public_price(uint price) external onlyOwner {
        PUBLIC_SALE_PRICE = price;
    }
       function update_preSale_price(uint price) external onlyOwner {
        WHITELIST_SALE_PRICE = price;
    }

function AirDrop(address[] memory _wallets, uint _count) public onlyOwner{
        require(_wallets.length > 0, "mint at least one token");
        require(totalSupply() + _wallets.length <= MAX_SUPPLY, "not enough tokens left");
        for (uint i = 0; i < _wallets.length; i++)
        {
            _safeMint(_wallets[i], _count);
        }
    }

    function toggleReveal() external onlyOwner{
        isRevealed = !isRevealed;
    }

    function withdraw() external onlyOwner{
uint _balance = address(this).balance;
        payable(owner()).transfer(_balance );//owner
}
}


//                                                             ▓▓▓▓▓▓                                                          
//                                                   ░░▓▓▓▓▓▓▓▓▓▓▓▓          ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                    
//                                               ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░                                    
//                                           ▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒                                  
//                                         ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                            
//                                       ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                        
//                                   ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓    ▓▓▓▓                      
//                                 ▓▓▓▓▓▓▓▓▓▓░░░░    ░░░░░░▓▓▓▓▓▓        ▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒  ▒▒░░                      
//                               ██▓▓                                        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                        
//                             ▓▓                                              ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                      
//                                                                             ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                  
//                               ▓▓  ▓▓                                        ▓▓▓▓▓▓▓▓▓▓        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░              
//                             ▓▓▓▓  ▓▓▓▓            ░░▓▓▒▒                    ▓▓▓▓▓▓▓▓▓▓▓▓      ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓              
//                               ▓▓  ▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░      ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓          ▓▓▓▓▓▓▓▓▓▓▓▓            
//                               ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██          ▓▓▓▓▓▓▓▓▓▓▓▓          
//                             ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒  ▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓          ▒▒▓▓▓▓▓▓▓▓▓▓        
//                           ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░▓▓▓▓▒▒▓▓▓▓▓▓▓▓▒▒  ▓▓▓▓▓▓▓▓▒▒  ▒▒▒▒▓▓▓▓▒▒          ░░▓▓▓▓▓▓▓▓▒▒      
//                       ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓      ░░▒▒            ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ▓▓▓▓▓▓          ░░▓▓▓▓▓▓▓▓▓▓    
//                     ██▓▓▓▓▓▓  ▓▓▓▓▓▓▓▓▓▓          ░░            ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ▓▓▓▓▓▓          ▓▓▓▓▓▓▓▓▓▓    
//                 ░░▒▒▓▓▓▓░░  ▓▓▓▓▓▓▓▓▓▓▓▓                        ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓        ▒▒▓▓▓▓          ░░▓▓▓▓▓▓▓▓    
//                 ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░                            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒        ░░▓▓▒▒          ▓▓▓▓▓▓▓▓▒▒  
//               ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░  ██                        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓          ░░▓▓          ░░▓▓▓▓▓▓▓▓  
//       ▒▒▓▓▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▓▓░░                        ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓            ▓▓░░          ▓▓▓▓▓▓▓▓  
//       ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                          ▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓▓▓              ▒▒            ▓▓▓▓▓▓▓▓
//       ▓▓▓▓▓▓▓▓▓▓▓▓  ██  ██    ▓▓▓▓▓▓▓▓▓▓                            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓▓▓              ▓▓▓▓          ▓▓▓▓▓▓▓▓
//       ░░▓▓▓▓▓▓░░▓▓    ▓▓    ░░▓▓▓▓░░                            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ░░▓▓              ▒▒▓▓          ▓▓▓▓▓▓▓▓
//         ░░▓▓░░      ▓▓░░    ▓▓▓▓                              ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓    ▓▓              ░░▓▓          ░░▓▓▓▓▓▓
//             ██  ░░▓▓    ██  ▓▓▒▒  ██                        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▓▓    ▓▓              ░░▓▓            ▓▓▓▓▓▓
//             ░░  ░░▓▓    ▒▒▒▒▓▓▒▒▒▒▒▒                      ▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓    ▓▓              ░░▓▓            ▓▓▓▓▓▓
//                 ▓▓▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓                  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░  ░░    ▓▓              ░░▓▓            ▓▓▓▓▓▓
//             ██  ▓▓      ▓▓▓▓▓▓▓▓▓▓▓▓▓▓            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓  ▓▓▓▓░░▓▓▓▓                          ░░▓▓            ▓▓▓▓▓▓
//           ▓▓    ▒▒        ▓▓▓▓                ██▓▓▓▓▓▓▓▓▓▓▓▓      ▓▓                                  ░░██            ▓▓▓▓▓▓
//         ▒▒▓▓  ▒▒▓▓        ░░░░            ▒▒▒▒▓▓▓▓▓▓▓▓▓▓██░░      ░░                                    ░░            ▓▓▓▓▓▓
//         ▓▓▒▒  ▓▓                      ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                                              ▓▓▓▓░░
//       ▒▒▒▒  ▒▒▓▓                    ▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒                                                              ▓▓▓▓  
//       ░░  ▒▒▓▓░░                  ▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░                                                            ░░▒▒▓▓▓▓  
//       ▓▓  ▓▓░░                  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                                                ▓▓▓▓░░  
//       ▓▓                        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                ▓▓                                ▓▓▓▓    
//                               ██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                ░░██                            ▓▓▓▓▓▓    
//                             ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                  ▓▓                            ▓▓▓▓░░    
//                             ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                  ▓▓▓▓                          ▓▓▓▓      
//                             ██  ▓▓▓▓▓▓    ░░▓▓▓▓██▓▓                                ▓▓▓▓                        ▓▓▓▓▓▓      
//                             ▓▓  ▓▓▓▓░░      ▓▓▓▓▓▓▒▒                                ▓▓▓▓                        ▓▓▓▓▒▒      
//                             ░░  ▓▓▓▓    ░░▓▓▓▓▓▓▓▓▓▓▓▓                              ▓▓▓▓                        ▓▓░░        
//                                 ▓▓▓▓▒▒  ░░▓▓▓▓▓▓▓▓▓▓▓▓▒▒                            ▓▓▓▓▒▒                    ▒▒▓▓          
//                                 ░░▓▓▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                          ▒▒▓▓▓▓▒▒                    ▓▓▓▓          
//                                   ▓▓▓▓    ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                      ▓▓▓▓▓▓▒▒                    ▓▓            
//                                     ▓▓▓▓    ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                  ▓▓▓▓▓▓▓▓▓▓                    ▓▓            
//                                     ▓▓▓▓▓▓    ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██░░          ▓▓▓▓▓▓▓▓▓▓                    ▓▓▓▓            
//                                       ▓▓▓▓▒▒    ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                    ▓▓▓▓            
//                                       ░░▓▓▓▓▓▓    ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░                    ░░▓▓            
//                                         ░░▓▓▓▓▓▓          ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                          ▓▓            
//                                           ░░▓▓▓▓▓▓▒▒            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                            ▓▓            
//                                             ░░░░▓▓▓▓▓▓        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░                            ▓▓            
//                                                 ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░                                                  
//                                                   ▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓              ▓▓▓▓▓▓                                      
//                                                 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▓▓░░░░                                      
//                                           ░░▓▓▓▓▓▓▓▓▓▓░░░░      ▓▓▓▓▓▓▓▓▓▓▓▓  ░░░░                                          
//                                         ░░▓▓▓▓▓▓▓▓                  ░░                                                      
//                                         ▓▓▓▓▓▓░░░░                                                                          
//                                       ▓▓▓▓▓▓░░                                                                              
//                                       ▓▓▓▓        ░░▓▓▓▓██▓▓                                                                
//                                       ▓▓▓▓          ▓▓▓▓▓▓▓▓▒▒▒▒▒▒                                                          
//                                       ▓▓▓▓            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                                      
//                                       ▓▓▒▒            ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                                    
//                                       ░░▓▓▓▓▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒  ▓▓▓▓▓▓▒▒                                                
//                                         ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓    ▓▓▓▓░░  ▓▓▓▓▓▓                                                
//                                           ░░▓▓▓▓▓▓▓▓██▓▓          ▓▓  ▓▓▓▓▓▓▓▓                                              
//                                         ▓▓    ░░▓▓▒▒                ▓▓  ▓▓▓▓▓▓                                              
//                                         ▒▒▒▒▓▓  ░░░░                ░░▒▒░░▓▓▓▓▒▒                                            
//                                           ▒▒▓▓▓▓▓▓                    ▓▓  ▓▓▓▓▓▓                ░░░░                        
//                                             ░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓      ░░  ░░▓▓▓▓              ░░    ░░                      
//                                                 ░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▓▓        ▓▓▓▓              ░░░░  ▒▒  ░░░░▒▒░░            
//                                                   ░░░░░░░░░░░░▓▓▓▓▓▓▓▓      ▓▓▓▓                ░░▒▒░░▒▒▒▒░░                
//                                                                 ▓▓▓▓▓▓      ▓▓▓▓                                            
//                                                                 ▓▓▓▓▓▓▓▓    ▓▓▓▓                                            
//                                                                 ▓▓▓▓▓▓▓▓    ▓▓▓▓                                            
//                                                                 ▓▓▓▓▓▓▓▓    ▓▓▓▓                                            
//                                                                 ▓▓▓▓▓▓▓▓    ▓▓▓▓                                            
//                                                                 ▓▓▓▓▓▓▓▓▒▒▒▒▓▓░░                                            
//                                                                 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                              
//                                                                 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓                                              
//                                                               ▓▓▓▓▓▓▓▓  ▓▓▓▓░░                                              
//                                   ██▓▓▓▓▓▓▓▓▓▓▓▓              ▓▓▓▓▓▓▓▓  ▓▓░░                                                
//                                 ██▓▓          ▓▓▓▓            ▓▓▓▓▓▓░░                                                      
//                                 ▓▓░░          ▒▒▓▓          ▒▒▓▓▓▓▓▓                                                        
//                               ▓▓▒▒            ░░▓▓          ▓▓▓▓▓▓▓▓                                                        
//                               ▓▓              ▒▒▓▓        ▒▒▓▓▓▓▒▒░░                                                        
//                               ▓▓            ▒▒▓▓░░      ▒▒▓▓▓▓▓▓                                                            
//                             ▓▓▓▓      ▓▓▒▒▓▓▓▓░░        ▓▓▓▓▓▓░░                                                            
//                             ▓▓▓▓      ░░▓▓▓▓▓▓        ▓▓▓▓▓▓                                                                
//                             ▓▓▓▓                  ▓▓▓▓▓▓██                                                                  
//                               ▓▓▓▓              ▓▓▓▓▓▓▓▓                                                                    
//                               ░░▓▓▓▓▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"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":"_wallets","type":"address[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"AirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"name":"setPlaceHolderUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWhitelistMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_preSale_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_public_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060085560006009553480156200001b57600080fd5b50604080518082018252601981527f4c4547454e4453204f4620544845204649525354424f524e45000000000000006020808301918252835180850190945260058452642627aa232160d91b9084015281519192916200007e916001916200010d565b508051620000949060029060208401906200010d565b505050620000b1620000ab620000b760201b60201c565b620000bb565b620001f0565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011b90620001b3565b90600052602060002090601f0160209004810192826200013f57600085556200018a565b82601f106200015a57805160ff19168380011785556200018a565b828001600101855582156200018a579182015b828111156200018a5782518255916020019190600101906200016d565b50620001989291506200019c565b5090565b5b808211156200019857600081556001016200019d565b600181811c90821680620001c857607f821691505b60208210811415620001ea57634e487b7160e01b600052602260045260246000fd5b50919050565b6128a880620002006000396000f3fe6080604052600436106102935760003560e01c806370a082311161015a578063b88d4fde116100c1578063e222c7f91161007a578063e222c7f91461075a578063e2a70eaf1461076f578063e8b5498d1461078f578063e985e9c5146107b1578063eeb9052f146107fa578063f2fde38b1461081a57600080fd5b8063b88d4fde146106da578063ba7a86b8146106fa578063bc912e1a1461070f578063c08dfd3c14610572578063c4ae316814610725578063c87b56dd1461073a57600080fd5b80638bb64a8c116101135780638bb64a8c1461063f5780638da5cb5b1461065457806395d89b4114610672578063a0712d6814610687578063a22cb4651461069a578063b0962c53146106ba57600080fd5b806370a0823114610587578063715018a6146105a75780637cb64759146105bc57806383a974a2146105dc5780638456cb59146105fe57806386a173ee1461061f57600080fd5b806332cb6b0c116101fe5780634f6ccce7116101b75780634f6ccce7146104e357806354214f69146105035780635b8ad4291461051d5780636352211e1461053257806363adc5a51461055257806365f130971461057257600080fd5b806332cb6b0c1461044f57806333bc1c5c146104655780633ccfd60b1461048457806342842e0e1461049957806349590657146104b95780634cf5f7a4146104ce57600080fd5b8063095ea7b311610250578063095ea7b31461039a57806318160ddd146103ba5780631c16521c146103cf57806323b872dd146103fc5780632904e6d91461041c5780632f745c591461042f57600080fd5b806301ffc9a7146102985780630345e3cb146102cd5780630675b7c61461030857806306fdde031461032a57806307e89ec01461034c578063081812fc14610362575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612409565b61083a565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102fa6102e836600461214f565b600f6020526000908152604090205481565b6040519081526020016102c4565b34801561031457600080fd5b50610328610323366004612443565b6108a7565b005b34801561033657600080fd5b5061033f6108f1565b6040516102c4919061260f565b34801561035857600080fd5b506102fa60085481565b34801561036e57600080fd5b5061038261037d3660046123f0565b610983565b6040516001600160a01b0390911681526020016102c4565b3480156103a657600080fd5b506103286103b5366004612290565b6109c9565b3480156103c657600080fd5b506000546102fa565b3480156103db57600080fd5b506102fa6103ea36600461214f565b600e6020526000908152604090205481565b34801561040857600080fd5b5061032861041736600461219d565b610a57565b61032861042a366004612363565b610a62565b34801561043b57600080fd5b506102fa61044a366004612290565b610d22565b34801561045b57600080fd5b506102fa612b6781565b34801561047157600080fd5b50600c546102b890610100900460ff1681565b34801561049057600080fd5b50610328610df6565b3480156104a557600080fd5b506103286104b436600461219d565b610e6b565b3480156104c557600080fd5b50600d546102fa565b3480156104da57600080fd5b5061033f610e86565b3480156104ef57600080fd5b506102fa6104fe3660046123f0565b610f14565b34801561050f57600080fd5b50600c546102b89060ff1681565b34801561052957600080fd5b50610328610f3b565b34801561053e57600080fd5b5061038261054d3660046123f0565b610f79565b34801561055e57600080fd5b5061032861056d3660046123f0565b610f8b565b34801561057e57600080fd5b506102fa600581565b34801561059357600080fd5b506102fa6105a236600461214f565b610fba565b3480156105b357600080fd5b50610328611008565b3480156105c857600080fd5b506103286105d73660046123f0565b61103e565b3480156105e857600080fd5b506105f161106d565b6040516102c491906125cb565b34801561060a57600080fd5b50600c546102b8906301000000900460ff1681565b34801561062b57600080fd5b50600c546102b89062010000900460ff1681565b34801561064b57600080fd5b5061032861110f565b34801561066057600080fd5b506007546001600160a01b0316610382565b34801561067e57600080fd5b5061033f611158565b6103286106953660046123f0565b611167565b3480156106a657600080fd5b506103286106b5366004612254565b611342565b3480156106c657600080fd5b506103286106d5366004612443565b6113d8565b3480156106e657600080fd5b506103286106f53660046121d9565b611415565b34801561070657600080fd5b5061032861144f565b34801561071b57600080fd5b506102fa60095481565b34801561073157600080fd5b506103286114ff565b34801561074657600080fd5b5061033f6107553660046123f0565b61154a565b34801561076657600080fd5b506103286116c6565b34801561077b57600080fd5b5061032861078a3660046123f0565b61170d565b34801561079b57600080fd5b50600c546102b890640100000000900460ff1681565b3480156107bd57600080fd5b506102b86107cc36600461216a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561080657600080fd5b506103286108153660046122ba565b61173c565b34801561082657600080fd5b5061032861083536600461214f565b611857565b60006001600160e01b031982166380ac58cd60e01b148061086b57506001600160e01b03198216635b5e139f60e01b145b8061088657506001600160e01b0319821663780e9d6360e01b145b806108a157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d19061266e565b60405180910390fd5b80516108ed90600a90602084019061204c565b5050565b60606001805461090090612784565b80601f016020809104026020016040519081016040528092919081815260200182805461092c90612784565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b6000610990826000541190565b6109ad576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109d482610f79565b9050806001600160a01b0316836001600160a01b03161415610a095760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a295750610a2781336107cc565b155b15610a47576040516367d9dca160e11b815260040160405180910390fd5b610a528383836118ef565b505050565b610a5283838361194b565b323314610a815760405162461bcd60e51b81526004016108d190612622565b600c5462010000900460ff16610ae35760405162461bcd60e51b815260206004820152602160248201527f4649525354424f524e45203a3a204d696e74696e67206973206f6e20506175736044820152606560f81b60648201526084016108d1565b612b6781610af060005490565b610afa91906126f6565b1115610b5c5760405162461bcd60e51b815260206004820152602b60248201527f4649525354424f524e45203a3a2043616e6e6f74206d696e74206265796f6e6460448201526a206d617820737570706c7960a81b60648201526084016108d1565b336000908152600f6020526040902054600590610b7a9083906126f6565b1115610be55760405162461bcd60e51b815260206004820152603460248201527f4649525354424f524e45203a3a2043616e6e6f74206d696e74206265796f6e646044820152732077686974656c697374206d6178206d696e742160601b60648201526084016108d1565b80600954610bf39190612722565b341015610c535760405162461bcd60e51b815260206004820152602860248201527f4649525354424f524e45203a3a205061796d656e742069732062656c6f772074604482015267686520707269636560c01b60648201526084016108d1565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c9983600d5483611b68565b610cf35760405162461bcd60e51b815260206004820152602560248201527f4649525354424f524e45203a3a20596f7520617265206e6f742077686974656c6044820152641a5cdd195960da1b60648201526084016108d1565b336000908152600f602052604081208054849290610d129084906126f6565b90915550610a5290503383611b7e565b6000610d2d83610fba565b8210610d4c576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610de4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610da657805192505b876001600160a01b0316836001600160a01b03161415610ddb5786841415610dd4575093506108a192505050565b6001909301925b50600101610d54565b50610ded6127ee565b50949350505050565b6007546001600160a01b03163314610e205760405162461bcd60e51b81526004016108d19061266e565b47610e336007546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156108ed573d6000803e3d6000fd5b610a5283838360405180602001604052806000815250611415565b600b8054610e9390612784565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90612784565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b600080548210610f37576040516329c8c00760e21b815260040160405180910390fd5b5090565b6007546001600160a01b03163314610f655760405162461bcd60e51b81526004016108d19061266e565b600c805460ff19811660ff90911615179055565b6000610f8482611b98565b5192915050565b6007546001600160a01b03163314610fb55760405162461bcd60e51b81526004016108d19061266e565b600955565b60006001600160a01b038216610fe3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146110325760405162461bcd60e51b81526004016108d19061266e565b61103c6000611c2c565b565b6007546001600160a01b031633146110685760405162461bcd60e51b81526004016108d19061266e565b600d55565b606033600061107b82610fba565b90506000816001600160401b0381111561109757611097612846565b6040519080825280602002602001820160405280156110c0578160200160208202803683370190505b50905060005b82811015611107576110d88482610d22565b8282815181106110ea576110ea612830565b6020908102919091010152806110ff816127bf565b9150506110c6565b509392505050565b6007546001600160a01b031633146111395760405162461bcd60e51b81526004016108d19061266e565b600c805462ff0000198116620100009182900460ff1615909102179055565b60606002805461090090612784565b3233146111865760405162461bcd60e51b81526004016108d190612622565b600c54610100900460ff166111dd5760405162461bcd60e51b815260206004820152601d60248201527f4649525354424f524e45203a3a204e6f7420596574204163746976652e00000060448201526064016108d1565b612b67816111ea60005490565b6111f491906126f6565b11156112425760405162461bcd60e51b815260206004820152601f60248201527f4649525354424f524e45203a3a204265796f6e64204d617820537570706c790060448201526064016108d1565b336000908152600e60205260409020546005906112609083906126f6565b11156112bc5760405162461bcd60e51b815260206004820152602560248201527f4649525354424f524e45203a3a20416c7265616479206d696e74656420332074604482015264696d65732160d81b60648201526084016108d1565b806008546112ca9190612722565b3410156113105760405162461bcd60e51b815260206004820152601460248201527302324a929aa2127a92722901d1d102132b637bb960651b60448201526064016108d1565b336000908152600e60205260408120805483929061132f9084906126f6565b9091555061133f90503382611b7e565b50565b6001600160a01b03821633141561136c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146114025760405162461bcd60e51b81526004016108d19061266e565b80516108ed90600b90602084019061204c565b61142084848461194b565b61142c84848484611c7e565b611449576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146114795760405162461bcd60e51b81526004016108d19061266e565b600c54640100000000900460ff16156114de5760405162461bcd60e51b815260206004820152602160248201527f4649525354424f524e45203a3a205465616d20616c7265616479206d696e74656044820152601960fa1b60648201526084016108d1565b600c805464ff00000000191664010000000017905561103c336101f4611b7e565b6007546001600160a01b031633146115295760405162461bcd60e51b81526004016108d19061266e565b600c805463ff00000019811663010000009182900460ff1615909102179055565b6060611557826000541190565b6115bb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108d1565b60006115c88360016126f6565b600c5490915060ff1661166857600b80546115e290612784565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612784565b801561165b5780601f106116305761010080835404028352916020019161165b565b820191906000526020600020905b81548152906001019060200180831161163e57829003601f168201915b5050505050915050919050565b6000600a805461167790612784565b90501161169357604051806020016040528060008152506116bf565b600a61169e82611d8d565b6040516020016116af9291906124d3565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146116f05760405162461bcd60e51b81526004016108d19061266e565b600c805461ff001981166101009182900460ff1615909102179055565b6007546001600160a01b031633146117375760405162461bcd60e51b81526004016108d19061266e565b600855565b6007546001600160a01b031633146117665760405162461bcd60e51b81526004016108d19061266e565b60008251116117b75760405162461bcd60e51b815260206004820152601760248201527f6d696e74206174206c65617374206f6e6520746f6b656e00000000000000000060448201526064016108d1565b612b6782516117c560005490565b6117cf91906126f6565b11156118165760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108d1565b60005b8251811015610a525761184583828151811061183757611837612830565b602002602001015183611b7e565b8061184f816127bf565b915050611819565b6007546001600160a01b031633146118815760405162461bcd60e51b81526004016108d19061266e565b6001600160a01b0381166118e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b61133f81611c2c565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061195682611b98565b80519091506000906001600160a01b0316336001600160a01b0316148061198d57503361198284610983565b6001600160a01b0316145b8061199f5750815161199f90336107cc565b9050806119bf57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146119f45760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611a1b57604051633a954ecd60e21b815260040160405180910390fd5b611a2b60008484600001516118ef565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611b1e57611ad2816000541190565b15611b1e57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b600082611b758584611e8a565b14949350505050565b6108ed828260405180602001604052806000815250611ef6565b6040805180820190915260008082526020820152611bb7826000541190565b611bd457604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611c22579392505050565b5060001901611bd6565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611d8157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cc290339089908890889060040161258e565b602060405180830381600087803b158015611cdc57600080fd5b505af1925050508015611d0c575060408051601f3d908101601f19168201909252611d0991810190612426565b60015b611d67573d808015611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b508051611d5f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d85565b5060015b949350505050565b606081611db15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ddb5780611dc5816127bf565b9150611dd49050600a8361270e565b9150611db5565b6000816001600160401b03811115611df557611df5612846565b6040519080825280601f01601f191660200182016040528015611e1f576020820181803683370190505b5090505b8415611d8557611e34600183612741565b9150611e41600a866127da565b611e4c9060306126f6565b60f81b818381518110611e6157611e61612830565b60200101906001600160f81b031916908160001a905350611e83600a8661270e565b9450611e23565b600081815b8451811015611107576000858281518110611eac57611eac612830565b60200260200101519050808311611ed25760008381526020829052604090209250611ee3565b600081815260208490526040902092505b5080611eee816127bf565b915050611e8f565b610a5283838360016000546001600160a01b038516611f2757604051622e076360e81b815260040160405180910390fd5b83611f455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156120435760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561201957506120176000888488611c7e565b155b15612037576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611fc2565b50600055611b61565b82805461205890612784565b90600052602060002090601f01602090048101928261207a57600085556120c0565b82601f1061209357805160ff19168380011785556120c0565b828001600101855582156120c0579182015b828111156120c05782518255916020019190600101906120a5565b50610f379291505b80821115610f3757600081556001016120c8565b60006001600160401b038311156120f5576120f5612846565b612108601f8401601f19166020016126a3565b905082815283838301111561211c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461214a57600080fd5b919050565b60006020828403121561216157600080fd5b6116bf82612133565b6000806040838503121561217d57600080fd5b61218683612133565b915061219460208401612133565b90509250929050565b6000806000606084860312156121b257600080fd5b6121bb84612133565b92506121c960208501612133565b9150604084013590509250925092565b600080600080608085870312156121ef57600080fd5b6121f885612133565b935061220660208601612133565b92506040850135915060608501356001600160401b0381111561222857600080fd5b8501601f8101871361223957600080fd5b612248878235602084016120dc565b91505092959194509250565b6000806040838503121561226757600080fd5b61227083612133565b91506020830135801515811461228557600080fd5b809150509250929050565b600080604083850312156122a357600080fd5b6122ac83612133565b946020939093013593505050565b600080604083850312156122cd57600080fd5b82356001600160401b038111156122e357600080fd5b8301601f810185136122f457600080fd5b80356020612309612304836126d3565b6126a3565b80838252828201915082850189848660051b880101111561232957600080fd5b600095505b848610156123535761233f81612133565b83526001959095019491830191830161232e565b5098969091013596505050505050565b6000806040838503121561237657600080fd5b82356001600160401b0381111561238c57600080fd5b8301601f8101851361239d57600080fd5b803560206123ad612304836126d3565b80838252828201915082850189848660051b88010111156123cd57600080fd5b600095505b848610156123535780358352600195909501949183019183016123d2565b60006020828403121561240257600080fd5b5035919050565b60006020828403121561241b57600080fd5b81356116bf8161285c565b60006020828403121561243857600080fd5b81516116bf8161285c565b60006020828403121561245557600080fd5b81356001600160401b0381111561246b57600080fd5b8201601f8101841361247c57600080fd5b611d85848235602084016120dc565b600081518084526124a3816020860160208601612758565b601f01601f19169290920160200192915050565b600081516124c9818560208601612758565b9290920192915050565b600080845481600182811c9150808316806124ef57607f831692505b602080841082141561250f57634e487b7160e01b86526022600452602486fd5b818015612523576001811461253457612561565b60ff19861689528489019650612561565b60008b81526020902060005b868110156125595781548b820152908501908301612540565b505084890196505b50505050505061258561257482866124b7565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c19083018461248b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612603578351835292840192918401916001016125e7565b50909695505050505050565b6020815260006116bf602083018461248b565b6020808252602c908201527f4649525354424f524e45203a3a2043616e6e6f742062652063616c6c6564206260408201526b1e48184818dbdb9d1c9858dd60a21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156126cb576126cb612846565b604052919050565b60006001600160401b038211156126ec576126ec612846565b5060051b60200190565b6000821982111561270957612709612804565b500190565b60008261271d5761271d61281a565b500490565b600081600019048311821515161561273c5761273c612804565b500290565b60008282101561275357612753612804565b500390565b60005b8381101561277357818101518382015260200161275b565b838111156114495750506000910152565b600181811c9082168061279857607f821691505b602082108114156127b957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127d3576127d3612804565b5060010190565b6000826127e9576127e961281a565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461133f57600080fdfea2646970667358221220978223150105f46e7847f1989da1f79f1c4d9c80a37611cacda3db9dd5f559e064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102935760003560e01c806370a082311161015a578063b88d4fde116100c1578063e222c7f91161007a578063e222c7f91461075a578063e2a70eaf1461076f578063e8b5498d1461078f578063e985e9c5146107b1578063eeb9052f146107fa578063f2fde38b1461081a57600080fd5b8063b88d4fde146106da578063ba7a86b8146106fa578063bc912e1a1461070f578063c08dfd3c14610572578063c4ae316814610725578063c87b56dd1461073a57600080fd5b80638bb64a8c116101135780638bb64a8c1461063f5780638da5cb5b1461065457806395d89b4114610672578063a0712d6814610687578063a22cb4651461069a578063b0962c53146106ba57600080fd5b806370a0823114610587578063715018a6146105a75780637cb64759146105bc57806383a974a2146105dc5780638456cb59146105fe57806386a173ee1461061f57600080fd5b806332cb6b0c116101fe5780634f6ccce7116101b75780634f6ccce7146104e357806354214f69146105035780635b8ad4291461051d5780636352211e1461053257806363adc5a51461055257806365f130971461057257600080fd5b806332cb6b0c1461044f57806333bc1c5c146104655780633ccfd60b1461048457806342842e0e1461049957806349590657146104b95780634cf5f7a4146104ce57600080fd5b8063095ea7b311610250578063095ea7b31461039a57806318160ddd146103ba5780631c16521c146103cf57806323b872dd146103fc5780632904e6d91461041c5780632f745c591461042f57600080fd5b806301ffc9a7146102985780630345e3cb146102cd5780630675b7c61461030857806306fdde031461032a57806307e89ec01461034c578063081812fc14610362575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612409565b61083a565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102fa6102e836600461214f565b600f6020526000908152604090205481565b6040519081526020016102c4565b34801561031457600080fd5b50610328610323366004612443565b6108a7565b005b34801561033657600080fd5b5061033f6108f1565b6040516102c4919061260f565b34801561035857600080fd5b506102fa60085481565b34801561036e57600080fd5b5061038261037d3660046123f0565b610983565b6040516001600160a01b0390911681526020016102c4565b3480156103a657600080fd5b506103286103b5366004612290565b6109c9565b3480156103c657600080fd5b506000546102fa565b3480156103db57600080fd5b506102fa6103ea36600461214f565b600e6020526000908152604090205481565b34801561040857600080fd5b5061032861041736600461219d565b610a57565b61032861042a366004612363565b610a62565b34801561043b57600080fd5b506102fa61044a366004612290565b610d22565b34801561045b57600080fd5b506102fa612b6781565b34801561047157600080fd5b50600c546102b890610100900460ff1681565b34801561049057600080fd5b50610328610df6565b3480156104a557600080fd5b506103286104b436600461219d565b610e6b565b3480156104c557600080fd5b50600d546102fa565b3480156104da57600080fd5b5061033f610e86565b3480156104ef57600080fd5b506102fa6104fe3660046123f0565b610f14565b34801561050f57600080fd5b50600c546102b89060ff1681565b34801561052957600080fd5b50610328610f3b565b34801561053e57600080fd5b5061038261054d3660046123f0565b610f79565b34801561055e57600080fd5b5061032861056d3660046123f0565b610f8b565b34801561057e57600080fd5b506102fa600581565b34801561059357600080fd5b506102fa6105a236600461214f565b610fba565b3480156105b357600080fd5b50610328611008565b3480156105c857600080fd5b506103286105d73660046123f0565b61103e565b3480156105e857600080fd5b506105f161106d565b6040516102c491906125cb565b34801561060a57600080fd5b50600c546102b8906301000000900460ff1681565b34801561062b57600080fd5b50600c546102b89062010000900460ff1681565b34801561064b57600080fd5b5061032861110f565b34801561066057600080fd5b506007546001600160a01b0316610382565b34801561067e57600080fd5b5061033f611158565b6103286106953660046123f0565b611167565b3480156106a657600080fd5b506103286106b5366004612254565b611342565b3480156106c657600080fd5b506103286106d5366004612443565b6113d8565b3480156106e657600080fd5b506103286106f53660046121d9565b611415565b34801561070657600080fd5b5061032861144f565b34801561071b57600080fd5b506102fa60095481565b34801561073157600080fd5b506103286114ff565b34801561074657600080fd5b5061033f6107553660046123f0565b61154a565b34801561076657600080fd5b506103286116c6565b34801561077b57600080fd5b5061032861078a3660046123f0565b61170d565b34801561079b57600080fd5b50600c546102b890640100000000900460ff1681565b3480156107bd57600080fd5b506102b86107cc36600461216a565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561080657600080fd5b506103286108153660046122ba565b61173c565b34801561082657600080fd5b5061032861083536600461214f565b611857565b60006001600160e01b031982166380ac58cd60e01b148061086b57506001600160e01b03198216635b5e139f60e01b145b8061088657506001600160e01b0319821663780e9d6360e01b145b806108a157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007546001600160a01b031633146108da5760405162461bcd60e51b81526004016108d19061266e565b60405180910390fd5b80516108ed90600a90602084019061204c565b5050565b60606001805461090090612784565b80601f016020809104026020016040519081016040528092919081815260200182805461092c90612784565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050905090565b6000610990826000541190565b6109ad576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109d482610f79565b9050806001600160a01b0316836001600160a01b03161415610a095760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a295750610a2781336107cc565b155b15610a47576040516367d9dca160e11b815260040160405180910390fd5b610a528383836118ef565b505050565b610a5283838361194b565b323314610a815760405162461bcd60e51b81526004016108d190612622565b600c5462010000900460ff16610ae35760405162461bcd60e51b815260206004820152602160248201527f4649525354424f524e45203a3a204d696e74696e67206973206f6e20506175736044820152606560f81b60648201526084016108d1565b612b6781610af060005490565b610afa91906126f6565b1115610b5c5760405162461bcd60e51b815260206004820152602b60248201527f4649525354424f524e45203a3a2043616e6e6f74206d696e74206265796f6e6460448201526a206d617820737570706c7960a81b60648201526084016108d1565b336000908152600f6020526040902054600590610b7a9083906126f6565b1115610be55760405162461bcd60e51b815260206004820152603460248201527f4649525354424f524e45203a3a2043616e6e6f74206d696e74206265796f6e646044820152732077686974656c697374206d6178206d696e742160601b60648201526084016108d1565b80600954610bf39190612722565b341015610c535760405162461bcd60e51b815260206004820152602860248201527f4649525354424f524e45203a3a205061796d656e742069732062656c6f772074604482015267686520707269636560c01b60648201526084016108d1565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c9983600d5483611b68565b610cf35760405162461bcd60e51b815260206004820152602560248201527f4649525354424f524e45203a3a20596f7520617265206e6f742077686974656c6044820152641a5cdd195960da1b60648201526084016108d1565b336000908152600f602052604081208054849290610d129084906126f6565b90915550610a5290503383611b7e565b6000610d2d83610fba565b8210610d4c576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610de4576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610da657805192505b876001600160a01b0316836001600160a01b03161415610ddb5786841415610dd4575093506108a192505050565b6001909301925b50600101610d54565b50610ded6127ee565b50949350505050565b6007546001600160a01b03163314610e205760405162461bcd60e51b81526004016108d19061266e565b47610e336007546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156108ed573d6000803e3d6000fd5b610a5283838360405180602001604052806000815250611415565b600b8054610e9390612784565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebf90612784565b8015610f0c5780601f10610ee157610100808354040283529160200191610f0c565b820191906000526020600020905b815481529060010190602001808311610eef57829003601f168201915b505050505081565b600080548210610f37576040516329c8c00760e21b815260040160405180910390fd5b5090565b6007546001600160a01b03163314610f655760405162461bcd60e51b81526004016108d19061266e565b600c805460ff19811660ff90911615179055565b6000610f8482611b98565b5192915050565b6007546001600160a01b03163314610fb55760405162461bcd60e51b81526004016108d19061266e565b600955565b60006001600160a01b038216610fe3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146110325760405162461bcd60e51b81526004016108d19061266e565b61103c6000611c2c565b565b6007546001600160a01b031633146110685760405162461bcd60e51b81526004016108d19061266e565b600d55565b606033600061107b82610fba565b90506000816001600160401b0381111561109757611097612846565b6040519080825280602002602001820160405280156110c0578160200160208202803683370190505b50905060005b82811015611107576110d88482610d22565b8282815181106110ea576110ea612830565b6020908102919091010152806110ff816127bf565b9150506110c6565b509392505050565b6007546001600160a01b031633146111395760405162461bcd60e51b81526004016108d19061266e565b600c805462ff0000198116620100009182900460ff1615909102179055565b60606002805461090090612784565b3233146111865760405162461bcd60e51b81526004016108d190612622565b600c54610100900460ff166111dd5760405162461bcd60e51b815260206004820152601d60248201527f4649525354424f524e45203a3a204e6f7420596574204163746976652e00000060448201526064016108d1565b612b67816111ea60005490565b6111f491906126f6565b11156112425760405162461bcd60e51b815260206004820152601f60248201527f4649525354424f524e45203a3a204265796f6e64204d617820537570706c790060448201526064016108d1565b336000908152600e60205260409020546005906112609083906126f6565b11156112bc5760405162461bcd60e51b815260206004820152602560248201527f4649525354424f524e45203a3a20416c7265616479206d696e74656420332074604482015264696d65732160d81b60648201526084016108d1565b806008546112ca9190612722565b3410156113105760405162461bcd60e51b815260206004820152601460248201527302324a929aa2127a92722901d1d102132b637bb960651b60448201526064016108d1565b336000908152600e60205260408120805483929061132f9084906126f6565b9091555061133f90503382611b7e565b50565b6001600160a01b03821633141561136c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146114025760405162461bcd60e51b81526004016108d19061266e565b80516108ed90600b90602084019061204c565b61142084848461194b565b61142c84848484611c7e565b611449576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146114795760405162461bcd60e51b81526004016108d19061266e565b600c54640100000000900460ff16156114de5760405162461bcd60e51b815260206004820152602160248201527f4649525354424f524e45203a3a205465616d20616c7265616479206d696e74656044820152601960fa1b60648201526084016108d1565b600c805464ff00000000191664010000000017905561103c336101f4611b7e565b6007546001600160a01b031633146115295760405162461bcd60e51b81526004016108d19061266e565b600c805463ff00000019811663010000009182900460ff1615909102179055565b6060611557826000541190565b6115bb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108d1565b60006115c88360016126f6565b600c5490915060ff1661166857600b80546115e290612784565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612784565b801561165b5780601f106116305761010080835404028352916020019161165b565b820191906000526020600020905b81548152906001019060200180831161163e57829003601f168201915b5050505050915050919050565b6000600a805461167790612784565b90501161169357604051806020016040528060008152506116bf565b600a61169e82611d8d565b6040516020016116af9291906124d3565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146116f05760405162461bcd60e51b81526004016108d19061266e565b600c805461ff001981166101009182900460ff1615909102179055565b6007546001600160a01b031633146117375760405162461bcd60e51b81526004016108d19061266e565b600855565b6007546001600160a01b031633146117665760405162461bcd60e51b81526004016108d19061266e565b60008251116117b75760405162461bcd60e51b815260206004820152601760248201527f6d696e74206174206c65617374206f6e6520746f6b656e00000000000000000060448201526064016108d1565b612b6782516117c560005490565b6117cf91906126f6565b11156118165760405162461bcd60e51b81526020600482015260166024820152751b9bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064016108d1565b60005b8251811015610a525761184583828151811061183757611837612830565b602002602001015183611b7e565b8061184f816127bf565b915050611819565b6007546001600160a01b031633146118815760405162461bcd60e51b81526004016108d19061266e565b6001600160a01b0381166118e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108d1565b61133f81611c2c565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061195682611b98565b80519091506000906001600160a01b0316336001600160a01b0316148061198d57503361198284610983565b6001600160a01b0316145b8061199f5750815161199f90336107cc565b9050806119bf57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146119f45760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611a1b57604051633a954ecd60e21b815260040160405180910390fd5b611a2b60008484600001516118ef565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b031602179055908601808352912054909116611b1e57611ad2816000541190565b15611b1e57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b600082611b758584611e8a565b14949350505050565b6108ed828260405180602001604052806000815250611ef6565b6040805180820190915260008082526020820152611bb7826000541190565b611bd457604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611c22579392505050565b5060001901611bd6565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611d8157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cc290339089908890889060040161258e565b602060405180830381600087803b158015611cdc57600080fd5b505af1925050508015611d0c575060408051601f3d908101601f19168201909252611d0991810190612426565b60015b611d67573d808015611d3a576040519150601f19603f3d011682016040523d82523d6000602084013e611d3f565b606091505b508051611d5f576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d85565b5060015b949350505050565b606081611db15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ddb5780611dc5816127bf565b9150611dd49050600a8361270e565b9150611db5565b6000816001600160401b03811115611df557611df5612846565b6040519080825280601f01601f191660200182016040528015611e1f576020820181803683370190505b5090505b8415611d8557611e34600183612741565b9150611e41600a866127da565b611e4c9060306126f6565b60f81b818381518110611e6157611e61612830565b60200101906001600160f81b031916908160001a905350611e83600a8661270e565b9450611e23565b600081815b8451811015611107576000858281518110611eac57611eac612830565b60200260200101519050808311611ed25760008381526020829052604090209250611ee3565b600081815260208490526040902092505b5080611eee816127bf565b915050611e8f565b610a5283838360016000546001600160a01b038516611f2757604051622e076360e81b815260040160405180910390fd5b83611f455760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156120435760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483801561201957506120176000888488611c7e565b155b15612037576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611fc2565b50600055611b61565b82805461205890612784565b90600052602060002090601f01602090048101928261207a57600085556120c0565b82601f1061209357805160ff19168380011785556120c0565b828001600101855582156120c0579182015b828111156120c05782518255916020019190600101906120a5565b50610f379291505b80821115610f3757600081556001016120c8565b60006001600160401b038311156120f5576120f5612846565b612108601f8401601f19166020016126a3565b905082815283838301111561211c57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461214a57600080fd5b919050565b60006020828403121561216157600080fd5b6116bf82612133565b6000806040838503121561217d57600080fd5b61218683612133565b915061219460208401612133565b90509250929050565b6000806000606084860312156121b257600080fd5b6121bb84612133565b92506121c960208501612133565b9150604084013590509250925092565b600080600080608085870312156121ef57600080fd5b6121f885612133565b935061220660208601612133565b92506040850135915060608501356001600160401b0381111561222857600080fd5b8501601f8101871361223957600080fd5b612248878235602084016120dc565b91505092959194509250565b6000806040838503121561226757600080fd5b61227083612133565b91506020830135801515811461228557600080fd5b809150509250929050565b600080604083850312156122a357600080fd5b6122ac83612133565b946020939093013593505050565b600080604083850312156122cd57600080fd5b82356001600160401b038111156122e357600080fd5b8301601f810185136122f457600080fd5b80356020612309612304836126d3565b6126a3565b80838252828201915082850189848660051b880101111561232957600080fd5b600095505b848610156123535761233f81612133565b83526001959095019491830191830161232e565b5098969091013596505050505050565b6000806040838503121561237657600080fd5b82356001600160401b0381111561238c57600080fd5b8301601f8101851361239d57600080fd5b803560206123ad612304836126d3565b80838252828201915082850189848660051b88010111156123cd57600080fd5b600095505b848610156123535780358352600195909501949183019183016123d2565b60006020828403121561240257600080fd5b5035919050565b60006020828403121561241b57600080fd5b81356116bf8161285c565b60006020828403121561243857600080fd5b81516116bf8161285c565b60006020828403121561245557600080fd5b81356001600160401b0381111561246b57600080fd5b8201601f8101841361247c57600080fd5b611d85848235602084016120dc565b600081518084526124a3816020860160208601612758565b601f01601f19169290920160200192915050565b600081516124c9818560208601612758565b9290920192915050565b600080845481600182811c9150808316806124ef57607f831692505b602080841082141561250f57634e487b7160e01b86526022600452602486fd5b818015612523576001811461253457612561565b60ff19861689528489019650612561565b60008b81526020902060005b868110156125595781548b820152908501908301612540565b505084890196505b50505050505061258561257482866124b7565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906125c19083018461248b565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612603578351835292840192918401916001016125e7565b50909695505050505050565b6020815260006116bf602083018461248b565b6020808252602c908201527f4649525354424f524e45203a3a2043616e6e6f742062652063616c6c6564206260408201526b1e48184818dbdb9d1c9858dd60a21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f191681016001600160401b03811182821017156126cb576126cb612846565b604052919050565b60006001600160401b038211156126ec576126ec612846565b5060051b60200190565b6000821982111561270957612709612804565b500190565b60008261271d5761271d61281a565b500490565b600081600019048311821515161561273c5761273c612804565b500290565b60008282101561275357612753612804565b500390565b60005b8381101561277357818101518382015260200161275b565b838111156114495750506000910152565b600181811c9082168061279857607f821691505b602082108114156127b957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127d3576127d3612804565b5060010190565b6000826127e9576127e961281a565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461133f57600080fdfea2646970667358221220978223150105f46e7847f1989da1f79f1c4d9c80a37611cacda3db9dd5f559e064736f6c63430008070033

Deployed Bytecode Sourcemap

34171:5361:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25203:372;;;;;;;;;;-1:-1:-1;25203:372:0;;;;;:::i;:::-;;:::i;:::-;;;9576:14:1;;9569:22;9551:41;;9539:2;9524:18;25203:372:0;;;;;;;;34935:53;;;;;;;;;;-1:-1:-1;34935:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9749:25:1;;;9737:2;9722:18;34935:53:0;9603:177:1;37940:115:0;;;;;;;;;;-1:-1:-1;37940:115:0;;;;;:::i;:::-;;:::i;:::-;;26662:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34397:44::-;;;;;;;;;;;;;;;;27673:204;;;;;;;;;;-1:-1:-1;27673:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8237:32:1;;;8219:51;;8207:2;8192:18;27673:204:0;8073:203:1;27318:345:0;;;;;;;;;;-1:-1:-1;27318:345:0;;;;;:::i;:::-;;:::i;23866:101::-;;;;;;;;;;-1:-1:-1;23919:7:0;23946:13;23866:101;;34878:50;;;;;;;;;;-1:-1:-1;34878:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;28350:170;;;;;;;;;;-1:-1:-1;28350:170:0;;;;;:::i;:::-;;:::i;35758:849::-;;;;;;:::i;:::-;;:::i;24159:1036::-;;;;;;;;;;-1:-1:-1;24159:1036:0;;;;;:::i;:::-;;:::i;34245:42::-;;;;;;;;;;;;34282:5;34245:42;;34727:22;;;;;;;;;;-1:-1:-1;34727:22:0;;;;;;;;;;;39393:136;;;;;;;;;;;;;:::i;28530:185::-;;;;;;;;;;-1:-1:-1;28530:185:0;;;;;:::i;:::-;;:::i;38324:92::-;;;;;;;;;;-1:-1:-1;38398:10:0;;38324:92;;34539:35;;;;;;;;;;;;;:::i;23975:176::-;;;;;;;;;;-1:-1:-1;23975:176:0;;;;;:::i;:::-;;:::i;34698:22::-;;;;;;;;;;-1:-1:-1;34698:22:0;;;;;;;;39300:85;;;;;;;;;;;;;:::i;26528:124::-;;;;;;;;;;-1:-1:-1;26528:124:0;;;;;:::i;:::-;;:::i;38823:108::-;;;;;;;;;;-1:-1:-1;38823:108:0;;;;;:::i;:::-;;:::i;34294:43::-;;;;;;;;;;;;34336:1;34294:43;;25583:206;;;;;;;;;;-1:-1:-1;25583:206:0;;;;;:::i;:::-;;:::i;12519:103::-;;;;;;;;;;;;;:::i;38211:105::-;;;;;;;;;;-1:-1:-1;38211:105:0;;;;;:::i;:::-;;:::i;37526:406::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34788:17::-;;;;;;;;;;-1:-1:-1;34788:17:0;;;;;;;;;;;34756:25;;;;;;;;;;-1:-1:-1;34756:25:0;;;;;;;;;;;38506:98;;;;;;;;;;;;;:::i;12292:87::-;;;;;;;;;;-1:-1:-1;12365:6:0;;-1:-1:-1;;;;;12365:6:0;12292:87;;26772:104;;;;;;;;;;;;;:::i;35217:533::-;;;;;;:::i;:::-;;:::i;27887:279::-;;;;;;;;;;-1:-1:-1;27887:279:0;;;;;:::i;:::-;;:::i;38061:142::-;;;;;;;;;;-1:-1:-1;38061:142:0;;;;;:::i;:::-;;:::i;28725:308::-;;;;;;;;;;-1:-1:-1;28725:308:0;;;;;:::i;:::-;;:::i;36615:179::-;;;;;;;;;;;;;:::i;34448:47::-;;;;;;;;;;;;;;;;38424:74;;;;;;;;;;;;;:::i;36959:473::-;;;;;;;;;;-1:-1:-1;36959:473:0;;;;;:::i;:::-;;:::i;38612:89::-;;;;;;;;;;;;;:::i;38710:104::-;;;;;;;;;;-1:-1:-1;38710:104:0;;;;;:::i;:::-;;:::i;34812:22::-;;;;;;;;;;-1:-1:-1;34812:22:0;;;;;;;;;;;28176:164;;;;;;;;;;-1:-1:-1;28176:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28297:25:0;;;28273:4;28297:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28176:164;38935:357;;;;;;;;;;-1:-1:-1;38935:357:0;;;;;:::i;:::-;;:::i;12632:201::-;;;;;;;;;;-1:-1:-1;12632:201:0;;;;;:::i;:::-;;:::i;25203:372::-;25305:4;-1:-1:-1;;;;;;25342:40:0;;-1:-1:-1;;;25342:40:0;;:105;;-1:-1:-1;;;;;;;25399:48:0;;-1:-1:-1;;;25399:48:0;25342:105;:172;;;-1:-1:-1;;;;;;;25464:50:0;;-1:-1:-1;;;25464:50:0;25342:172;:225;;;-1:-1:-1;;;;;;;;;;18034:40:0;;;25531:36;25322:245;25203:372;-1:-1:-1;;25203:372:0:o;37940:115::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;;;;;;;;;38019:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;37940:115:::0;:::o;26662:100::-;26716:13;26749:5;26742:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26662:100;:::o;27673:204::-;27741:7;27766:16;27774:7;29100:4;29134:13;-1:-1:-1;29124:23:0;29043:112;27766:16;27761:64;;27791:34;;-1:-1:-1;;;27791:34:0;;;;;;;;;;;27761:64;-1:-1:-1;27845:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27845:24:0;;27673:204::o;27318:345::-;27391:13;27407:24;27423:7;27407:15;:24::i;:::-;27391:40;;27452:5;-1:-1:-1;;;;;27446:11:0;:2;-1:-1:-1;;;;;27446:11:0;;27442:48;;;27466:24;;-1:-1:-1;;;27466:24:0;;;;;;;;;;;27442:48;11771:10;-1:-1:-1;;;;;27507:21:0;;;;;;:63;;-1:-1:-1;27533:37:0;27550:5;11771:10;28176:164;:::i;27533:37::-;27532:38;27507:63;27503:111;;;27579:35;;-1:-1:-1;;;27579:35:0;;;;;;;;;;;27503:111;27627:28;27636:2;27640:7;27649:5;27627:8;:28::i;:::-;27380:283;27318:345;;:::o;28350:170::-;28484:28;28494:4;28500:2;28504:7;28484:9;:28::i;35758:849::-;35117:9;35130:10;35117:23;35109:80;;;;-1:-1:-1;;;35109:80:0;;;;;;;:::i;:::-;35879:13:::1;::::0;;;::::1;;;35871:59;;;::::0;-1:-1:-1;;;35871:59:0;;12607:2:1;35871:59:0::1;::::0;::::1;12589:21:1::0;12646:2;12626:18;;;12619:30;12685:34;12665:18;;;12658:62;-1:-1:-1;;;12736:18:1;;;12729:31;12777:19;;35871:59:0::1;12405:397:1::0;35871:59:0::1;34282:5;35966:9;35950:13;23919:7:::0;23946:13;;23866:101;35950:13:::1;:25;;;;:::i;:::-;35949:41;;35941:97;;;::::0;-1:-1:-1;;;35941:97:0;;11786:2:1;35941:97:0::1;::::0;::::1;11768:21:1::0;11825:2;11805:18;;;11798:30;11864:34;11844:18;;;11837:62;-1:-1:-1;;;11915:18:1;;;11908:41;11966:19;;35941:97:0::1;11584:407:1::0;35941:97:0::1;36077:10;36058:30;::::0;;;:18:::1;:30;::::0;;;;;34389:1:::1;::::0;36058:42:::1;::::0;36091:9;;36058:42:::1;:::i;:::-;36057:67;;36049:132;;;::::0;-1:-1:-1;;;36049:132:0;;13009:2:1;36049:132:0::1;::::0;::::1;12991:21:1::0;13048:2;13028:18;;;13021:30;13087:34;13067:18;;;13060:62;-1:-1:-1;;;13138:18:1;;;13131:50;13198:19;;36049:132:0::1;12807:416:1::0;36049:132:0::1;36237:9;36214:20;;:32;;;;:::i;:::-;36200:9;:47;;36192:100;;;::::0;-1:-1:-1;;;36192:100:0;;12198:2:1;36192:100:0::1;::::0;::::1;12180:21:1::0;12237:2;12217:18;;;12210:30;12276:34;12256:18;;;12249:62;-1:-1:-1;;;12327:18:1;;;12320:38;12375:19;;36192:100:0::1;11996:404:1::0;36192:100:0::1;36358:28;::::0;-1:-1:-1;;36375:10:0::1;6682:2:1::0;6678:15;6674:53;36358:28:0::1;::::0;::::1;6662:66:1::0;36331:14:0::1;::::0;6744:12:1;;36358:28:0::1;;;;;;;;;;;;36348:39;;;;;;36331:56;;36406:52;36425:12;36439:10;;36451:6;36406:18;:52::i;:::-;36398:102;;;::::0;-1:-1:-1;;;36398:102:0;;13430:2:1;36398:102:0::1;::::0;::::1;13412:21:1::0;13469:2;13449:18;;;13442:30;13508:34;13488:18;;;13481:62;-1:-1:-1;;;13559:18:1;;;13552:35;13604:19;;36398:102:0::1;13228:401:1::0;36398:102:0::1;36532:10;36513:30;::::0;;;:18:::1;:30;::::0;;;;:43;;36547:9;;36513:30;:43:::1;::::0;36547:9;;36513:43:::1;:::i;:::-;::::0;;;-1:-1:-1;36567:32:0::1;::::0;-1:-1:-1;36577:10:0::1;36589:9:::0;36567::::1;:32::i;24159:1036::-:0;24248:7;24281:16;24291:5;24281:9;:16::i;:::-;24272:5;:25;24268:61;;24306:23;;-1:-1:-1;;;24306:23:0;;;;;;;;;;;24268:61;24340:22;23946:13;;;24340:22;;24603:466;24623:14;24619:1;:18;24603:466;;;24663:31;24697:14;;;:11;:14;;;;;;;;;24663:48;;;;;;;;;-1:-1:-1;;;;;24663:48:0;;;;;-1:-1:-1;;;24663:48:0;;;-1:-1:-1;;;;;24663:48:0;;;;;;;;24734:28;24730:111;;24807:14;;;-1:-1:-1;24730:111:0;24884:5;-1:-1:-1;;;;;24863:26:0;:17;-1:-1:-1;;;;;24863:26:0;;24859:195;;;24933:5;24918:11;:20;24914:85;;;-1:-1:-1;24974:1:0;-1:-1:-1;24967:8:0;;-1:-1:-1;;;24967:8:0;24914:85;25021:13;;;;;24859:195;-1:-1:-1;24639:3:0;;24603:466;;;-1:-1:-1;25145:13:0;;:::i;:::-;-1:-1:-1;25176:11:0;24159:1036;-1:-1:-1;;;;24159:1036:0:o;39393:136::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;39450:21:::1;39490:7;12365:6:::0;;-1:-1:-1;;;;;12365:6:0;;12292:87;39490:7:::1;-1:-1:-1::0;;;;;39482:25:0::1;:36;39508:8;39482:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;28530:185:::0;28668:39;28685:4;28691:2;28695:7;28668:39;;;;;;;;;;;;:16;:39::i;34539:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23975:176::-;24042:7;23946:13;;24066:5;:22;24062:58;;24097:23;;-1:-1:-1;;;24097:23:0;;;;;;;;;;;24062:58;-1:-1:-1;24138:5:0;23975:176::o;39300:85::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;39367:10:::1;::::0;;-1:-1:-1;;39353:24:0;::::1;39367:10;::::0;;::::1;39366:11;39353:24;::::0;;39300:85::o;26528:124::-;26592:7;26619:20;26631:7;26619:11;:20::i;:::-;:25;;26528:124;-1:-1:-1;;26528:124:0:o;38823:108::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38895:20:::1;:28:::0;38823:108::o;25583:206::-;25647:7;-1:-1:-1;;;;;25671:19:0;;25667:60;;25699:28;;-1:-1:-1;;;25699:28:0;;;;;;;;;;;25667:60;-1:-1:-1;;;;;;25753:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;25753:27:0;;25583:206::o;12519:103::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;12584:30:::1;12611:1;12584:18;:30::i;:::-;12519:103::o:0;38211:105::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38284:10:::1;:24:::0;38211:105::o;37526:406::-;37568:16;37613:10;37596:14;37661:17;37613:10;37661:9;:17::i;:::-;37634:44;;37689:25;37731:16;-1:-1:-1;;;;;37717:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37717:31:0;;37689:59;;37765:13;37761:136;37792:16;37784:5;:24;37761:136;;;37851:34;37871:6;37879:5;37851:19;:34::i;:::-;37833:8;37842:5;37833:15;;;;;;;;:::i;:::-;;;;;;;;;;:52;37810:7;;;;:::i;:::-;;;;37761:136;;;-1:-1:-1;37916:8:0;37526:406;-1:-1:-1;;;37526:406:0:o;38506:98::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38583:13:::1;::::0;;-1:-1:-1;;38566:30:0;::::1;38583:13:::0;;;;::::1;;;38582:14;38566:30:::0;;::::1;;::::0;;38506:98::o;26772:104::-;26828:13;26861:7;26854:14;;;;;:::i;35217:533::-;35117:9;35130:10;35117:23;35109:80;;;;-1:-1:-1;;;35109:80:0;;;;;;;:::i;:::-;35298:10:::1;::::0;::::1;::::0;::::1;;;35290:52;;;::::0;-1:-1:-1;;;35290:52:0;;15375:2:1;35290:52:0::1;::::0;::::1;15357:21:1::0;15414:2;15394:18;;;15387:30;15453:31;15433:18;;;15426:59;15502:18;;35290:52:0::1;15173:353:1::0;35290:52:0::1;34282:5;35378:9;35362:13;23919:7:::0;23946:13;;23866:101;35362:13:::1;:25;;;;:::i;:::-;35361:41;;35353:85;;;::::0;-1:-1:-1;;;35353:85:0;;15015:2:1;35353:85:0::1;::::0;::::1;14997:21:1::0;15054:2;15034:18;;;15027:30;15093:33;15073:18;;;15066:61;15144:18;;35353:85:0::1;14813:355:1::0;35353:85:0::1;35474:10;35458:27;::::0;;;:15:::1;:27;::::0;;;;;34336:1:::1;::::0;35458:38:::1;::::0;35487:9;;35458:38:::1;:::i;:::-;35457:59;;35449:109;;;::::0;-1:-1:-1;;;35449:109:0;;10973:2:1;35449:109:0::1;::::0;::::1;10955:21:1::0;11012:2;10992:18;;;10985:30;11051:34;11031:18;;;11024:62;-1:-1:-1;;;11102:18:1;;;11095:35;11147:19;;35449:109:0::1;10771:401:1::0;35449:109:0::1;35611:9;35591:17;;:29;;;;:::i;:::-;35577:9;:44;;35569:77;;;::::0;-1:-1:-1;;;35569:77:0;;10211:2:1;35569:77:0::1;::::0;::::1;10193:21:1::0;10250:2;10230:18;;;10223:30;-1:-1:-1;;;10269:18:1;;;10262:50;10329:18;;35569:77:0::1;10009:344:1::0;35569:77:0::1;35675:10;35659:27;::::0;;;:15:::1;:27;::::0;;;;:40;;35690:9;;35659:27;:40:::1;::::0;35690:9;;35659:40:::1;:::i;:::-;::::0;;;-1:-1:-1;35710:32:0::1;::::0;-1:-1:-1;35720:10:0::1;35732:9:::0;35710::::1;:32::i;:::-;35217:533:::0;:::o;27887:279::-;-1:-1:-1;;;;;27978:24:0;;11771:10;27978:24;27974:54;;;28011:17;;-1:-1:-1;;;28011:17:0;;;;;;;;;;;27974:54;11771:10;28041:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28041:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28041:53:0;;;;;;;;;;28110:48;;9551:41:1;;;28041:42:0;;11771:10;28110:48;;9524:18:1;28110:48:0;;;;;;;27887:279;;:::o;38061:142::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38153:42;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;28725:308::-:0;28884:28;28894:4;28900:2;28904:7;28884:9;:28::i;:::-;28928:48;28951:4;28957:2;28961:7;28970:5;28928:22;:48::i;:::-;28923:102;;28985:40;;-1:-1:-1;;;28985:40:0;;;;;;;;;;;28923:102;28725:308;;;;:::o;36615:179::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;36673:10:::1;::::0;;;::::1;;;36672:11;36664:57;;;::::0;-1:-1:-1;;;36664:57:0;;14613:2:1;36664:57:0::1;::::0;::::1;14595:21:1::0;14652:2;14632:18;;;14625:30;14691:34;14671:18;;;14664:62;-1:-1:-1;;;14742:18:1;;;14735:31;14783:19;;36664:57:0::1;14411:397:1::0;36664:57:0::1;36732:10;:17:::0;;-1:-1:-1;;36732:17:0::1;::::0;::::1;::::0;;36760:26:::1;36770:10;36782:3;36760:9;:26::i;38424:74::-:0;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38485:5:::1;::::0;;-1:-1:-1;;38476:14:0;::::1;38485:5:::0;;;;::::1;;;38484:6;38476:14:::0;;::::1;;::::0;;38424:74::o;36959:473::-;37032:13;37066:16;37074:7;29100:4;29134:13;-1:-1:-1;29124:23:0;29043:112;37066:16;37058:76;;;;-1:-1:-1;;;37058:76:0;;14197:2:1;37058:76:0;;;14179:21:1;14236:2;14216:18;;;14209:30;14275:34;14255:18;;;14248:62;-1:-1:-1;;;14326:18:1;;;14319:45;14381:19;;37058:76:0;13995:411:1;37058:76:0;37147:14;37164:11;:7;37174:1;37164:11;:::i;:::-;37192:10;;37147:28;;-1:-1:-1;37192:10:0;;37188:68;;37225:19;37218:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36959:473;;;:::o;37188:68::-;37349:1;37326:12;37320:26;;;;;:::i;:::-;;;:30;:104;;;;;;;;;;;;;;;;;37377:12;37391:17;:6;:15;:17::i;:::-;37360:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37320:104;37313:111;36959:473;-1:-1:-1;;;36959:473:0:o;38612:89::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38683:10:::1;::::0;;-1:-1:-1;;38669:24:0;::::1;38683:10;::::0;;;::::1;;;38682:11;38669:24:::0;;::::1;;::::0;;38612:89::o;38710:104::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;38781:17:::1;:25:::0;38710:104::o;38935:357::-;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;39045:1:::1;39027:8;:15;:19;39019:55;;;::::0;-1:-1:-1;;;39019:55:0;;15733:2:1;39019:55:0::1;::::0;::::1;15715:21:1::0;15772:2;15752:18;;;15745:30;15811:25;15791:18;;;15784:53;15854:18;;39019:55:0::1;15531:347:1::0;39019:55:0::1;34282:5;39109:8;:15;39093:13;23919:7:::0;23946:13;;23866:101;39093:13:::1;:31;;;;:::i;:::-;:45;;39085:80;;;::::0;-1:-1:-1;;;39085:80:0;;16085:2:1;39085:80:0::1;::::0;::::1;16067:21:1::0;16124:2;16104:18;;;16097:30;-1:-1:-1;;;16143:18:1;;;16136:52;16205:18;;39085:80:0::1;15883:346:1::0;39085:80:0::1;39181:6;39176:109;39197:8;:15;39193:1;:19;39176:109;;;39243:30;39253:8;39262:1;39253:11;;;;;;;;:::i;:::-;;;;;;;39266:6;39243:9;:30::i;:::-;39214:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39176:109;;12632:201:::0;12365:6;;-1:-1:-1;;;;;12365:6:0;11771:10;12429:23;12421:68;;;;-1:-1:-1;;;12421:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12721:22:0;::::1;12713:73;;;::::0;-1:-1:-1;;;12713:73:0;;11379:2:1;12713:73:0::1;::::0;::::1;11361:21:1::0;11418:2;11398:18;;;11391:30;11457:34;11437:18;;;11430:62;-1:-1:-1;;;11508:18:1;;;11501:36;11554:19;;12713:73:0::1;11177:402:1::0;12713:73:0::1;12797:28;12816:8;12797:18;:28::i;32852:196::-:0;32967:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;32967:29:0;-1:-1:-1;;;;;32967:29:0;;;;;;;;;33012:28;;32967:24;;33012:28;;;;;;;32852:196;;;:::o;30880:1962::-;30995:35;31033:20;31045:7;31033:11;:20::i;:::-;31108:18;;30995:58;;-1:-1:-1;31066:22:0;;-1:-1:-1;;;;;31092:34:0;11771:10;-1:-1:-1;;;;;31092:34:0;;:87;;;-1:-1:-1;11771:10:0;31143:20;31155:7;31143:11;:20::i;:::-;-1:-1:-1;;;;;31143:36:0;;31092:87;:154;;;-1:-1:-1;31213:18:0;;31196:50;;11771:10;28176:164;:::i;31196:50::-;31066:181;;31265:17;31260:66;;31291:35;;-1:-1:-1;;;31291:35:0;;;;;;;;;;;31260:66;31363:4;-1:-1:-1;;;;;31341:26:0;:13;:18;;;-1:-1:-1;;;;;31341:26:0;;31337:67;;31376:28;;-1:-1:-1;;;31376:28:0;;;;;;;;;;;31337:67;-1:-1:-1;;;;;31419:16:0;;31415:52;;31444:23;;-1:-1:-1;;;31444:23:0;;;;;;;;;;;31415:52;31588:49;31605:1;31609:7;31618:13;:18;;;31588:8;:49::i;:::-;-1:-1:-1;;;;;31933:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;31933:31:0;;;-1:-1:-1;;;;;31933:31:0;;;-1:-1:-1;;31933:31:0;;;;;;;31979:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;31979:29:0;;;;;;;;;;;;;32025:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;32070:61:0;;;;-1:-1:-1;;;32115:15:0;-1:-1:-1;;;;;32070:61:0;;;;;32405:11;;;32435:24;;;;;:29;32405:11;;32435:29;32431:295;;32503:20;32511:11;29100:4;29134:13;-1:-1:-1;29124:23:0;29043:112;32503:20;32499:212;;;32580:18;;;32548:24;;;:11;:24;;;;;;;;:50;;32663:28;;;;-1:-1:-1;;;;;32621:70:0;-1:-1:-1;;;32621:70:0;-1:-1:-1;;;;;;32621:70:0;;;-1:-1:-1;;;;;32548:50:0;;;32621:70;;;;;;;32499:212;31908:829;32773:7;32769:2;-1:-1:-1;;;;;32754:27:0;32763:4;-1:-1:-1;;;;;32754:27:0;;;;;;;;;;;32792:42;30984:1858;;30880:1962;;;:::o;5334:190::-;5459:4;5512;5483:25;5496:5;5503:4;5483:12;:25::i;:::-;:33;;5334:190;-1:-1:-1;;;;5334:190:0:o;29163:104::-;29232:27;29242:2;29246:8;29232:27;;;;;;;;;;;;:9;:27::i;26014:504::-;-1:-1:-1;;;;;;;;;;;;;;;;;26114:16:0;26122:7;29100:4;29134:13;-1:-1:-1;29124:23:0;29043:112;26114:16;26109:61;;26139:31;;-1:-1:-1;;;26139:31:0;;;;;;;;;;;26109:61;26228:7;26208:245;26275:31;26309:17;;;:11;:17;;;;;;;;;26275:51;;;;;;;;;-1:-1:-1;;;;;26275:51:0;;;;;-1:-1:-1;;;26275:51:0;;;-1:-1:-1;;;;;26275:51:0;;;;;;;;26349:28;26345:93;;26409:9;26014:504;-1:-1:-1;;;26014:504:0:o;26345:93::-;-1:-1:-1;;;26248:6:0;26208:245;;12843:191;12936:6;;;-1:-1:-1;;;;;12953:17:0;;;-1:-1:-1;;;;;;12953:17:0;;;;;;;12986:40;;12936:6;;;12953:17;12936:6;;12986:40;;12917:16;;12986:40;12906:128;12843:191;:::o;33058:765::-;33213:4;-1:-1:-1;;;;;33234:13:0;;13517:19;:23;33230:586;;33270:72;;-1:-1:-1;;;33270:72:0;;-1:-1:-1;;;;;33270:36:0;;;;;:72;;11771:10;;33321:4;;33327:7;;33336:5;;33270:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33270:72:0;;;;;;;;-1:-1:-1;;33270:72:0;;;;;;;;;;;;:::i;:::-;;;33266:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33516:13:0;;33512:234;;33543:40;;-1:-1:-1;;;33543:40:0;;;;;;;;;;;33512:234;33696:6;33690:13;33681:6;33677:2;33673:15;33666:38;33266:495;-1:-1:-1;;;;;;33393:55:0;-1:-1:-1;;;33393:55:0;;-1:-1:-1;33386:62:0;;33230:586;-1:-1:-1;33800:4:0;33230:586;33058:765;;;;;;:::o;6679:723::-;6735:13;6956:10;6952:53;;-1:-1:-1;;6983:10:0;;;;;;;;;;;;-1:-1:-1;;;6983:10:0;;;;;6679:723::o;6952:53::-;7030:5;7015:12;7071:78;7078:9;;7071:78;;7104:8;;;;:::i;:::-;;-1:-1:-1;7127:10:0;;-1:-1:-1;7135:2:0;7127:10;;:::i;:::-;;;7071:78;;;7159:19;7191:6;-1:-1:-1;;;;;7181:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7181:17:0;;7159:39;;7209:154;7216:10;;7209:154;;7243:11;7253:1;7243:11;;:::i;:::-;;-1:-1:-1;7312:10:0;7320:2;7312:5;:10;:::i;:::-;7299:24;;:2;:24;:::i;:::-;7286:39;;7269:6;7276;7269:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7269:56:0;;;;;;;;-1:-1:-1;7340:11:0;7349:2;7340:11;;:::i;:::-;;;7209:154;;5532:675;5615:7;5658:4;5615:7;5673:497;5697:5;:12;5693:1;:16;5673:497;;;5731:20;5754:5;5760:1;5754:8;;;;;;;;:::i;:::-;;;;;;;5731:31;;5797:12;5781;:28;5777:382;;6283:13;6333:15;;;6369:4;6362:15;;;6416:4;6400:21;;5909:57;;5777:382;;;6283:13;6333:15;;;6369:4;6362:15;;;6416:4;6400:21;;6086:57;;5777:382;-1:-1:-1;5711:3:0;;;;:::i;:::-;;;;5673:497;;29277:163;29400:32;29406:2;29410:8;29420:5;29427:4;29589:20;29612:13;-1:-1:-1;;;;;29640:16:0;;29636:48;;29665:19;;-1:-1:-1;;;29665:19:0;;;;;;;;;;;29636:48;29699:13;29695:44;;29721:18;;-1:-1:-1;;;29721:18:0;;;;;;;;;;;29695:44;-1:-1:-1;;;;;30092:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;30092:45:0;;-1:-1:-1;;;;;30092:45:0;;;;;;;;;;30152:50;;;;;;;;;;;;;;30219:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;30269:66:0;;;;-1:-1:-1;;;30319:15:0;-1:-1:-1;;;;;30269:66:0;;;;;;30219:25;;30404:330;30424:8;30420:1;:12;30404:330;;;30463:38;;30488:12;;-1:-1:-1;;;;;30463:38:0;;;30480:1;;30463:38;;30480:1;;30463:38;30524:4;:68;;;;;30533:59;30564:1;30568:2;30572:12;30586:5;30533:22;:59::i;:::-;30532:60;30524:68;30520:164;;;30624:40;;-1:-1:-1;;;30624:40:0;;;;;;;;;;;30520:164;30704:14;;;;;30434:3;30404:330;;;-1:-1:-1;30750:13:0;:28;30802:60;28725:308;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;-1:-1:-1;;;;;1811:6:1;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:978::-;2767:6;2775;2828:2;2816:9;2807:7;2803:23;2799:32;2796:52;;;2844:1;2841;2834:12;2796:52;2884:9;2871:23;-1:-1:-1;;;;;2909:6:1;2906:30;2903:50;;;2949:1;2946;2939:12;2903:50;2972:22;;3025:4;3017:13;;3013:27;-1:-1:-1;3003:55:1;;3054:1;3051;3044:12;3003:55;3090:2;3077:16;3112:4;3136:60;3152:43;3192:2;3152:43;:::i;:::-;3136:60;:::i;:::-;3218:3;3242:2;3237:3;3230:15;3270:2;3265:3;3261:12;3254:19;;3301:2;3297;3293:11;3349:7;3344:2;3338;3335:1;3331:10;3327:2;3323:19;3319:28;3316:41;3313:61;;;3370:1;3367;3360:12;3313:61;3392:1;3383:10;;3402:169;3416:2;3413:1;3410:9;3402:169;;;3473:23;3492:3;3473:23;:::i;:::-;3461:36;;3434:1;3427:9;;;;;3517:12;;;;3549;;3402:169;;;-1:-1:-1;3590:5:1;3627:18;;;;3614:32;;-1:-1:-1;;;;;;2674:978:1:o;3657:972::-;3750:6;3758;3811:2;3799:9;3790:7;3786:23;3782:32;3779:52;;;3827:1;3824;3817:12;3779:52;3867:9;3854:23;-1:-1:-1;;;;;3892:6:1;3889:30;3886:50;;;3932:1;3929;3922:12;3886:50;3955:22;;4008:4;4000:13;;3996:27;-1:-1:-1;3986:55:1;;4037:1;4034;4027:12;3986:55;4073:2;4060:16;4095:4;4119:60;4135:43;4175:2;4135:43;:::i;4119:60::-;4201:3;4225:2;4220:3;4213:15;4253:2;4248:3;4244:12;4237:19;;4284:2;4280;4276:11;4332:7;4327:2;4321;4318:1;4314:10;4310:2;4306:19;4302:28;4299:41;4296:61;;;4353:1;4350;4343:12;4296:61;4375:1;4366:10;;4385:163;4399:2;4396:1;4393:9;4385:163;;;4456:17;;4444:30;;4417:1;4410:9;;;;;4494:12;;;;4526;;4385:163;;4634:180;4693:6;4746:2;4734:9;4725:7;4721:23;4717:32;4714:52;;;4762:1;4759;4752:12;4714:52;-1:-1:-1;4785:23:1;;4634:180;-1:-1:-1;4634:180:1:o;4819:245::-;4877:6;4930:2;4918:9;4909:7;4905:23;4901:32;4898:52;;;4946:1;4943;4936:12;4898:52;4985:9;4972:23;5004:30;5028:5;5004:30;:::i;5069:249::-;5138:6;5191:2;5179:9;5170:7;5166:23;5162:32;5159:52;;;5207:1;5204;5197:12;5159:52;5239:9;5233:16;5258:30;5282:5;5258:30;:::i;5323:450::-;5392:6;5445:2;5433:9;5424:7;5420:23;5416:32;5413:52;;;5461:1;5458;5451:12;5413:52;5501:9;5488:23;-1:-1:-1;;;;;5526:6:1;5523:30;5520:50;;;5566:1;5563;5556:12;5520:50;5589:22;;5642:4;5634:13;;5630:27;-1:-1:-1;5620:55:1;;5671:1;5668;5661:12;5620:55;5694:73;5759:7;5754:2;5741:16;5736:2;5732;5728:11;5694:73;:::i;5963:257::-;6004:3;6042:5;6036:12;6069:6;6064:3;6057:19;6085:63;6141:6;6134:4;6129:3;6125:14;6118:4;6111:5;6107:16;6085:63;:::i;:::-;6202:2;6181:15;-1:-1:-1;;6177:29:1;6168:39;;;;6209:4;6164:50;;5963:257;-1:-1:-1;;5963:257:1:o;6225:185::-;6267:3;6305:5;6299:12;6320:52;6365:6;6360:3;6353:4;6346:5;6342:16;6320:52;:::i;:::-;6388:16;;;;;6225:185;-1:-1:-1;;6225:185:1:o;6767:1301::-;7044:3;7073:1;7106:6;7100:13;7136:3;7158:1;7186:9;7182:2;7178:18;7168:28;;7246:2;7235:9;7231:18;7268;7258:61;;7312:4;7304:6;7300:17;7290:27;;7258:61;7338:2;7386;7378:6;7375:14;7355:18;7352:38;7349:165;;;-1:-1:-1;;;7413:33:1;;7469:4;7466:1;7459:15;7499:4;7420:3;7487:17;7349:165;7530:18;7557:104;;;;7675:1;7670:320;;;;7523:467;;7557:104;-1:-1:-1;;7590:24:1;;7578:37;;7635:16;;;;-1:-1:-1;7557:104:1;;7670:320;16957:1;16950:14;;;16994:4;16981:18;;7765:1;7779:165;7793:6;7790:1;7787:13;7779:165;;;7871:14;;7858:11;;;7851:35;7914:16;;;;7808:10;;7779:165;;;7783:3;;7973:6;7968:3;7964:16;7957:23;;7523:467;;;;;;;8006:56;8031:30;8057:3;8049:6;8031:30;:::i;:::-;-1:-1:-1;;;6475:20:1;;6520:1;6511:11;;6415:113;8006:56;7999:63;6767:1301;-1:-1:-1;;;;;6767:1301:1:o;8281:488::-;-1:-1:-1;;;;;8550:15:1;;;8532:34;;8602:15;;8597:2;8582:18;;8575:43;8649:2;8634:18;;8627:34;;;8697:3;8692:2;8677:18;;8670:31;;;8475:4;;8718:45;;8743:19;;8735:6;8718:45;:::i;:::-;8710:53;8281:488;-1:-1:-1;;;;;;8281:488:1:o;8774:632::-;8945:2;8997:21;;;9067:13;;8970:18;;;9089:22;;;8916:4;;8945:2;9168:15;;;;9142:2;9127:18;;;8916:4;9211:169;9225:6;9222:1;9219:13;9211:169;;;9286:13;;9274:26;;9355:15;;;;9320:12;;;;9247:1;9240:9;9211:169;;;-1:-1:-1;9397:3:1;;8774:632;-1:-1:-1;;;;;;8774:632:1:o;9785:219::-;9934:2;9923:9;9916:21;9897:4;9954:44;9994:2;9983:9;9979:18;9971:6;9954:44;:::i;10358:408::-;10560:2;10542:21;;;10599:2;10579:18;;;10572:30;10638:34;10633:2;10618:18;;10611:62;-1:-1:-1;;;10704:2:1;10689:18;;10682:42;10756:3;10741:19;;10358:408::o;13634:356::-;13836:2;13818:21;;;13855:18;;;13848:30;13914:34;13909:2;13894:18;;13887:62;13981:2;13966:18;;13634:356::o;16416:275::-;16487:2;16481:9;16552:2;16533:13;;-1:-1:-1;;16529:27:1;16517:40;;-1:-1:-1;;;;;16572:34:1;;16608:22;;;16569:62;16566:88;;;16634:18;;:::i;:::-;16670:2;16663:22;16416:275;;-1:-1:-1;16416:275:1:o;16696:183::-;16756:4;-1:-1:-1;;;;;16781:6:1;16778:30;16775:56;;;16811:18;;:::i;:::-;-1:-1:-1;16856:1:1;16852:14;16868:4;16848:25;;16696:183::o;17010:128::-;17050:3;17081:1;17077:6;17074:1;17071:13;17068:39;;;17087:18;;:::i;:::-;-1:-1:-1;17123:9:1;;17010:128::o;17143:120::-;17183:1;17209;17199:35;;17214:18;;:::i;:::-;-1:-1:-1;17248:9:1;;17143:120::o;17268:168::-;17308:7;17374:1;17370;17366:6;17362:14;17359:1;17356:21;17351:1;17344:9;17337:17;17333:45;17330:71;;;17381:18;;:::i;:::-;-1:-1:-1;17421:9:1;;17268:168::o;17441:125::-;17481:4;17509:1;17506;17503:8;17500:34;;;17514:18;;:::i;:::-;-1:-1:-1;17551:9:1;;17441:125::o;17571:258::-;17643:1;17653:113;17667:6;17664:1;17661:13;17653:113;;;17743:11;;;17737:18;17724:11;;;17717:39;17689:2;17682:10;17653:113;;;17784:6;17781:1;17778:13;17775:48;;;-1:-1:-1;;17819:1:1;17801:16;;17794:27;17571:258::o;17834:380::-;17913:1;17909:12;;;;17956;;;17977:61;;18031:4;18023:6;18019:17;18009:27;;17977:61;18084:2;18076:6;18073:14;18053:18;18050:38;18047:161;;;18130:10;18125:3;18121:20;18118:1;18111:31;18165:4;18162:1;18155:15;18193:4;18190:1;18183:15;18047:161;;17834:380;;;:::o;18219:135::-;18258:3;-1:-1:-1;;18279:17:1;;18276:43;;;18299:18;;:::i;:::-;-1:-1:-1;18346:1:1;18335:13;;18219:135::o;18359:112::-;18391:1;18417;18407:35;;18422:18;;:::i;:::-;-1:-1:-1;18456:9:1;;18359:112::o;18476:127::-;18537:10;18532:3;18528:20;18525:1;18518:31;18568:4;18565:1;18558:15;18592:4;18589:1;18582:15;18608:127;18669:10;18664:3;18660:20;18657:1;18650:31;18700:4;18697:1;18690:15;18724:4;18721:1;18714:15;18740:127;18801:10;18796:3;18792:20;18789:1;18782:31;18832:4;18829:1;18822:15;18856:4;18853:1;18846:15;18872:127;18933:10;18928:3;18924:20;18921:1;18914:31;18964:4;18961:1;18954:15;18988:4;18985:1;18978:15;19004:127;19065:10;19060:3;19056:20;19053:1;19046:31;19096:4;19093:1;19086:15;19120:4;19117:1;19110:15;19136:131;-1:-1:-1;;;;;;19210:32:1;;19200:43;;19190:71;;19257:1;19254;19247:12

Swarm Source

ipfs://978223150105f46e7847f1989da1f79f1c4d9c80a37611cacda3db9dd5f559e0
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.