ETH Price: $3,101.26 (-0.98%)

Token

Cronies (Cronies)
 

Overview

Max Total Supply

5,555 Cronies

Holders

1,425

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 Cronies
0x1ca08b0bd0cb1add5c72ca2f384d38c6ba1f1d39
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:
Cronies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 7 : Cronies.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "erc721a/contracts/ERC721A.sol";

contract Cronies is ERC721A, Ownable, ReentrancyGuard {

    string public baseURI;  
    uint public priceWhitelist = 10000000000000000; //0.01 ETH
    uint public pricePublic = 15000000000000000; //0.015 ETH
    uint public maxPerTx = 5;  
    uint public maxPerWallet = 5;
    uint public maxSupply = 5555;
    bool public mintEnabled = false;
    bytes32 public merkleRoot;
    mapping (address => uint256) public addressPublic;
    mapping (address => uint256) public addressWhitelist;

    constructor() ERC721A("Cronies", "Cronies"){}

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function setMerkleRoot(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }

    function airdrop(address to ,uint256 amount) external onlyOwner
    {
        _safeMint(to, amount);
    }

    function ownerBatchMint(uint256 amount) external onlyOwner
    {
        _safeMint(msg.sender, amount);
    }

    function toggleMinting() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setBaseURI(string calldata baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    function setPricePublic(uint256 price_) external onlyOwner {
        pricePublic = price_;
    }

    function setPriceWhitelist(uint256 price_) external onlyOwner {
        priceWhitelist = price_;
    } 

    function setMaxPerTx(uint256 maxPerTx_) external onlyOwner {
        maxPerTx = maxPerTx_;
    }

    function setMaxPerWallet(uint256 maxPerWallet_) external onlyOwner {
        maxPerWallet = maxPerWallet_;
    }

    function setmaxSupply(uint256 maxSupply_) external onlyOwner {
        maxSupply = maxSupply_;
    }

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

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(payable(address(this)).balance);
    }

    function whitelistMint(uint256 amount, bytes32[] calldata _merkleProof) external payable
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(mintEnabled, "Cronies: Minting Pause");
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Cronies: You are not whitelisted");
        require(msg.value <= amount * priceWhitelist,"Cronies: Insufficient Funds");
        require(totalSupply() + amount <= maxSupply,"Cronies: Soldout");
        require(addressWhitelist[msg.sender] + amount <= maxPerWallet,"Cronies: Max Per Wallet");
        require(amount <= maxPerTx, "Cronies: Limit Per Transaction");
        addressWhitelist[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }

    function publicMint(uint256 amount) external payable
    {
        require(mintEnabled, "Cronies: Minting Pause");
        require(msg.value <= amount * pricePublic,"Cronies: Insufficient Funds");
        require(totalSupply() + amount <= maxSupply,"Cronies: Soldout");
        require(addressPublic[msg.sender] + amount <= maxPerWallet,"Cronies: Max Per Wallet");
        require(amount <= maxPerTx, "Cronies: Limit Per Transaction");
        addressPublic[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }
}

File 2 of 7 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // 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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) 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 > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 3 of 7 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 7 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

File 6 of 7 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 7 of 7 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"","type":"address"}],"name":"addressPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerTx_","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet_","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPricePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPriceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setmaxSupply","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":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc10000600b5566354a6ba7a18000600c556005600d556005600e556115b3600f556000601060006101000a81548160ff0219169083151502179055503480156200005257600080fd5b506040518060400160405280600781526020017f43726f6e696573000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f43726f6e696573000000000000000000000000000000000000000000000000008152508160029080519060200190620000d79291906200020a565b508060039080519060200190620000f09291906200020a565b50620001016200013760201b60201c565b6000819055505050620001296200011d6200013c60201b60201c565b6200014460201b60201c565b60016009819055506200031f565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021890620002ba565b90600052602060002090601f0160209004810192826200023c576000855562000288565b82601f106200025757805160ff191683800117855562000288565b8280016001018555821562000288579182015b82811115620002875782518255916020019190600101906200026a565b5b5090506200029791906200029b565b5090565b5b80821115620002b65760008160009055506001016200029c565b5090565b60006002820490506001821680620002d357607f821691505b60208210811415620002ea57620002e9620002f0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613acf806200032f6000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063bfd0b1f0116100b6578063d5abeb011161007a578063d5abeb0114610836578063dc33e68114610861578063e268e4d31461089e578063e985e9c5146108c7578063f2fde38b14610904578063f968adbe1461092d57610246565b8063bfd0b1f01461074c578063c6f6f21614610789578063c87b56dd146107b2578063d1239730146107ef578063d2cab0561461081a57610246565b80638db89f07116100fd5780638db89f071461067d57806395d89b41146106a6578063a22cb465146106d1578063b88d4fde146106fa578063b95f8b5f1461072357610246565b8063715018a6146105d25780637cb64759146105e95780637d55094d146106125780638ba4cc3c146106295780638da5cb5b1461065257610246565b80632fff1796116101c7578063453c23101161018b578063453c2310146104d957806355f804b3146105045780636352211e1461052d5780636c0360eb1461056a57806370a082311461059557610246565b80632fff17961461040857806339189c9f146104335780633ccfd60b1461047057806342842e0e146104875780634530a832146104b057610246565b806318160ddd1161020e57806318160ddd14610344578063228025e81461036f57806323b872dd146103985780632db11544146103c15780632eb4a7ab146103dd57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063102e766d14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f8c565b610958565b60405161027f9190613374565b60405180910390f35b34801561029457600080fd5b5061029d6109ea565b6040516102aa91906133aa565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613033565b610a7c565b6040516102e7919061330d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612f1f565b610af8565b005b34801561032557600080fd5b5061032e610c9f565b60405161033b91906134cc565b60405180910390f35b34801561035057600080fd5b50610359610ca5565b60405161036691906134cc565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613033565b610cbc565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612e09565b610d42565b005b6103db60048036038101906103d69190613033565b610d52565b005b3480156103e957600080fd5b506103f2610f7f565b6040516103ff919061338f565b60405180910390f35b34801561041457600080fd5b5061041d610f85565b60405161042a91906134cc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190612d9c565b610f8b565b60405161046791906134cc565b60405180910390f35b34801561047c57600080fd5b50610485610fa3565b005b34801561049357600080fd5b506104ae60048036038101906104a99190612e09565b61107f565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613033565b61109f565b005b3480156104e557600080fd5b506104ee611125565b6040516104fb91906134cc565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612fe6565b61112b565b005b34801561053957600080fd5b50610554600480360381019061054f9190613033565b6111bd565b604051610561919061330d565b60405180910390f35b34801561057657600080fd5b5061057f6111cf565b60405161058c91906133aa565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612d9c565b61125d565b6040516105c991906134cc565b60405180910390f35b3480156105de57600080fd5b506105e7611316565b005b3480156105f557600080fd5b50610610600480360381019061060b9190612f5f565b61139e565b005b34801561061e57600080fd5b50610627611424565b005b34801561063557600080fd5b50610650600480360381019061064b9190612f1f565b6114cc565b005b34801561065e57600080fd5b50610667611556565b604051610674919061330d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613033565b611580565b005b3480156106b257600080fd5b506106bb611609565b6040516106c891906133aa565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190612edf565b61169b565b005b34801561070657600080fd5b50610721600480360381019061071c9190612e5c565b611813565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613033565b611886565b005b34801561075857600080fd5b50610773600480360381019061076e9190612d9c565b61190c565b60405161078091906134cc565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190613033565b611924565b005b3480156107be57600080fd5b506107d960048036038101906107d49190613033565b6119aa565b6040516107e691906133aa565b60405180910390f35b3480156107fb57600080fd5b50610804611a49565b6040516108119190613374565b60405180910390f35b610834600480360381019061082f9190613060565b611a5c565b005b34801561084257600080fd5b5061084b611d44565b60405161085891906134cc565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190612d9c565b611d4a565b60405161089591906134cc565b60405180910390f35b3480156108aa57600080fd5b506108c560048036038101906108c09190613033565b611d5c565b005b3480156108d357600080fd5b506108ee60048036038101906108e99190612dc9565b611de2565b6040516108fb9190613374565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190612d9c565b611e76565b005b34801561093957600080fd5b50610942611f6e565b60405161094f91906134cc565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109f9906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a25906136f0565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a8782611f74565b610abd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0382611fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a6120a1565b73ffffffffffffffffffffffffffffffffffffffff1614610bed57610bb681610bb16120a1565b611de2565b610bec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6000610caf6120a9565b6001546000540303905090565b610cc46120ae565b73ffffffffffffffffffffffffffffffffffffffff16610ce2611556565b73ffffffffffffffffffffffffffffffffffffffff1614610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f9061346c565b60405180910390fd5b80600f8190555050565b610d4d8383836120b6565b505050565b601060009054906101000a900460ff16610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d989061348c565b60405180910390fd5b600c5481610daf91906135d6565b341115610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de8906134ac565b60405180910390fd5b600f5481610dfd610ca5565b610e079190613580565b1115610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061342c565b60405180910390fd5b600e5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e969190613580565b1115610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece9061344c565b60405180910390fd5b600d54811115610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f139061340c565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6b9190613580565b92505081905550610f7c3382612460565b50565b60115481565b600b5481565b60136020528060005260406000206000915090505481565b610fab6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610fc9611556565b73ffffffffffffffffffffffffffffffffffffffff161461101f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110169061346c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561107c573d6000803e3d6000fd5b50565b61109a83838360405180602001604052806000815250611813565b505050565b6110a76120ae565b73ffffffffffffffffffffffffffffffffffffffff166110c5611556565b73ffffffffffffffffffffffffffffffffffffffff161461111b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111129061346c565b60405180910390fd5b80600c8190555050565b600e5481565b6111336120ae565b73ffffffffffffffffffffffffffffffffffffffff16611151611556565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061346c565b60405180910390fd5b8181600a91906111b8929190612b5f565b505050565b60006111c882611fd3565b9050919050565b600a80546111dc906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611208906136f0565b80156112555780601f1061122a57610100808354040283529160200191611255565b820191906000526020600020905b81548152906001019060200180831161123857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61131e6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661133c611556565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061346c565b60405180910390fd5b61139c600061247e565b565b6113a66120ae565b73ffffffffffffffffffffffffffffffffffffffff166113c4611556565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114119061346c565b60405180910390fd5b8060118190555050565b61142c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661144a611556565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114979061346c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6114d46120ae565b73ffffffffffffffffffffffffffffffffffffffff166114f2611556565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f9061346c565b60405180910390fd5b6115528282612460565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115886120ae565b73ffffffffffffffffffffffffffffffffffffffff166115a6611556565b73ffffffffffffffffffffffffffffffffffffffff16146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061346c565b60405180910390fd5b6116063382612460565b50565b606060038054611618906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611644906136f0565b80156116915780601f1061166657610100808354040283529160200191611691565b820191906000526020600020905b81548152906001019060200180831161167457829003601f168201915b5050505050905090565b6116a36120a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611708576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117156120a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c26120a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118079190613374565b60405180910390a35050565b61181e8484846120b6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118805761184984848484612544565b61187f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61188e6120ae565b73ffffffffffffffffffffffffffffffffffffffff166118ac611556565b73ffffffffffffffffffffffffffffffffffffffff1614611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061346c565b60405180910390fd5b80600b8190555050565b60126020528060005260406000206000915090505481565b61192c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661194a611556565b73ffffffffffffffffffffffffffffffffffffffff16146119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979061346c565b60405180910390fd5b80600d8190555050565b60606119b582611f74565b6119eb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119f56126a4565b9050600081511415611a165760405180602001604052806000815250611a41565b80611a2084612736565b604051602001611a319291906132e9565b6040516020818303038152906040525b915050919050565b601060009054906101000a900460ff1681565b600033604051602001611a6f91906132ce565b604051602081830303815290604052805190602001209050601060009054906101000a900460ff16611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061348c565b60405180910390fd5b611b24838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612790565b611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a906133cc565b60405180910390fd5b600b5484611b7191906135d6565b341115611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906134ac565b60405180910390fd5b600f5484611bbf610ca5565b611bc99190613580565b1115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c019061342c565b60405180910390fd5b600e5484601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c589190613580565b1115611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c909061344c565b60405180910390fd5b600d54841115611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd59061340c565b60405180910390fd5b83601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d9190613580565b92505081905550611d3e3385612460565b50505050565b600f5481565b6000611d55826127a7565b9050919050565b611d646120ae565b73ffffffffffffffffffffffffffffffffffffffff16611d82611556565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf9061346c565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e7e6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611e9c611556565b73ffffffffffffffffffffffffffffffffffffffff1614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee99061346c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f59906133ec565b60405180910390fd5b611f6b8161247e565b50565b600d5481565b600081611f7f6120a9565b11158015611f8e575060005482105b8015611fcc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611fe26120a9565b1161206a576000548110156120695760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612067575b600081141561205d576004600083600190039350838152602001908152602001600020549050612032565b809250505061209c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b60006120c182611fd3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612128576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166121496120a1565b73ffffffffffffffffffffffffffffffffffffffff1614806121785750612177856121726120a1565b611de2565b5b806121bd57506121866120a1565b73ffffffffffffffffffffffffffffffffffffffff166121a584610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121f6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561225d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61226a85858560016127fe565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61236786612804565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156123f15760006001840190506000600460008381526020019081526020016000205414156123ef5760005481146123ee578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612459858585600161280e565b5050505050565b61247a828260405180602001604052806000815250612814565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256a6120a1565b8786866040518563ffffffff1660e01b815260040161258c9493929190613328565b602060405180830381600087803b1580156125a657600080fd5b505af19250505080156125d757506040513d601f19601f820116820180604052508101906125d49190612fb9565b60015b612651573d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b50600081511415612649576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546126b3906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546126df906136f0565b801561272c5780601f106127015761010080835404028352916020019161272c565b820191906000526020600020905b81548152906001019060200180831161270f57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561277c57600183039250600a81066030018353600a8104905061275c565b508181036020830392508083525050919050565b60008261279d8584612ac9565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612881576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128bc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c960008583866127fe565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161292e60018514612b3e565b901b60a042901b61293e86612804565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a42575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129f26000878480600101955087612544565b612a28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612983578260005414612a3d57600080fd5b612aad565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a43575b816000819055505050612ac3600085838661280e565b50505050565b60008082905060005b8451811015612b33576000858281518110612af057612aef61381e565b5b60200260200101519050808311612b1257612b0b8382612b48565b9250612b1f565b612b1c8184612b48565b92505b508080612b2b90613753565b915050612ad2565b508091505092915050565b6000819050919050565b600082600052816020526040600020905092915050565b828054612b6b906136f0565b90600052602060002090601f016020900481019282612b8d5760008555612bd4565b82601f10612ba657803560ff1916838001178555612bd4565b82800160010185558215612bd4579182015b82811115612bd3578235825591602001919060010190612bb8565b5b509050612be19190612be5565b5090565b5b80821115612bfe576000816000905550600101612be6565b5090565b6000612c15612c108461350c565b6134e7565b905082815260208101848484011115612c3157612c3061388b565b5b612c3c8482856136ae565b509392505050565b600081359050612c5381613a26565b92915050565b60008083601f840112612c6f57612c6e613881565b5b8235905067ffffffffffffffff811115612c8c57612c8b61387c565b5b602083019150836020820283011115612ca857612ca7613886565b5b9250929050565b600081359050612cbe81613a3d565b92915050565b600081359050612cd381613a54565b92915050565b600081359050612ce881613a6b565b92915050565b600081519050612cfd81613a6b565b92915050565b600082601f830112612d1857612d17613881565b5b8135612d28848260208601612c02565b91505092915050565b60008083601f840112612d4757612d46613881565b5b8235905067ffffffffffffffff811115612d6457612d6361387c565b5b602083019150836001820283011115612d8057612d7f613886565b5b9250929050565b600081359050612d9681613a82565b92915050565b600060208284031215612db257612db1613895565b5b6000612dc084828501612c44565b91505092915050565b60008060408385031215612de057612ddf613895565b5b6000612dee85828601612c44565b9250506020612dff85828601612c44565b9150509250929050565b600080600060608486031215612e2257612e21613895565b5b6000612e3086828701612c44565b9350506020612e4186828701612c44565b9250506040612e5286828701612d87565b9150509250925092565b60008060008060808587031215612e7657612e75613895565b5b6000612e8487828801612c44565b9450506020612e9587828801612c44565b9350506040612ea687828801612d87565b925050606085013567ffffffffffffffff811115612ec757612ec6613890565b5b612ed387828801612d03565b91505092959194509250565b60008060408385031215612ef657612ef5613895565b5b6000612f0485828601612c44565b9250506020612f1585828601612caf565b9150509250929050565b60008060408385031215612f3657612f35613895565b5b6000612f4485828601612c44565b9250506020612f5585828601612d87565b9150509250929050565b600060208284031215612f7557612f74613895565b5b6000612f8384828501612cc4565b91505092915050565b600060208284031215612fa257612fa1613895565b5b6000612fb084828501612cd9565b91505092915050565b600060208284031215612fcf57612fce613895565b5b6000612fdd84828501612cee565b91505092915050565b60008060208385031215612ffd57612ffc613895565b5b600083013567ffffffffffffffff81111561301b5761301a613890565b5b61302785828601612d31565b92509250509250929050565b60006020828403121561304957613048613895565b5b600061305784828501612d87565b91505092915050565b60008060006040848603121561307957613078613895565b5b600061308786828701612d87565b935050602084013567ffffffffffffffff8111156130a8576130a7613890565b5b6130b486828701612c59565b92509250509250925092565b6130c981613630565b82525050565b6130e06130db82613630565b61379c565b82525050565b6130ef81613642565b82525050565b6130fe8161364e565b82525050565b600061310f8261353d565b6131198185613553565b93506131298185602086016136bd565b6131328161389a565b840191505092915050565b600061314882613548565b6131528185613564565b93506131628185602086016136bd565b61316b8161389a565b840191505092915050565b600061318182613548565b61318b8185613575565b935061319b8185602086016136bd565b80840191505092915050565b60006131b4602083613564565b91506131bf826138b8565b602082019050919050565b60006131d7602683613564565b91506131e2826138e1565b604082019050919050565b60006131fa601e83613564565b915061320582613930565b602082019050919050565b600061321d601083613564565b915061322882613959565b602082019050919050565b6000613240601783613564565b915061324b82613982565b602082019050919050565b6000613263602083613564565b915061326e826139ab565b602082019050919050565b6000613286601683613564565b9150613291826139d4565b602082019050919050565b60006132a9601b83613564565b91506132b4826139fd565b602082019050919050565b6132c8816136a4565b82525050565b60006132da82846130cf565b60148201915081905092915050565b60006132f58285613176565b91506133018284613176565b91508190509392505050565b600060208201905061332260008301846130c0565b92915050565b600060808201905061333d60008301876130c0565b61334a60208301866130c0565b61335760408301856132bf565b81810360608301526133698184613104565b905095945050505050565b600060208201905061338960008301846130e6565b92915050565b60006020820190506133a460008301846130f5565b92915050565b600060208201905081810360008301526133c4818461313d565b905092915050565b600060208201905081810360008301526133e5816131a7565b9050919050565b60006020820190508181036000830152613405816131ca565b9050919050565b60006020820190508181036000830152613425816131ed565b9050919050565b6000602082019050818103600083015261344581613210565b9050919050565b6000602082019050818103600083015261346581613233565b9050919050565b6000602082019050818103600083015261348581613256565b9050919050565b600060208201905081810360008301526134a581613279565b9050919050565b600060208201905081810360008301526134c58161329c565b9050919050565b60006020820190506134e160008301846132bf565b92915050565b60006134f1613502565b90506134fd8282613722565b919050565b6000604051905090565b600067ffffffffffffffff8211156135275761352661384d565b5b6135308261389a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061358b826136a4565b9150613596836136a4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135cb576135ca6137c0565b5b828201905092915050565b60006135e1826136a4565b91506135ec836136a4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613625576136246137c0565b5b828202905092915050565b600061363b82613684565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136db5780820151818401526020810190506136c0565b838111156136ea576000848401525b50505050565b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6137ef565b5b50919050565b61372b8261389a565b810181811067ffffffffffffffff8211171561374a5761374961384d565b5b80604052505050565b600061375e826136a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613791576137906137c0565b5b600182019050919050565b60006137a7826137ae565b9050919050565b60006137b9826138ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f43726f6e6965733a20596f7520617265206e6f742077686974656c6973746564600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43726f6e6965733a204c696d697420506572205472616e73616374696f6e0000600082015250565b7f43726f6e6965733a20536f6c646f757400000000000000000000000000000000600082015250565b7f43726f6e6965733a204d6178205065722057616c6c6574000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43726f6e6965733a204d696e74696e6720506175736500000000000000000000600082015250565b7f43726f6e6965733a20496e73756666696369656e742046756e64730000000000600082015250565b613a2f81613630565b8114613a3a57600080fd5b50565b613a4681613642565b8114613a5157600080fd5b50565b613a5d8161364e565b8114613a6857600080fd5b50565b613a7481613658565b8114613a7f57600080fd5b50565b613a8b816136a4565b8114613a9657600080fd5b5056fea2646970667358221220889ff40d9184ca3a054635e39bb3761a26bc5453a66ffa87e4508594ada1d84464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063bfd0b1f0116100b6578063d5abeb011161007a578063d5abeb0114610836578063dc33e68114610861578063e268e4d31461089e578063e985e9c5146108c7578063f2fde38b14610904578063f968adbe1461092d57610246565b8063bfd0b1f01461074c578063c6f6f21614610789578063c87b56dd146107b2578063d1239730146107ef578063d2cab0561461081a57610246565b80638db89f07116100fd5780638db89f071461067d57806395d89b41146106a6578063a22cb465146106d1578063b88d4fde146106fa578063b95f8b5f1461072357610246565b8063715018a6146105d25780637cb64759146105e95780637d55094d146106125780638ba4cc3c146106295780638da5cb5b1461065257610246565b80632fff1796116101c7578063453c23101161018b578063453c2310146104d957806355f804b3146105045780636352211e1461052d5780636c0360eb1461056a57806370a082311461059557610246565b80632fff17961461040857806339189c9f146104335780633ccfd60b1461047057806342842e0e146104875780634530a832146104b057610246565b806318160ddd1161020e57806318160ddd14610344578063228025e81461036f57806323b872dd146103985780632db11544146103c15780632eb4a7ab146103dd57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f0578063102e766d14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f8c565b610958565b60405161027f9190613374565b60405180910390f35b34801561029457600080fd5b5061029d6109ea565b6040516102aa91906133aa565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613033565b610a7c565b6040516102e7919061330d565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612f1f565b610af8565b005b34801561032557600080fd5b5061032e610c9f565b60405161033b91906134cc565b60405180910390f35b34801561035057600080fd5b50610359610ca5565b60405161036691906134cc565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613033565b610cbc565b005b3480156103a457600080fd5b506103bf60048036038101906103ba9190612e09565b610d42565b005b6103db60048036038101906103d69190613033565b610d52565b005b3480156103e957600080fd5b506103f2610f7f565b6040516103ff919061338f565b60405180910390f35b34801561041457600080fd5b5061041d610f85565b60405161042a91906134cc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190612d9c565b610f8b565b60405161046791906134cc565b60405180910390f35b34801561047c57600080fd5b50610485610fa3565b005b34801561049357600080fd5b506104ae60048036038101906104a99190612e09565b61107f565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613033565b61109f565b005b3480156104e557600080fd5b506104ee611125565b6040516104fb91906134cc565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190612fe6565b61112b565b005b34801561053957600080fd5b50610554600480360381019061054f9190613033565b6111bd565b604051610561919061330d565b60405180910390f35b34801561057657600080fd5b5061057f6111cf565b60405161058c91906133aa565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612d9c565b61125d565b6040516105c991906134cc565b60405180910390f35b3480156105de57600080fd5b506105e7611316565b005b3480156105f557600080fd5b50610610600480360381019061060b9190612f5f565b61139e565b005b34801561061e57600080fd5b50610627611424565b005b34801561063557600080fd5b50610650600480360381019061064b9190612f1f565b6114cc565b005b34801561065e57600080fd5b50610667611556565b604051610674919061330d565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f9190613033565b611580565b005b3480156106b257600080fd5b506106bb611609565b6040516106c891906133aa565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190612edf565b61169b565b005b34801561070657600080fd5b50610721600480360381019061071c9190612e5c565b611813565b005b34801561072f57600080fd5b5061074a60048036038101906107459190613033565b611886565b005b34801561075857600080fd5b50610773600480360381019061076e9190612d9c565b61190c565b60405161078091906134cc565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190613033565b611924565b005b3480156107be57600080fd5b506107d960048036038101906107d49190613033565b6119aa565b6040516107e691906133aa565b60405180910390f35b3480156107fb57600080fd5b50610804611a49565b6040516108119190613374565b60405180910390f35b610834600480360381019061082f9190613060565b611a5c565b005b34801561084257600080fd5b5061084b611d44565b60405161085891906134cc565b60405180910390f35b34801561086d57600080fd5b5061088860048036038101906108839190612d9c565b611d4a565b60405161089591906134cc565b60405180910390f35b3480156108aa57600080fd5b506108c560048036038101906108c09190613033565b611d5c565b005b3480156108d357600080fd5b506108ee60048036038101906108e99190612dc9565b611de2565b6040516108fb9190613374565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190612d9c565b611e76565b005b34801561093957600080fd5b50610942611f6e565b60405161094f91906134cc565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109b357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109e35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109f9906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a25906136f0565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b5050505050905090565b6000610a8782611f74565b610abd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b0382611fd3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b6b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8a6120a1565b73ffffffffffffffffffffffffffffffffffffffff1614610bed57610bb681610bb16120a1565b611de2565b610bec576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6000610caf6120a9565b6001546000540303905090565b610cc46120ae565b73ffffffffffffffffffffffffffffffffffffffff16610ce2611556565b73ffffffffffffffffffffffffffffffffffffffff1614610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f9061346c565b60405180910390fd5b80600f8190555050565b610d4d8383836120b6565b505050565b601060009054906101000a900460ff16610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d989061348c565b60405180910390fd5b600c5481610daf91906135d6565b341115610df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de8906134ac565b60405180910390fd5b600f5481610dfd610ca5565b610e079190613580565b1115610e48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3f9061342c565b60405180910390fd5b600e5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e969190613580565b1115610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece9061344c565b60405180910390fd5b600d54811115610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f139061340c565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6b9190613580565b92505081905550610f7c3382612460565b50565b60115481565b600b5481565b60136020528060005260406000206000915090505481565b610fab6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610fc9611556565b73ffffffffffffffffffffffffffffffffffffffff161461101f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110169061346c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561107c573d6000803e3d6000fd5b50565b61109a83838360405180602001604052806000815250611813565b505050565b6110a76120ae565b73ffffffffffffffffffffffffffffffffffffffff166110c5611556565b73ffffffffffffffffffffffffffffffffffffffff161461111b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111129061346c565b60405180910390fd5b80600c8190555050565b600e5481565b6111336120ae565b73ffffffffffffffffffffffffffffffffffffffff16611151611556565b73ffffffffffffffffffffffffffffffffffffffff16146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e9061346c565b60405180910390fd5b8181600a91906111b8929190612b5f565b505050565b60006111c882611fd3565b9050919050565b600a80546111dc906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611208906136f0565b80156112555780601f1061122a57610100808354040283529160200191611255565b820191906000526020600020905b81548152906001019060200180831161123857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c5576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61131e6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661133c611556565b73ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113899061346c565b60405180910390fd5b61139c600061247e565b565b6113a66120ae565b73ffffffffffffffffffffffffffffffffffffffff166113c4611556565b73ffffffffffffffffffffffffffffffffffffffff161461141a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114119061346c565b60405180910390fd5b8060118190555050565b61142c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661144a611556565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114979061346c565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6114d46120ae565b73ffffffffffffffffffffffffffffffffffffffff166114f2611556565b73ffffffffffffffffffffffffffffffffffffffff1614611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f9061346c565b60405180910390fd5b6115528282612460565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115886120ae565b73ffffffffffffffffffffffffffffffffffffffff166115a6611556565b73ffffffffffffffffffffffffffffffffffffffff16146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061346c565b60405180910390fd5b6116063382612460565b50565b606060038054611618906136f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611644906136f0565b80156116915780601f1061166657610100808354040283529160200191611691565b820191906000526020600020905b81548152906001019060200180831161167457829003601f168201915b5050505050905090565b6116a36120a1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611708576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117156120a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117c26120a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118079190613374565b60405180910390a35050565b61181e8484846120b6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118805761184984848484612544565b61187f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61188e6120ae565b73ffffffffffffffffffffffffffffffffffffffff166118ac611556565b73ffffffffffffffffffffffffffffffffffffffff1614611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061346c565b60405180910390fd5b80600b8190555050565b60126020528060005260406000206000915090505481565b61192c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661194a611556565b73ffffffffffffffffffffffffffffffffffffffff16146119a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119979061346c565b60405180910390fd5b80600d8190555050565b60606119b582611f74565b6119eb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119f56126a4565b9050600081511415611a165760405180602001604052806000815250611a41565b80611a2084612736565b604051602001611a319291906132e9565b6040516020818303038152906040525b915050919050565b601060009054906101000a900460ff1681565b600033604051602001611a6f91906132ce565b604051602081830303815290604052805190602001209050601060009054906101000a900460ff16611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd9061348c565b60405180910390fd5b611b24838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060115483612790565b611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a906133cc565b60405180910390fd5b600b5484611b7191906135d6565b341115611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906134ac565b60405180910390fd5b600f5484611bbf610ca5565b611bc99190613580565b1115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c019061342c565b60405180910390fd5b600e5484601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c589190613580565b1115611c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c909061344c565b60405180910390fd5b600d54841115611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd59061340c565b60405180910390fd5b83601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d9190613580565b92505081905550611d3e3385612460565b50505050565b600f5481565b6000611d55826127a7565b9050919050565b611d646120ae565b73ffffffffffffffffffffffffffffffffffffffff16611d82611556565b73ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf9061346c565b60405180910390fd5b80600e8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e7e6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611e9c611556565b73ffffffffffffffffffffffffffffffffffffffff1614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee99061346c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f59906133ec565b60405180910390fd5b611f6b8161247e565b50565b600d5481565b600081611f7f6120a9565b11158015611f8e575060005482105b8015611fcc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611fe26120a9565b1161206a576000548110156120695760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612067575b600081141561205d576004600083600190039350838152602001908152602001600020549050612032565b809250505061209c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600033905090565b60006120c182611fd3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612128576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166121496120a1565b73ffffffffffffffffffffffffffffffffffffffff1614806121785750612177856121726120a1565b611de2565b5b806121bd57506121866120a1565b73ffffffffffffffffffffffffffffffffffffffff166121a584610a7c565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121f6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561225d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61226a85858560016127fe565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61236786612804565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156123f15760006001840190506000600460008381526020019081526020016000205414156123ef5760005481146123ee578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612459858585600161280e565b5050505050565b61247a828260405180602001604052806000815250612814565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256a6120a1565b8786866040518563ffffffff1660e01b815260040161258c9493929190613328565b602060405180830381600087803b1580156125a657600080fd5b505af19250505080156125d757506040513d601f19601f820116820180604052508101906125d49190612fb9565b60015b612651573d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b50600081511415612649576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a80546126b3906136f0565b80601f01602080910402602001604051908101604052809291908181526020018280546126df906136f0565b801561272c5780601f106127015761010080835404028352916020019161272c565b820191906000526020600020905b81548152906001019060200180831161270f57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561277c57600183039250600a81066030018353600a8104905061275c565b508181036020830392508083525050919050565b60008261279d8584612ac9565b1490509392505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612881576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128bc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128c960008583866127fe565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161292e60018514612b3e565b901b60a042901b61293e86612804565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a42575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129f26000878480600101955087612544565b612a28576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612983578260005414612a3d57600080fd5b612aad565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a43575b816000819055505050612ac3600085838661280e565b50505050565b60008082905060005b8451811015612b33576000858281518110612af057612aef61381e565b5b60200260200101519050808311612b1257612b0b8382612b48565b9250612b1f565b612b1c8184612b48565b92505b508080612b2b90613753565b915050612ad2565b508091505092915050565b6000819050919050565b600082600052816020526040600020905092915050565b828054612b6b906136f0565b90600052602060002090601f016020900481019282612b8d5760008555612bd4565b82601f10612ba657803560ff1916838001178555612bd4565b82800160010185558215612bd4579182015b82811115612bd3578235825591602001919060010190612bb8565b5b509050612be19190612be5565b5090565b5b80821115612bfe576000816000905550600101612be6565b5090565b6000612c15612c108461350c565b6134e7565b905082815260208101848484011115612c3157612c3061388b565b5b612c3c8482856136ae565b509392505050565b600081359050612c5381613a26565b92915050565b60008083601f840112612c6f57612c6e613881565b5b8235905067ffffffffffffffff811115612c8c57612c8b61387c565b5b602083019150836020820283011115612ca857612ca7613886565b5b9250929050565b600081359050612cbe81613a3d565b92915050565b600081359050612cd381613a54565b92915050565b600081359050612ce881613a6b565b92915050565b600081519050612cfd81613a6b565b92915050565b600082601f830112612d1857612d17613881565b5b8135612d28848260208601612c02565b91505092915050565b60008083601f840112612d4757612d46613881565b5b8235905067ffffffffffffffff811115612d6457612d6361387c565b5b602083019150836001820283011115612d8057612d7f613886565b5b9250929050565b600081359050612d9681613a82565b92915050565b600060208284031215612db257612db1613895565b5b6000612dc084828501612c44565b91505092915050565b60008060408385031215612de057612ddf613895565b5b6000612dee85828601612c44565b9250506020612dff85828601612c44565b9150509250929050565b600080600060608486031215612e2257612e21613895565b5b6000612e3086828701612c44565b9350506020612e4186828701612c44565b9250506040612e5286828701612d87565b9150509250925092565b60008060008060808587031215612e7657612e75613895565b5b6000612e8487828801612c44565b9450506020612e9587828801612c44565b9350506040612ea687828801612d87565b925050606085013567ffffffffffffffff811115612ec757612ec6613890565b5b612ed387828801612d03565b91505092959194509250565b60008060408385031215612ef657612ef5613895565b5b6000612f0485828601612c44565b9250506020612f1585828601612caf565b9150509250929050565b60008060408385031215612f3657612f35613895565b5b6000612f4485828601612c44565b9250506020612f5585828601612d87565b9150509250929050565b600060208284031215612f7557612f74613895565b5b6000612f8384828501612cc4565b91505092915050565b600060208284031215612fa257612fa1613895565b5b6000612fb084828501612cd9565b91505092915050565b600060208284031215612fcf57612fce613895565b5b6000612fdd84828501612cee565b91505092915050565b60008060208385031215612ffd57612ffc613895565b5b600083013567ffffffffffffffff81111561301b5761301a613890565b5b61302785828601612d31565b92509250509250929050565b60006020828403121561304957613048613895565b5b600061305784828501612d87565b91505092915050565b60008060006040848603121561307957613078613895565b5b600061308786828701612d87565b935050602084013567ffffffffffffffff8111156130a8576130a7613890565b5b6130b486828701612c59565b92509250509250925092565b6130c981613630565b82525050565b6130e06130db82613630565b61379c565b82525050565b6130ef81613642565b82525050565b6130fe8161364e565b82525050565b600061310f8261353d565b6131198185613553565b93506131298185602086016136bd565b6131328161389a565b840191505092915050565b600061314882613548565b6131528185613564565b93506131628185602086016136bd565b61316b8161389a565b840191505092915050565b600061318182613548565b61318b8185613575565b935061319b8185602086016136bd565b80840191505092915050565b60006131b4602083613564565b91506131bf826138b8565b602082019050919050565b60006131d7602683613564565b91506131e2826138e1565b604082019050919050565b60006131fa601e83613564565b915061320582613930565b602082019050919050565b600061321d601083613564565b915061322882613959565b602082019050919050565b6000613240601783613564565b915061324b82613982565b602082019050919050565b6000613263602083613564565b915061326e826139ab565b602082019050919050565b6000613286601683613564565b9150613291826139d4565b602082019050919050565b60006132a9601b83613564565b91506132b4826139fd565b602082019050919050565b6132c8816136a4565b82525050565b60006132da82846130cf565b60148201915081905092915050565b60006132f58285613176565b91506133018284613176565b91508190509392505050565b600060208201905061332260008301846130c0565b92915050565b600060808201905061333d60008301876130c0565b61334a60208301866130c0565b61335760408301856132bf565b81810360608301526133698184613104565b905095945050505050565b600060208201905061338960008301846130e6565b92915050565b60006020820190506133a460008301846130f5565b92915050565b600060208201905081810360008301526133c4818461313d565b905092915050565b600060208201905081810360008301526133e5816131a7565b9050919050565b60006020820190508181036000830152613405816131ca565b9050919050565b60006020820190508181036000830152613425816131ed565b9050919050565b6000602082019050818103600083015261344581613210565b9050919050565b6000602082019050818103600083015261346581613233565b9050919050565b6000602082019050818103600083015261348581613256565b9050919050565b600060208201905081810360008301526134a581613279565b9050919050565b600060208201905081810360008301526134c58161329c565b9050919050565b60006020820190506134e160008301846132bf565b92915050565b60006134f1613502565b90506134fd8282613722565b919050565b6000604051905090565b600067ffffffffffffffff8211156135275761352661384d565b5b6135308261389a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061358b826136a4565b9150613596836136a4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135cb576135ca6137c0565b5b828201905092915050565b60006135e1826136a4565b91506135ec836136a4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613625576136246137c0565b5b828202905092915050565b600061363b82613684565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136db5780820151818401526020810190506136c0565b838111156136ea576000848401525b50505050565b6000600282049050600182168061370857607f821691505b6020821081141561371c5761371b6137ef565b5b50919050565b61372b8261389a565b810181811067ffffffffffffffff8211171561374a5761374961384d565b5b80604052505050565b600061375e826136a4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613791576137906137c0565b5b600182019050919050565b60006137a7826137ae565b9050919050565b60006137b9826138ab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f43726f6e6965733a20596f7520617265206e6f742077686974656c6973746564600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43726f6e6965733a204c696d697420506572205472616e73616374696f6e0000600082015250565b7f43726f6e6965733a20536f6c646f757400000000000000000000000000000000600082015250565b7f43726f6e6965733a204d6178205065722057616c6c6574000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43726f6e6965733a204d696e74696e6720506175736500000000000000000000600082015250565b7f43726f6e6965733a20496e73756666696369656e742046756e64730000000000600082015250565b613a2f81613630565b8114613a3a57600080fd5b50565b613a4681613642565b8114613a5157600080fd5b50565b613a5d8161364e565b8114613a6857600080fd5b50565b613a7481613658565b8114613a7f57600080fd5b50565b613a8b816136a4565b8114613a9657600080fd5b5056fea2646970667358221220889ff40d9184ca3a054635e39bb3761a26bc5453a66ffa87e4508594ada1d84464736f6c63430008070033

Deployed Bytecode Sourcemap

291:3317:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4880:607:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9768:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11769:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11245:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;448:43:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3963:309:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1963:102:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12629:164:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3071:534:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;651:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;384:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;739:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2189:116;;;;;;;;;;;;;:::i;:::-;;12859:179:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1516:98:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;543:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1406:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9564:142:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;354:21:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5546:221:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;974:90:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1309:89;;;;;;;;;;;;;:::i;:::-;;1072:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1189:112:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9930:102:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12036:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13104:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1622:104:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;683:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1735:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10098:313:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;613:31:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2313:750;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;578:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;853:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1841:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12405:162:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;510:24:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4880:607:5;4965:4;5275:10;5260:25;;:11;:25;;;;:101;;;;5351:10;5336:25;;:11;:25;;;;5260:101;:177;;;;5427:10;5412:25;;:11;:25;;;;5260:177;5241:196;;4880:607;;;:::o;9768:98::-;9822:13;9854:5;9847:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9768:98;:::o;11769:200::-;11837:7;11861:16;11869:7;11861;:16::i;:::-;11856:64;;11886:34;;;;;;;;;;;;;;11856:64;11938:15;:24;11954:7;11938:24;;;;;;;;;;;;;;;;;;;;;11931:31;;11769:200;;;:::o;11245:463::-;11317:13;11349:27;11368:7;11349:18;:27::i;:::-;11317:61;;11398:5;11392:11;;:2;:11;;;11388:48;;;11412:24;;;;;;;;;;;;;;11388:48;11474:5;11451:28;;:19;:17;:19::i;:::-;:28;;;11447:172;;11498:44;11515:5;11522:19;:17;:19::i;:::-;11498:16;:44::i;:::-;11493:126;;11569:35;;;;;;;;;;;;;;11493:126;11447:172;11656:2;11629:15;:24;11645:7;11629:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11693:7;11689:2;11673:28;;11682:5;11673:28;;;;;;;;;;;;11307:401;11245:463;;:::o;448:43:4:-;;;;:::o;3963:309:5:-;4016:7;4240:15;:13;:15::i;:::-;4225:12;;4209:13;;:28;:46;4202:53;;3963:309;:::o;1963:102:4:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2047:10:4::1;2035:9;:22;;;;1963:102:::0;:::o;12629:164:5:-;12758:28;12768:4;12774:2;12778:7;12758:9;:28::i;:::-;12629:164;;;:::o;3071:534:4:-;3148:11;;;;;;;;;;;3140:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3227:11;;3218:6;:20;;;;:::i;:::-;3205:9;:33;;3197:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3314:9;;3304:6;3288:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;3280:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3400:12;;3390:6;3362:13;:25;3376:10;3362:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:50;;3354:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3468:8;;3458:6;:18;;3450:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3551:6;3522:13;:25;3536:10;3522:25;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;3568:29;3578:10;3590:6;3568:9;:29::i;:::-;3071:534;:::o;651:25::-;;;;:::o;384:46::-;;;;:::o;739:52::-;;;;;;;;;;;;;;;;;:::o;2189:116::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2245:10:4::1;2237:28;;:60;2282:4;2266:30;;;2237:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2189:116::o:0;12859:179:5:-;12992:39;13009:4;13015:2;13019:7;12992:39;;;;;;;;;;;;:16;:39::i;:::-;12859:179;;;:::o;1516:98:4:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1600:6:4::1;1586:11;:20;;;;1516:98:::0;:::o;543:28::-;;;;:::o;1406:102::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1492:8:4::1;;1482:7;:18;;;;;;;:::i;:::-;;1406:102:::0;;:::o;9564:142:5:-;9628:7;9670:27;9689:7;9670:18;:27::i;:::-;9647:52;;9564:142;;;:::o;354:21:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5546:221:5:-;5610:7;5650:1;5633:19;;:5;:19;;;5629:60;;;5661:28;;;;;;;;;;;;;;5629:60;1017:13;5706:18;:25;5725:5;5706:25;;;;;;;;;;;;;;;;:54;5699:61;;5546:221;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;974:90:4:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1052:4:4::1;1039:10;:17;;;;974:90:::0;:::o;1309:89::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1379:11:4::1;;;;;;;;;;;1378:12;1364:11;;:26;;;;;;;;;;;;;;;;;;1309:89::o:0;1072:109::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1152:21:4::1;1162:2;1166:6;1152:9;:21::i;:::-;1072:109:::0;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;1189:112:4:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1264:29:4::1;1274:10;1286:6;1264:9;:29::i;:::-;1189:112:::0;:::o;9930:102:5:-;9986:13;10018:7;10011:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9930:102;:::o;12036:303::-;12146:19;:17;:19::i;:::-;12134:31;;:8;:31;;;12130:61;;;12174:17;;;;;;;;;;;;;;12130:61;12254:8;12202:18;:39;12221:19;:17;:19::i;:::-;12202:39;;;;;;;;;;;;;;;:49;12242:8;12202:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12313:8;12277:55;;12292:19;:17;:19::i;:::-;12277:55;;;12323:8;12277:55;;;;;;:::i;:::-;;;;;;;;12036:303;;:::o;13104:385::-;13265:28;13275:4;13281:2;13285:7;13265:9;:28::i;:::-;13325:1;13307:2;:14;;;:19;13303:180;;13345:56;13376:4;13382:2;13386:7;13395:5;13345:30;:56::i;:::-;13340:143;;13428:40;;;;;;;;;;;;;;13340:143;13303:180;13104:385;;;;:::o;1622:104:4:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1712:6:4::1;1695:14;:23;;;;1622:104:::0;:::o;683:49::-;;;;;;;;;;;;;;;;;:::o;1735:98::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1816:9:4::1;1805:8;:20;;;;1735:98:::0;:::o;10098:313:5:-;10171:13;10201:16;10209:7;10201;:16::i;:::-;10196:59;;10226:29;;;;;;;;;;;;;;10196:59;10266:21;10290:10;:8;:10::i;:::-;10266:34;;10342:1;10323:7;10317:21;:26;;:87;;;;;;;;;;;;;;;;;10370:7;10379:18;10389:7;10379:9;:18::i;:::-;10353:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10317:87;10310:94;;;10098:313;;;:::o;613:31:4:-;;;;;;;;;;;;;:::o;2313:750::-;2418:12;2460:10;2443:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2433:39;;;;;;2418:54;;2491:11;;;;;;;;;;;2483:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2548:50;2567:12;;2548:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2581:10;;2593:4;2548:18;:50::i;:::-;2540:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2676:14;;2667:6;:23;;;;:::i;:::-;2654:9;:36;;2646:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2766:9;;2756:6;2740:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;2732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2855:12;;2845:6;2814:16;:28;2831:10;2814:28;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:53;;2806:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:8;;2913:6;:18;;2905:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3009:6;2977:16;:28;2994:10;2977:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;3026:29;3036:10;3048:6;3026:9;:29::i;:::-;2407:656;2313:750;;;:::o;578:28::-;;;;:::o;853:113::-;911:7;938:20;952:5;938:13;:20::i;:::-;931:27;;853:113;;;:::o;1841:114::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1934:13:4::1;1919:12;:28;;;;1841:114:::0;:::o;12405:162:5:-;12502:4;12525:18;:25;12544:5;12525:25;;;;;;;;;;;;;;;:35;12551:8;12525:35;;;;;;;;;;;;;;;;;;;;;;;;;12518:42;;12405:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;510:24:4:-;;;;:::o;13735:268:5:-;13792:4;13846:7;13827:15;:13;:15::i;:::-;:26;;:65;;;;;13879:13;;13869:7;:23;13827:65;:150;;;;;13976:1;1769:8;13929:17;:26;13947:7;13929:26;;;;;;;;;;;;:43;:48;13827:150;13808:169;;13735:268;;;:::o;7141:1105::-;7208:7;7227:12;7242:7;7227:22;;7307:4;7288:15;:13;:15::i;:::-;:23;7284:898;;7340:13;;7333:4;:20;7329:853;;;7377:14;7394:17;:23;7412:4;7394:23;;;;;;;;;;;;7377:40;;7508:1;1769:8;7481:6;:23;:28;7477:687;;;7992:111;8009:1;7999:6;:11;7992:111;;;8051:17;:25;8069:6;;;;;;;8051:25;;;;;;;;;;;;8042:34;;7992:111;;;8135:6;8128:13;;;;;;7477:687;7355:827;7329:853;7284:898;8208:31;;;;;;;;;;;;;;7141:1105;;;;:::o;27360:103::-;27420:7;27446:10;27439:17;;27360:103;:::o;3502:90::-;3558:7;3502:90;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;18835:2460:5:-;18945:27;18975;18994:7;18975:18;:27::i;:::-;18945:57;;19058:4;19017:45;;19033:19;19017:45;;;19013:86;;19071:28;;;;;;;;;;;;;;19013:86;19110:22;19159:4;19136:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;19179:43;19196:4;19202:19;:17;:19::i;:::-;19179:16;:43::i;:::-;19136:86;:145;;;;19262:19;:17;:19::i;:::-;19238:43;;:20;19250:7;19238:11;:20::i;:::-;:43;;;19136:145;19110:172;;19298:17;19293:66;;19324:35;;;;;;;;;;;;;;19293:66;19387:1;19373:16;;:2;:16;;;19369:52;;;19398:23;;;;;;;;;;;;;;19369:52;19432:43;19454:4;19460:2;19464:7;19473:1;19432:21;:43::i;:::-;19545:15;:24;19561:7;19545:24;;;;;;;;;;;;19538:31;;;;;;;;;;;19930:18;:24;19949:4;19930:24;;;;;;;;;;;;;;;;19928:26;;;;;;;;;;;;19998:18;:22;20017:2;19998:22;;;;;;;;;;;;;;;;19996:24;;;;;;;;;;;2045:8;1656:3;20370:15;:41;;20329:21;20347:2;20329:17;:21::i;:::-;:83;:126;20284:17;:26;20302:7;20284:26;;;;;;;;;;;:171;;;;20622:1;2045:8;20572:19;:46;:51;20568:616;;;20643:19;20675:1;20665:7;:11;20643:33;;20830:1;20796:17;:30;20814:11;20796:30;;;;;;;;;;;;:35;20792:378;;;20932:13;;20917:11;:28;20913:239;;21110:19;21077:17;:30;21095:11;21077:30;;;;;;;;;;;:52;;;;20913:239;20792:378;20625:559;20568:616;21228:7;21224:2;21209:27;;21218:4;21209:27;;;;;;;;;;;;21246:42;21267:4;21273:2;21277:7;21286:1;21246:20;:42::i;:::-;18935:2360;;18835:2460;;;:::o;14082:102::-;14150:27;14160:2;14164:8;14150:27;;;;;;;;;;;;:9;:27::i;:::-;14082:102;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;24900:697:5:-;25058:4;25103:2;25078:45;;;25124:19;:17;:19::i;:::-;25145:4;25151:7;25160:5;25078:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25074:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25373:1;25356:6;:13;:18;25352:229;;;25401:40;;;;;;;;;;;;;;25352:229;25541:6;25535:13;25526:6;25522:2;25518:15;25511:38;25074:517;25244:54;;;25234:64;;;:6;:64;;;;25227:71;;;24900:697;;;;;;:::o;2073:108:4:-;2133:13;2166:7;2159:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2073:108;:::o;27564:1920:5:-;27621:17;28036:3;28029:4;28023:11;28019:21;28012:28;;28125:3;28119:4;28112:17;28228:3;28677:5;28805:1;28800:3;28796:11;28789:18;;28940:2;28934:4;28930:13;28926:2;28922:22;28917:3;28909:36;28980:2;28974:4;28970:13;28962:21;;28570:668;28998:4;28570:668;;;29169:1;29164:3;29160:11;29153:18;;29219:2;29213:4;29209:13;29205:2;29201:22;29196:3;29188:36;29092:2;29086:4;29082:13;29074:21;;28570:668;;;28574:423;29287:3;29282;29278:13;29400:2;29395:3;29391:12;29384:19;;29461:6;29456:3;29449:19;27659:1819;;27564:1920;;;:::o;1154:184:3:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;1291:40;;1154:184;;;;;:::o;5844:174:5:-;5905:7;1017:13;1151:2;5932:18;:25;5951:5;5932:25;;;;;;;;;;;;;;;;:49;;5931:80;5924:87;;5844:174;;;:::o;26228:154::-;;;;;:::o;10824:144::-;10888:14;10947:5;10937:15;;10824:144;;;:::o;27023:153::-;;;;;:::o;14544:2184::-;14662:20;14685:13;;14662:36;;14726:1;14712:16;;:2;:16;;;14708:48;;;14737:19;;;;;;;;;;;;;;14708:48;14782:1;14770:8;:13;14766:44;;;14792:18;;;;;;;;;;;;;;14766:44;14821:61;14851:1;14855:2;14859:12;14873:8;14821:21;:61::i;:::-;15414:1;1151:2;15385:1;:25;;15384:31;15372:8;:44;15346:18;:22;15365:2;15346:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1913:3;15805:29;15832:1;15820:8;:13;15805:14;:29::i;:::-;:56;;1656:3;15743:15;:41;;15702:21;15720:2;15702:17;:21::i;:::-;:83;:160;15652:17;:31;15670:12;15652:31;;;;;;;;;;;:210;;;;15877:20;15900:12;15877:35;;15926:11;15955:8;15940:12;:23;15926:37;;16000:1;15982:2;:14;;;:19;15978:622;;16021:308;16076:12;16072:2;16051:38;;16068:1;16051:38;;;;;;;;;;;;16116:69;16155:1;16159:2;16163:14;;;;;;16179:5;16116:30;:69::i;:::-;16111:172;;16220:40;;;;;;;;;;;;;;16111:172;16324:3;16309:12;:18;16021:308;;16408:12;16391:13;;:29;16387:43;;16422:8;;;16387:43;15978:622;;;16469:117;16524:14;;;;;;16520:2;16499:40;;16516:1;16499:40;;;;;;;;;;;;16581:3;16566:12;:18;16469:117;;15978:622;16629:12;16613:13;:28;;;;15129:1523;;16661:60;16690:1;16694:2;16698:12;16712:8;16661:20;:60::i;:::-;14652:2076;14544:2184;;;:::o;1689:662:3:-;1772:7;1791:20;1814:4;1791:27;;1833:9;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;:::i;:::-;;;;;;;;1885:31;;1950:12;1934;:28;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;1871:445;1866:3;;;;;:::i;:::-;;;;1828:488;;;;2332:12;2325:19;;;1689:662;;;;:::o;11050:138:5:-;11108:14;11167:5;11157:15;;11050:138;;;:::o;2357:218:3:-;2425:13;2486:1;2480:4;2473:15;2514:1;2508:4;2501:15;2554:4;2548;2538:21;2529:30;;2357:218;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:7:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2104:553::-;2162:8;2172:6;2222:3;2215:4;2207:6;2203:17;2199:27;2189:122;;2230:79;;:::i;:::-;2189:122;2343:6;2330:20;2320:30;;2373:18;2365:6;2362:30;2359:117;;;2395:79;;:::i;:::-;2359:117;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:128;;;2570:79;;:::i;:::-;2523:128;2104:553;;;;;:::o;2663:139::-;2709:5;2747:6;2734:20;2725:29;;2763:33;2790:5;2763:33;:::i;:::-;2663:139;;;;:::o;2808:329::-;2867:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:119;;;2922:79;;:::i;:::-;2884:119;3042:1;3067:53;3112:7;3103:6;3092:9;3088:22;3067:53;:::i;:::-;3057:63;;3013:117;2808:329;;;;:::o;3143:474::-;3211:6;3219;3268:2;3256:9;3247:7;3243:23;3239:32;3236:119;;;3274:79;;:::i;:::-;3236:119;3394:1;3419:53;3464:7;3455:6;3444:9;3440:22;3419:53;:::i;:::-;3409:63;;3365:117;3521:2;3547:53;3592:7;3583:6;3572:9;3568:22;3547:53;:::i;:::-;3537:63;;3492:118;3143:474;;;;;:::o;3623:619::-;3700:6;3708;3716;3765:2;3753:9;3744:7;3740:23;3736:32;3733:119;;;3771:79;;:::i;:::-;3733:119;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;4018:2;4044:53;4089:7;4080:6;4069:9;4065:22;4044:53;:::i;:::-;4034:63;;3989:118;4146:2;4172:53;4217:7;4208:6;4197:9;4193:22;4172:53;:::i;:::-;4162:63;;4117:118;3623:619;;;;;:::o;4248:943::-;4343:6;4351;4359;4367;4416:3;4404:9;4395:7;4391:23;4387:33;4384:120;;;4423:79;;:::i;:::-;4384:120;4543:1;4568:53;4613:7;4604:6;4593:9;4589:22;4568:53;:::i;:::-;4558:63;;4514:117;4670:2;4696:53;4741:7;4732:6;4721:9;4717:22;4696:53;:::i;:::-;4686:63;;4641:118;4798:2;4824:53;4869:7;4860:6;4849:9;4845:22;4824:53;:::i;:::-;4814:63;;4769:118;4954:2;4943:9;4939:18;4926:32;4985:18;4977:6;4974:30;4971:117;;;5007:79;;:::i;:::-;4971:117;5112:62;5166:7;5157:6;5146:9;5142:22;5112:62;:::i;:::-;5102:72;;4897:287;4248:943;;;;;;;:::o;5197:468::-;5262:6;5270;5319:2;5307:9;5298:7;5294:23;5290:32;5287:119;;;5325:79;;:::i;:::-;5287:119;5445:1;5470:53;5515:7;5506:6;5495:9;5491:22;5470:53;:::i;:::-;5460:63;;5416:117;5572:2;5598:50;5640:7;5631:6;5620:9;5616:22;5598:50;:::i;:::-;5588:60;;5543:115;5197:468;;;;;:::o;5671:474::-;5739:6;5747;5796:2;5784:9;5775:7;5771:23;5767:32;5764:119;;;5802:79;;:::i;:::-;5764:119;5922:1;5947:53;5992:7;5983:6;5972:9;5968:22;5947:53;:::i;:::-;5937:63;;5893:117;6049:2;6075:53;6120:7;6111:6;6100:9;6096:22;6075:53;:::i;:::-;6065:63;;6020:118;5671:474;;;;;:::o;6151:329::-;6210:6;6259:2;6247:9;6238:7;6234:23;6230:32;6227:119;;;6265:79;;:::i;:::-;6227:119;6385:1;6410:53;6455:7;6446:6;6435:9;6431:22;6410:53;:::i;:::-;6400:63;;6356:117;6151:329;;;;:::o;6486:327::-;6544:6;6593:2;6581:9;6572:7;6568:23;6564:32;6561:119;;;6599:79;;:::i;:::-;6561:119;6719:1;6744:52;6788:7;6779:6;6768:9;6764:22;6744:52;:::i;:::-;6734:62;;6690:116;6486:327;;;;:::o;6819:349::-;6888:6;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7063:1;7088:63;7143:7;7134:6;7123:9;7119:22;7088:63;:::i;:::-;7078:73;;7034:127;6819:349;;;;:::o;7174:529::-;7245:6;7253;7302:2;7290:9;7281:7;7277:23;7273:32;7270:119;;;7308:79;;:::i;:::-;7270:119;7456:1;7445:9;7441:17;7428:31;7486:18;7478:6;7475:30;7472:117;;;7508:79;;:::i;:::-;7472:117;7621:65;7678:7;7669:6;7658:9;7654:22;7621:65;:::i;:::-;7603:83;;;;7399:297;7174:529;;;;;:::o;7709:329::-;7768:6;7817:2;7805:9;7796:7;7792:23;7788:32;7785:119;;;7823:79;;:::i;:::-;7785:119;7943:1;7968:53;8013:7;8004:6;7993:9;7989:22;7968:53;:::i;:::-;7958:63;;7914:117;7709:329;;;;:::o;8044:704::-;8139:6;8147;8155;8204:2;8192:9;8183:7;8179:23;8175:32;8172:119;;;8210:79;;:::i;:::-;8172:119;8330:1;8355:53;8400:7;8391:6;8380:9;8376:22;8355:53;:::i;:::-;8345:63;;8301:117;8485:2;8474:9;8470:18;8457:32;8516:18;8508:6;8505:30;8502:117;;;8538:79;;:::i;:::-;8502:117;8651:80;8723:7;8714:6;8703:9;8699:22;8651:80;:::i;:::-;8633:98;;;;8428:313;8044:704;;;;;:::o;8754:118::-;8841:24;8859:5;8841:24;:::i;:::-;8836:3;8829:37;8754:118;;:::o;8878:157::-;8983:45;9003:24;9021:5;9003:24;:::i;:::-;8983:45;:::i;:::-;8978:3;8971:58;8878:157;;:::o;9041:109::-;9122:21;9137:5;9122:21;:::i;:::-;9117:3;9110:34;9041:109;;:::o;9156:118::-;9243:24;9261:5;9243:24;:::i;:::-;9238:3;9231:37;9156:118;;:::o;9280:360::-;9366:3;9394:38;9426:5;9394:38;:::i;:::-;9448:70;9511:6;9506:3;9448:70;:::i;:::-;9441:77;;9527:52;9572:6;9567:3;9560:4;9553:5;9549:16;9527:52;:::i;:::-;9604:29;9626:6;9604:29;:::i;:::-;9599:3;9595:39;9588:46;;9370:270;9280:360;;;;:::o;9646:364::-;9734:3;9762:39;9795:5;9762:39;:::i;:::-;9817:71;9881:6;9876:3;9817:71;:::i;:::-;9810:78;;9897:52;9942:6;9937:3;9930:4;9923:5;9919:16;9897:52;:::i;:::-;9974:29;9996:6;9974:29;:::i;:::-;9969:3;9965:39;9958:46;;9738:272;9646:364;;;;:::o;10016:377::-;10122:3;10150:39;10183:5;10150:39;:::i;:::-;10205:89;10287:6;10282:3;10205:89;:::i;:::-;10198:96;;10303:52;10348:6;10343:3;10336:4;10329:5;10325:16;10303:52;:::i;:::-;10380:6;10375:3;10371:16;10364:23;;10126:267;10016:377;;;;:::o;10399:366::-;10541:3;10562:67;10626:2;10621:3;10562:67;:::i;:::-;10555:74;;10638:93;10727:3;10638:93;:::i;:::-;10756:2;10751:3;10747:12;10740:19;;10399:366;;;:::o;10771:::-;10913:3;10934:67;10998:2;10993:3;10934:67;:::i;:::-;10927:74;;11010:93;11099:3;11010:93;:::i;:::-;11128:2;11123:3;11119:12;11112:19;;10771:366;;;:::o;11143:::-;11285:3;11306:67;11370:2;11365:3;11306:67;:::i;:::-;11299:74;;11382:93;11471:3;11382:93;:::i;:::-;11500:2;11495:3;11491:12;11484:19;;11143:366;;;:::o;11515:::-;11657:3;11678:67;11742:2;11737:3;11678:67;:::i;:::-;11671:74;;11754:93;11843:3;11754:93;:::i;:::-;11872:2;11867:3;11863:12;11856:19;;11515:366;;;:::o;11887:::-;12029:3;12050:67;12114:2;12109:3;12050:67;:::i;:::-;12043:74;;12126:93;12215:3;12126:93;:::i;:::-;12244:2;12239:3;12235:12;12228:19;;11887:366;;;:::o;12259:::-;12401:3;12422:67;12486:2;12481:3;12422:67;:::i;:::-;12415:74;;12498:93;12587:3;12498:93;:::i;:::-;12616:2;12611:3;12607:12;12600:19;;12259:366;;;:::o;12631:::-;12773:3;12794:67;12858:2;12853:3;12794:67;:::i;:::-;12787:74;;12870:93;12959:3;12870:93;:::i;:::-;12988:2;12983:3;12979:12;12972:19;;12631:366;;;:::o;13003:::-;13145:3;13166:67;13230:2;13225:3;13166:67;:::i;:::-;13159:74;;13242:93;13331:3;13242:93;:::i;:::-;13360:2;13355:3;13351:12;13344:19;;13003:366;;;:::o;13375:118::-;13462:24;13480:5;13462:24;:::i;:::-;13457:3;13450:37;13375:118;;:::o;13499:256::-;13611:3;13626:75;13697:3;13688:6;13626:75;:::i;:::-;13726:2;13721:3;13717:12;13710:19;;13746:3;13739:10;;13499:256;;;;:::o;13761:435::-;13941:3;13963:95;14054:3;14045:6;13963:95;:::i;:::-;13956:102;;14075:95;14166:3;14157:6;14075:95;:::i;:::-;14068:102;;14187:3;14180:10;;13761:435;;;;;:::o;14202:222::-;14295:4;14333:2;14322:9;14318:18;14310:26;;14346:71;14414:1;14403:9;14399:17;14390:6;14346:71;:::i;:::-;14202:222;;;;:::o;14430:640::-;14625:4;14663:3;14652:9;14648:19;14640:27;;14677:71;14745:1;14734:9;14730:17;14721:6;14677:71;:::i;:::-;14758:72;14826:2;14815:9;14811:18;14802:6;14758:72;:::i;:::-;14840;14908:2;14897:9;14893:18;14884:6;14840:72;:::i;:::-;14959:9;14953:4;14949:20;14944:2;14933:9;14929:18;14922:48;14987:76;15058:4;15049:6;14987:76;:::i;:::-;14979:84;;14430:640;;;;;;;:::o;15076:210::-;15163:4;15201:2;15190:9;15186:18;15178:26;;15214:65;15276:1;15265:9;15261:17;15252:6;15214:65;:::i;:::-;15076:210;;;;:::o;15292:222::-;15385:4;15423:2;15412:9;15408:18;15400:26;;15436:71;15504:1;15493:9;15489:17;15480:6;15436:71;:::i;:::-;15292:222;;;;:::o;15520:313::-;15633:4;15671:2;15660:9;15656:18;15648:26;;15720:9;15714:4;15710:20;15706:1;15695:9;15691:17;15684:47;15748:78;15821:4;15812:6;15748:78;:::i;:::-;15740:86;;15520:313;;;;:::o;15839:419::-;16005:4;16043:2;16032:9;16028:18;16020:26;;16092:9;16086:4;16082:20;16078:1;16067:9;16063:17;16056:47;16120:131;16246:4;16120:131;:::i;:::-;16112:139;;15839:419;;;:::o;16264:::-;16430:4;16468:2;16457:9;16453:18;16445:26;;16517:9;16511:4;16507:20;16503:1;16492:9;16488:17;16481:47;16545:131;16671:4;16545:131;:::i;:::-;16537:139;;16264:419;;;:::o;16689:::-;16855:4;16893:2;16882:9;16878:18;16870:26;;16942:9;16936:4;16932:20;16928:1;16917:9;16913:17;16906:47;16970:131;17096:4;16970:131;:::i;:::-;16962:139;;16689:419;;;:::o;17114:::-;17280:4;17318:2;17307:9;17303:18;17295:26;;17367:9;17361:4;17357:20;17353:1;17342:9;17338:17;17331:47;17395:131;17521:4;17395:131;:::i;:::-;17387:139;;17114:419;;;:::o;17539:::-;17705:4;17743:2;17732:9;17728:18;17720:26;;17792:9;17786:4;17782:20;17778:1;17767:9;17763:17;17756:47;17820:131;17946:4;17820:131;:::i;:::-;17812:139;;17539:419;;;:::o;17964:::-;18130:4;18168:2;18157:9;18153:18;18145:26;;18217:9;18211:4;18207:20;18203:1;18192:9;18188:17;18181:47;18245:131;18371:4;18245:131;:::i;:::-;18237:139;;17964:419;;;:::o;18389:::-;18555:4;18593:2;18582:9;18578:18;18570:26;;18642:9;18636:4;18632:20;18628:1;18617:9;18613:17;18606:47;18670:131;18796:4;18670:131;:::i;:::-;18662:139;;18389:419;;;:::o;18814:::-;18980:4;19018:2;19007:9;19003:18;18995:26;;19067:9;19061:4;19057:20;19053:1;19042:9;19038:17;19031:47;19095:131;19221:4;19095:131;:::i;:::-;19087:139;;18814:419;;;:::o;19239:222::-;19332:4;19370:2;19359:9;19355:18;19347:26;;19383:71;19451:1;19440:9;19436:17;19427:6;19383:71;:::i;:::-;19239:222;;;;:::o;19467:129::-;19501:6;19528:20;;:::i;:::-;19518:30;;19557:33;19585:4;19577:6;19557:33;:::i;:::-;19467:129;;;:::o;19602:75::-;19635:6;19668:2;19662:9;19652:19;;19602:75;:::o;19683:307::-;19744:4;19834:18;19826:6;19823:30;19820:56;;;19856:18;;:::i;:::-;19820:56;19894:29;19916:6;19894:29;:::i;:::-;19886:37;;19978:4;19972;19968:15;19960:23;;19683:307;;;:::o;19996:98::-;20047:6;20081:5;20075:12;20065:22;;19996:98;;;:::o;20100:99::-;20152:6;20186:5;20180:12;20170:22;;20100:99;;;:::o;20205:168::-;20288:11;20322:6;20317:3;20310:19;20362:4;20357:3;20353:14;20338:29;;20205:168;;;;:::o;20379:169::-;20463:11;20497:6;20492:3;20485:19;20537:4;20532:3;20528:14;20513:29;;20379:169;;;;:::o;20554:148::-;20656:11;20693:3;20678:18;;20554:148;;;;:::o;20708:305::-;20748:3;20767:20;20785:1;20767:20;:::i;:::-;20762:25;;20801:20;20819:1;20801:20;:::i;:::-;20796:25;;20955:1;20887:66;20883:74;20880:1;20877:81;20874:107;;;20961:18;;:::i;:::-;20874:107;21005:1;21002;20998:9;20991:16;;20708:305;;;;:::o;21019:348::-;21059:7;21082:20;21100:1;21082:20;:::i;:::-;21077:25;;21116:20;21134:1;21116:20;:::i;:::-;21111:25;;21304:1;21236:66;21232:74;21229:1;21226:81;21221:1;21214:9;21207:17;21203:105;21200:131;;;21311:18;;:::i;:::-;21200:131;21359:1;21356;21352:9;21341:20;;21019:348;;;;:::o;21373:96::-;21410:7;21439:24;21457:5;21439:24;:::i;:::-;21428:35;;21373:96;;;:::o;21475:90::-;21509:7;21552:5;21545:13;21538:21;21527:32;;21475:90;;;:::o;21571:77::-;21608:7;21637:5;21626:16;;21571:77;;;:::o;21654:149::-;21690:7;21730:66;21723:5;21719:78;21708:89;;21654:149;;;:::o;21809:126::-;21846:7;21886:42;21879:5;21875:54;21864:65;;21809:126;;;:::o;21941:77::-;21978:7;22007:5;21996:16;;21941:77;;;:::o;22024:154::-;22108:6;22103:3;22098;22085:30;22170:1;22161:6;22156:3;22152:16;22145:27;22024:154;;;:::o;22184:307::-;22252:1;22262:113;22276:6;22273:1;22270:13;22262:113;;;22361:1;22356:3;22352:11;22346:18;22342:1;22337:3;22333:11;22326:39;22298:2;22295:1;22291:10;22286:15;;22262:113;;;22393:6;22390:1;22387:13;22384:101;;;22473:1;22464:6;22459:3;22455:16;22448:27;22384:101;22233:258;22184:307;;;:::o;22497:320::-;22541:6;22578:1;22572:4;22568:12;22558:22;;22625:1;22619:4;22615:12;22646:18;22636:81;;22702:4;22694:6;22690:17;22680:27;;22636:81;22764:2;22756:6;22753:14;22733:18;22730:38;22727:84;;;22783:18;;:::i;:::-;22727:84;22548:269;22497:320;;;:::o;22823:281::-;22906:27;22928:4;22906:27;:::i;:::-;22898:6;22894:40;23036:6;23024:10;23021:22;23000:18;22988:10;22985:34;22982:62;22979:88;;;23047:18;;:::i;:::-;22979:88;23087:10;23083:2;23076:22;22866:238;22823:281;;:::o;23110:233::-;23149:3;23172:24;23190:5;23172:24;:::i;:::-;23163:33;;23218:66;23211:5;23208:77;23205:103;;;23288:18;;:::i;:::-;23205:103;23335:1;23328:5;23324:13;23317:20;;23110:233;;;:::o;23349:100::-;23388:7;23417:26;23437:5;23417:26;:::i;:::-;23406:37;;23349:100;;;:::o;23455:94::-;23494:7;23523:20;23537:5;23523:20;:::i;:::-;23512:31;;23455:94;;;:::o;23555:180::-;23603:77;23600:1;23593:88;23700:4;23697:1;23690:15;23724:4;23721:1;23714:15;23741:180;23789:77;23786:1;23779:88;23886:4;23883:1;23876:15;23910:4;23907:1;23900:15;23927:180;23975:77;23972:1;23965:88;24072:4;24069:1;24062:15;24096:4;24093:1;24086:15;24113:180;24161:77;24158:1;24151:88;24258:4;24255:1;24248:15;24282:4;24279:1;24272:15;24299:117;24408:1;24405;24398:12;24422:117;24531:1;24528;24521:12;24545:117;24654:1;24651;24644:12;24668:117;24777:1;24774;24767:12;24791:117;24900:1;24897;24890:12;24914:117;25023:1;25020;25013:12;25037:102;25078:6;25129:2;25125:7;25120:2;25113:5;25109:14;25105:28;25095:38;;25037:102;;;:::o;25145:94::-;25178:8;25226:5;25222:2;25218:14;25197:35;;25145:94;;;:::o;25245:182::-;25385:34;25381:1;25373:6;25369:14;25362:58;25245:182;:::o;25433:225::-;25573:34;25569:1;25561:6;25557:14;25550:58;25642:8;25637:2;25629:6;25625:15;25618:33;25433:225;:::o;25664:180::-;25804:32;25800:1;25792:6;25788:14;25781:56;25664:180;:::o;25850:166::-;25990:18;25986:1;25978:6;25974:14;25967:42;25850:166;:::o;26022:173::-;26162:25;26158:1;26150:6;26146:14;26139:49;26022:173;:::o;26201:182::-;26341:34;26337:1;26329:6;26325:14;26318:58;26201:182;:::o;26389:172::-;26529:24;26525:1;26517:6;26513:14;26506:48;26389:172;:::o;26567:177::-;26707:29;26703:1;26695:6;26691:14;26684:53;26567:177;:::o;26750:122::-;26823:24;26841:5;26823:24;:::i;:::-;26816:5;26813:35;26803:63;;26862:1;26859;26852:12;26803:63;26750:122;:::o;26878:116::-;26948:21;26963:5;26948:21;:::i;:::-;26941:5;26938:32;26928:60;;26984:1;26981;26974:12;26928:60;26878:116;:::o;27000:122::-;27073:24;27091:5;27073:24;:::i;:::-;27066:5;27063:35;27053:63;;27112:1;27109;27102:12;27053:63;27000:122;:::o;27128:120::-;27200:23;27217:5;27200:23;:::i;:::-;27193:5;27190:34;27180:62;;27238:1;27235;27228:12;27180:62;27128:120;:::o;27254:122::-;27327:24;27345:5;27327:24;:::i;:::-;27320:5;27317:35;27307:63;;27366:1;27363;27356:12;27307:63;27254:122;:::o

Swarm Source

ipfs://889ff40d9184ca3a054635e39bb3761a26bc5453a66ffa87e4508594ada1d844
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.