ETH Price: $3,389.15 (+1.72%)
Gas: 9.06 Gwei

Token

DeadBears (DEADB)
 

Overview

Max Total Supply

4,444 DEADB

Holders

975

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 DEADB
0xa2085e0eb73fa194743027c0f943c11044dcc308
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:
DeadBears

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-28
*/

// Sources flattened with hardhat v2.9.6 https://hardhat.org

// File erc721a/contracts/[email protected]

// 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 erc721a/contracts/[email protected]


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @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 @openzeppelin/contracts/utils/cryptography/[email protected]


// 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 @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

    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 contracts/DeadBears.sol

pragma solidity ^0.8.4;



contract DeadBears is ERC721A, Ownable {
    uint256 public MAX_SUPPLY = 4444;
    uint256 public MAX_BUY_SUPPLY = 4000;
    uint256 public MAX_FREE_SUPPLY = 333;
    uint256 public PRICE = 0.03 ether;
    string public BASE_URI = "";

    uint256 public freeClaimed = 0;
    uint256 public bought = 0;

    bytes32 public merkleRoot;
    mapping(address => bool) public hasClaimed;

    bool public open;
    uint256 public walletLimit;
    bool public disableOwnerMint;

    constructor() ERC721A("DeadBears", "DEADB") {
        open = false;
        walletLimit = 20;
        disableOwnerMint = false;
    }

    function ownerMint(uint256 num) public onlyOwner {
        require(!disableOwnerMint);
        _safeMint(msg.sender, num);
    }

    function mintWhitelist(bytes32[] calldata proof) external {
        require(open);
        require(freeClaimed < MAX_FREE_SUPPLY);

        if (hasClaimed[msg.sender]) revert();

        // Verify merkle proof, or revert if not in tree
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, uint256(1)));
        bool isValidLeaf = MerkleProof.verify(proof, merkleRoot, leaf);
        if (!isValidLeaf) revert();

        // Set address to claimed
        hasClaimed[msg.sender] = true;

        // Mint tokens to address
        _safeMint(msg.sender, 1);

        freeClaimed += 1;
    }

    function mint(uint256 quantity) external payable {
        require(open);
        require(bought < MAX_BUY_SUPPLY);

        if (quantity > walletLimit) {
            quantity = walletLimit;
        }

        if (quantity + _totalMinted() > MAX_SUPPLY) {
            quantity = MAX_SUPPLY - _totalMinted();
        }

        require(msg.value >= quantity * PRICE, "Not enough ETH sent.");

        _safeMint(msg.sender, quantity);
        bought += 1;

        uint256 remaining = msg.value - (quantity * PRICE);
        if (remaining > 0) {
            (bool success, ) = msg.sender.call{value: remaining}("");
            require(success);
        }
    }

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

    function setBaseUri(string calldata _baseUri) public onlyOwner {
        BASE_URI = _baseUri;
    }

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

    function setWalletLimit(uint256 limit) public onlyOwner {
        walletLimit = limit;
    }

    function setOpen(bool o) public onlyOwner {
        open = o;
    }

    function permanentlyDisableOwnerMint() public onlyOwner {
        disableOwnerMint = true;
    }

    function withdraw() external onlyOwner {
        uint256 bal = address(this).balance;
        payable(address(0x84f6FfeF5d9e888049e46C7eDD618a817f6c2c06)).call{value: bal}("");
    }
}

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":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUY_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableOwnerMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"ownerMint","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":"permanentlyDisableOwnerMint","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"o","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261115c600955610fa0600a5561014d600b55666a94d74f430000600c5560405180602001604052806000815250600d9080519060200190620000489291906200024e565b506000600e556000600f553480156200006057600080fd5b506040518060400160405280600981526020017f44656164426561727300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44454144420000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e59291906200024e565b508060039080519060200190620000fe9291906200024e565b506200010f6200017b60201b60201c565b6000819055505050620001376200012b6200018060201b60201c565b6200018860201b60201c565b6000601260006101000a81548160ff02191690831515021790555060146013819055506000601460006101000a81548160ff02191690831515021790555062000363565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025c90620002fe565b90600052602060002090601f016020900481019282620002805760008555620002cc565b82601f106200029b57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cb578251825591602001919060010190620002ae565b5b509050620002db9190620002df565b5090565b5b80821115620002fa576000816000905550600101620002e0565b5090565b600060028204905060018216806200031757607f821691505b602082108114156200032e576200032d62000334565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61341c80620003736000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063a22cb465116100ab578063f19e75d41161006f578063f19e75d4146107ea578063f1d5f51714610813578063f2fde38b1461083c578063f8873b3e14610865578063fcfff16f1461087c57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063dbddb26a14610782578063e985e9c5146107ad57610225565b80638d859f3e116100f25780638d859f3e1461062d5780638da5cb5b1461065857806395d89b4114610683578063a0712d68146106ae578063a0bcfc7f146106ca57610225565b8063715018a61461058557806373b2e80e1461059c5780637cb64759146105d957806385bb1bf41461060257610225565b806332cb6b0c116101b157806344d843811161017557806344d843811461048e5780635b688957146104b75780636352211e146104e25780636fdca5e01461051f57806370a082311461054857610225565b806332cb6b0c146103cd57806334976b9b146103f85780633c8463a1146104235780633ccfd60b1461044e57806342842e0e1461046557610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631b47ec3a1461034e57806323b872dd146103795780632eb4a7ab146103a257610225565b806301ffc9a71461022a57806302ddb65b1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b0a565b6108a7565b60405161025e9190612e2f565b60405180910390f35b34801561027357600080fd5b5061027c610939565b6040516102899190612ee7565b60405180910390f35b34801561029e57600080fd5b506102a761093f565b6040516102b49190612e65565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612ba1565b6109d1565b6040516102f19190612dc8565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612a37565b610a4d565b005b34801561032f57600080fd5b50610338610bf4565b6040516103459190612ee7565b60405180910390f35b34801561035a57600080fd5b50610363610c0b565b6040516103709190612ee7565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612931565b610c11565b005b3480156103ae57600080fd5b506103b7610c21565b6040516103c49190612e4a565b60405180910390f35b3480156103d957600080fd5b506103e2610c27565b6040516103ef9190612ee7565b60405180910390f35b34801561040457600080fd5b5061040d610c2d565b60405161041a9190612ee7565b60405180910390f35b34801561042f57600080fd5b50610438610c33565b6040516104459190612ee7565b60405180910390f35b34801561045a57600080fd5b50610463610c39565b005b34801561047157600080fd5b5061048c60048036038101906104879190612931565b610d3a565b005b34801561049a57600080fd5b506104b560048036038101906104b09190612a73565b610d5a565b005b3480156104c357600080fd5b506104cc610ee7565b6040516104d99190612e2f565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ba1565b610efa565b6040516105169190612dc8565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ab8565b610f0c565b005b34801561055457600080fd5b5061056f600480360381019061056a91906128cc565b610fa5565b60405161057c9190612ee7565b60405180910390f35b34801561059157600080fd5b5061059a61105e565b005b3480156105a857600080fd5b506105c360048036038101906105be91906128cc565b6110e6565b6040516105d09190612e2f565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190612ae1565b611106565b005b34801561060e57600080fd5b5061061761118c565b6040516106249190612ee7565b60405180910390f35b34801561063957600080fd5b50610642611192565b60405161064f9190612ee7565b60405180910390f35b34801561066457600080fd5b5061066d611198565b60405161067a9190612dc8565b60405180910390f35b34801561068f57600080fd5b506106986111c2565b6040516106a59190612e65565b60405180910390f35b6106c860048036038101906106c39190612ba1565b611254565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612b5c565b6113d7565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906129fb565b611469565b005b34801561072857600080fd5b50610743600480360381019061073e9190612980565b6115e1565b005b34801561075157600080fd5b5061076c60048036038101906107679190612ba1565b611654565b6040516107799190612e65565b60405180910390f35b34801561078e57600080fd5b506107976116f3565b6040516107a49190612e65565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906128f5565b611781565b6040516107e19190612e2f565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190612ba1565b611815565b005b34801561081f57600080fd5b5061083a60048036038101906108359190612ba1565b6118b8565b005b34801561084857600080fd5b50610863600480360381019061085e91906128cc565b61193e565b005b34801561087157600080fd5b5061087a611a36565b005b34801561088857600080fd5b50610891611acf565b60405161089e9190612e2f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461094e9061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461097a9061314a565b80156109c75780601f1061099c576101008083540402835291602001916109c7565b820191906000526020600020905b8154815290600101906020018083116109aa57829003601f168201915b5050505050905090565b60006109dc82611ae2565b610a12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611c0f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4257610b0b81610b06611c0f565b611781565b610b41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bfe611c17565b6001546000540303905090565b600e5481565b610c1c838383611c1c565b505050565b60105481565b60095481565b600f5481565b60135481565b610c41611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611198565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90612ec7565b60405180910390fd5b60004790507384f6ffef5d9e888049e46c7edd618a817f6c2c0673ffffffffffffffffffffffffffffffffffffffff1681604051610cf290612db3565b60006040518083038185875af1925050503d8060008114610d2f576040519150601f19603f3d011682016040523d82523d6000602084013e610d34565b606091505b50505050565b610d55838383604051806020016040528060008152506115e1565b505050565b601260009054906101000a900460ff16610d7357600080fd5b600b54600e5410610d8357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610dda57600080fd5b6000336001604051602001610df0929190612d63565b6040516020818303038152906040528051906020012090506000610e58848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611fce565b905080610e6457600080fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ec7336001611fe5565b6001600e6000828254610eda9190612fa6565b9250508190555050505050565b601460009054906101000a900460ff1681565b6000610f0582611b41565b9050919050565b610f14611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610f32611198565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90612ec7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611066611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611084611198565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612ec7565b60405180910390fd5b6110e46000612003565b565b60116020528060005260406000206000915054906101000a900460ff1681565b61110e611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661112c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990612ec7565b60405180910390fd5b8060108190555050565b600a5481565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d19061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fd9061314a565b801561124a5780601f1061121f5761010080835404028352916020019161124a565b820191906000526020600020905b81548152906001019060200180831161122d57829003601f168201915b5050505050905090565b601260009054906101000a900460ff1661126d57600080fd5b600a54600f541061127d57600080fd5b60135481111561128d5760135490505b6009546112986120c9565b826112a39190612fa6565b11156112c1576112b16120c9565b6009546112be9190613056565b90505b600c54816112cf9190612ffc565b341015611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890612e87565b60405180910390fd5b61131b3382611fe5565b6001600f600082825461132e9190612fa6565b925050819055506000600c54826113459190612ffc565b346113509190613056565b905060008111156113d35760003373ffffffffffffffffffffffffffffffffffffffff168260405161138190612db3565b60006040518083038185875af1925050503d80600081146113be576040519150601f19603f3d011682016040523d82523d6000602084013e6113c3565b606091505b50509050806113d157600080fd5b505b5050565b6113df611fc6565b73ffffffffffffffffffffffffffffffffffffffff166113fd611198565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90612ec7565b60405180910390fd5b8181600d91906114649291906126af565b505050565b611471611c0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114e3611c0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611590611c0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d59190612e2f565b60405180910390a35050565b6115ec848484611c1c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461164e57611617848484846120dc565b61164d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061165f82611ae2565b611695576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061169f61223c565b90506000815114156116c057604051806020016040528060008152506116eb565b806116ca846122ce565b6040516020016116db929190612d8f565b6040516020818303038152906040525b915050919050565b600d80546117009061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461172c9061314a565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181d611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661183b611198565b73ffffffffffffffffffffffffffffffffffffffff1614611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890612ec7565b60405180910390fd5b601460009054906101000a900460ff16156118ab57600080fd5b6118b53382611fe5565b50565b6118c0611fc6565b73ffffffffffffffffffffffffffffffffffffffff166118de611198565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b90612ec7565b60405180910390fd5b8060138190555050565b611946611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611964611198565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190612ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190612ea7565b60405180910390fd5b611a3381612003565b50565b611a3e611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611a5c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990612ec7565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b600081611aed611c17565b11158015611afc575060005482105b8015611b3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b50611c17565b11611bd857600054811015611bd75760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bd5575b6000811415611bcb576004600083600190039350838152602001908152602001600020549050611ba0565b8092505050611c0a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c2782611b41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611caf611c0f565b73ffffffffffffffffffffffffffffffffffffffff161480611cde5750611cdd85611cd8611c0f565b611781565b5b80611d235750611cec611c0f565b73ffffffffffffffffffffffffffffffffffffffff16611d0b846109d1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d5c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd08585856001612328565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ecd8661232e565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611f57576000600184019050600060046000838152602001908152602001600020541415611f55576000548114611f54578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fbf8585856001612338565b5050505050565b600033905090565b600082611fdb858461233e565b1490509392505050565b611fff8282604051806020016040528060008152506123d9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120d3611c17565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612102611c0f565b8786866040518563ffffffff1660e01b81526004016121249493929190612de3565b602060405180830381600087803b15801561213e57600080fd5b505af192505050801561216f57506040513d601f19601f8201168201806040525081019061216c9190612b33565b60015b6121e9573d806000811461219f576040519150601f19603f3d011682016040523d82523d6000602084013e6121a4565b606091505b506000815114156121e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461224b9061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546122779061314a565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561231457600183039250600a81066030018353600a810490506122f4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60008082905060005b84518110156123ce57600085828151811061238b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116123ad576123a6838261268e565b92506123ba565b6123b7818461268e565b92505b5080806123c6906131ad565b915050612347565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612446576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612481576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248e6000858386612328565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124f3600185146126a5565b901b60a042901b6125038661232e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612607575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b760008784806001019550876120dc565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061254857826000541461260257600080fd5b612672565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612608575b8160008190555050506126886000858386612338565b50505050565b600082600052816020526040600020905092915050565b6000819050919050565b8280546126bb9061314a565b90600052602060002090601f0160209004810192826126dd5760008555612724565b82601f106126f657803560ff1916838001178555612724565b82800160010185558215612724579182015b82811115612723578235825591602001919060010190612708565b5b5090506127319190612735565b5090565b5b8082111561274e576000816000905550600101612736565b5090565b600061276561276084612f27565b612f02565b90508281526020810184848401111561277d57600080fd5b612788848285613108565b509392505050565b60008135905061279f81613373565b92915050565b60008083601f8401126127b757600080fd5b8235905067ffffffffffffffff8111156127d057600080fd5b6020830191508360208202830111156127e857600080fd5b9250929050565b6000813590506127fe8161338a565b92915050565b600081359050612813816133a1565b92915050565b600081359050612828816133b8565b92915050565b60008151905061283d816133b8565b92915050565b600082601f83011261285457600080fd5b8135612864848260208601612752565b91505092915050565b60008083601f84011261287f57600080fd5b8235905067ffffffffffffffff81111561289857600080fd5b6020830191508360018202830111156128b057600080fd5b9250929050565b6000813590506128c6816133cf565b92915050565b6000602082840312156128de57600080fd5b60006128ec84828501612790565b91505092915050565b6000806040838503121561290857600080fd5b600061291685828601612790565b925050602061292785828601612790565b9150509250929050565b60008060006060848603121561294657600080fd5b600061295486828701612790565b935050602061296586828701612790565b9250506040612976868287016128b7565b9150509250925092565b6000806000806080858703121561299657600080fd5b60006129a487828801612790565b94505060206129b587828801612790565b93505060406129c6878288016128b7565b925050606085013567ffffffffffffffff8111156129e357600080fd5b6129ef87828801612843565b91505092959194509250565b60008060408385031215612a0e57600080fd5b6000612a1c85828601612790565b9250506020612a2d858286016127ef565b9150509250929050565b60008060408385031215612a4a57600080fd5b6000612a5885828601612790565b9250506020612a69858286016128b7565b9150509250929050565b60008060208385031215612a8657600080fd5b600083013567ffffffffffffffff811115612aa057600080fd5b612aac858286016127a5565b92509250509250929050565b600060208284031215612aca57600080fd5b6000612ad8848285016127ef565b91505092915050565b600060208284031215612af357600080fd5b6000612b0184828501612804565b91505092915050565b600060208284031215612b1c57600080fd5b6000612b2a84828501612819565b91505092915050565b600060208284031215612b4557600080fd5b6000612b538482850161282e565b91505092915050565b60008060208385031215612b6f57600080fd5b600083013567ffffffffffffffff811115612b8957600080fd5b612b958582860161286d565b92509250509250929050565b600060208284031215612bb357600080fd5b6000612bc1848285016128b7565b91505092915050565b612bd38161308a565b82525050565b612bea612be58261308a565b6131f6565b82525050565b612bf98161309c565b82525050565b612c08816130a8565b82525050565b6000612c1982612f58565b612c238185612f6e565b9350612c33818560208601613117565b612c3c816132b1565b840191505092915050565b6000612c5282612f63565b612c5c8185612f8a565b9350612c6c818560208601613117565b612c75816132b1565b840191505092915050565b6000612c8b82612f63565b612c958185612f9b565b9350612ca5818560208601613117565b80840191505092915050565b6000612cbe601483612f8a565b9150612cc9826132cf565b602082019050919050565b6000612ce1602683612f8a565b9150612cec826132f8565b604082019050919050565b6000612d04602083612f8a565b9150612d0f82613347565b602082019050919050565b6000612d27600083612f7f565b9150612d3282613370565b600082019050919050565b612d46816130fe565b82525050565b612d5d612d58826130fe565b61321a565b82525050565b6000612d6f8285612bd9565b601482019150612d7f8284612d4c565b6020820191508190509392505050565b6000612d9b8285612c80565b9150612da78284612c80565b91508190509392505050565b6000612dbe82612d1a565b9150819050919050565b6000602082019050612ddd6000830184612bca565b92915050565b6000608082019050612df86000830187612bca565b612e056020830186612bca565b612e126040830185612d3d565b8181036060830152612e248184612c0e565b905095945050505050565b6000602082019050612e446000830184612bf0565b92915050565b6000602082019050612e5f6000830184612bff565b92915050565b60006020820190508181036000830152612e7f8184612c47565b905092915050565b60006020820190508181036000830152612ea081612cb1565b9050919050565b60006020820190508181036000830152612ec081612cd4565b9050919050565b60006020820190508181036000830152612ee081612cf7565b9050919050565b6000602082019050612efc6000830184612d3d565b92915050565b6000612f0c612f1d565b9050612f18828261317c565b919050565b6000604051905090565b600067ffffffffffffffff821115612f4257612f41613282565b5b612f4b826132b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fb1826130fe565b9150612fbc836130fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ff157612ff0613224565b5b828201905092915050565b6000613007826130fe565b9150613012836130fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561304b5761304a613224565b5b828202905092915050565b6000613061826130fe565b915061306c836130fe565b92508282101561307f5761307e613224565b5b828203905092915050565b6000613095826130de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313557808201518184015260208101905061311a565b83811115613144576000848401525b50505050565b6000600282049050600182168061316257607f821691505b6020821081141561317657613175613253565b5b50919050565b613185826132b1565b810181811067ffffffffffffffff821117156131a4576131a3613282565b5b80604052505050565b60006131b8826130fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea613224565b5b600182019050919050565b600061320182613208565b9050919050565b6000613213826132c2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61337c8161308a565b811461338757600080fd5b50565b6133938161309c565b811461339e57600080fd5b50565b6133aa816130a8565b81146133b557600080fd5b50565b6133c1816130b2565b81146133cc57600080fd5b50565b6133d8816130fe565b81146133e357600080fd5b5056fea2646970667358221220551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de82164736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063a22cb465116100ab578063f19e75d41161006f578063f19e75d4146107ea578063f1d5f51714610813578063f2fde38b1461083c578063f8873b3e14610865578063fcfff16f1461087c57610225565b8063a22cb465146106f3578063b88d4fde1461071c578063c87b56dd14610745578063dbddb26a14610782578063e985e9c5146107ad57610225565b80638d859f3e116100f25780638d859f3e1461062d5780638da5cb5b1461065857806395d89b4114610683578063a0712d68146106ae578063a0bcfc7f146106ca57610225565b8063715018a61461058557806373b2e80e1461059c5780637cb64759146105d957806385bb1bf41461060257610225565b806332cb6b0c116101b157806344d843811161017557806344d843811461048e5780635b688957146104b75780636352211e146104e25780636fdca5e01461051f57806370a082311461054857610225565b806332cb6b0c146103cd57806334976b9b146103f85780633c8463a1146104235780633ccfd60b1461044e57806342842e0e1461046557610225565b8063095ea7b3116101f8578063095ea7b3146102fa57806318160ddd146103235780631b47ec3a1461034e57806323b872dd146103795780632eb4a7ab146103a257610225565b806301ffc9a71461022a57806302ddb65b1461026757806306fdde0314610292578063081812fc146102bd575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612b0a565b6108a7565b60405161025e9190612e2f565b60405180910390f35b34801561027357600080fd5b5061027c610939565b6040516102899190612ee7565b60405180910390f35b34801561029e57600080fd5b506102a761093f565b6040516102b49190612e65565b60405180910390f35b3480156102c957600080fd5b506102e460048036038101906102df9190612ba1565b6109d1565b6040516102f19190612dc8565b60405180910390f35b34801561030657600080fd5b50610321600480360381019061031c9190612a37565b610a4d565b005b34801561032f57600080fd5b50610338610bf4565b6040516103459190612ee7565b60405180910390f35b34801561035a57600080fd5b50610363610c0b565b6040516103709190612ee7565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612931565b610c11565b005b3480156103ae57600080fd5b506103b7610c21565b6040516103c49190612e4a565b60405180910390f35b3480156103d957600080fd5b506103e2610c27565b6040516103ef9190612ee7565b60405180910390f35b34801561040457600080fd5b5061040d610c2d565b60405161041a9190612ee7565b60405180910390f35b34801561042f57600080fd5b50610438610c33565b6040516104459190612ee7565b60405180910390f35b34801561045a57600080fd5b50610463610c39565b005b34801561047157600080fd5b5061048c60048036038101906104879190612931565b610d3a565b005b34801561049a57600080fd5b506104b560048036038101906104b09190612a73565b610d5a565b005b3480156104c357600080fd5b506104cc610ee7565b6040516104d99190612e2f565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190612ba1565b610efa565b6040516105169190612dc8565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190612ab8565b610f0c565b005b34801561055457600080fd5b5061056f600480360381019061056a91906128cc565b610fa5565b60405161057c9190612ee7565b60405180910390f35b34801561059157600080fd5b5061059a61105e565b005b3480156105a857600080fd5b506105c360048036038101906105be91906128cc565b6110e6565b6040516105d09190612e2f565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190612ae1565b611106565b005b34801561060e57600080fd5b5061061761118c565b6040516106249190612ee7565b60405180910390f35b34801561063957600080fd5b50610642611192565b60405161064f9190612ee7565b60405180910390f35b34801561066457600080fd5b5061066d611198565b60405161067a9190612dc8565b60405180910390f35b34801561068f57600080fd5b506106986111c2565b6040516106a59190612e65565b60405180910390f35b6106c860048036038101906106c39190612ba1565b611254565b005b3480156106d657600080fd5b506106f160048036038101906106ec9190612b5c565b6113d7565b005b3480156106ff57600080fd5b5061071a600480360381019061071591906129fb565b611469565b005b34801561072857600080fd5b50610743600480360381019061073e9190612980565b6115e1565b005b34801561075157600080fd5b5061076c60048036038101906107679190612ba1565b611654565b6040516107799190612e65565b60405180910390f35b34801561078e57600080fd5b506107976116f3565b6040516107a49190612e65565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906128f5565b611781565b6040516107e19190612e2f565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190612ba1565b611815565b005b34801561081f57600080fd5b5061083a60048036038101906108359190612ba1565b6118b8565b005b34801561084857600080fd5b50610863600480360381019061085e91906128cc565b61193e565b005b34801561087157600080fd5b5061087a611a36565b005b34801561088857600080fd5b50610891611acf565b60405161089e9190612e2f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109325750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461094e9061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461097a9061314a565b80156109c75780601f1061099c576101008083540402835291602001916109c7565b820191906000526020600020905b8154815290600101906020018083116109aa57829003601f168201915b5050505050905090565b60006109dc82611ae2565b610a12576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611b41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611c0f565b73ffffffffffffffffffffffffffffffffffffffff1614610b4257610b0b81610b06611c0f565b611781565b610b41576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bfe611c17565b6001546000540303905090565b600e5481565b610c1c838383611c1c565b505050565b60105481565b60095481565b600f5481565b60135481565b610c41611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610c5f611198565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90612ec7565b60405180910390fd5b60004790507384f6ffef5d9e888049e46c7edd618a817f6c2c0673ffffffffffffffffffffffffffffffffffffffff1681604051610cf290612db3565b60006040518083038185875af1925050503d8060008114610d2f576040519150601f19603f3d011682016040523d82523d6000602084013e610d34565b606091505b50505050565b610d55838383604051806020016040528060008152506115e1565b505050565b601260009054906101000a900460ff16610d7357600080fd5b600b54600e5410610d8357600080fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610dda57600080fd5b6000336001604051602001610df0929190612d63565b6040516020818303038152906040528051906020012090506000610e58848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105484611fce565b905080610e6457600080fd5b6001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ec7336001611fe5565b6001600e6000828254610eda9190612fa6565b9250508190555050505050565b601460009054906101000a900460ff1681565b6000610f0582611b41565b9050919050565b610f14611fc6565b73ffffffffffffffffffffffffffffffffffffffff16610f32611198565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90612ec7565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561100d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611066611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611084611198565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190612ec7565b60405180910390fd5b6110e46000612003565b565b60116020528060005260406000206000915054906101000a900460ff1681565b61110e611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661112c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990612ec7565b60405180910390fd5b8060108190555050565b600a5481565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d19061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546111fd9061314a565b801561124a5780601f1061121f5761010080835404028352916020019161124a565b820191906000526020600020905b81548152906001019060200180831161122d57829003601f168201915b5050505050905090565b601260009054906101000a900460ff1661126d57600080fd5b600a54600f541061127d57600080fd5b60135481111561128d5760135490505b6009546112986120c9565b826112a39190612fa6565b11156112c1576112b16120c9565b6009546112be9190613056565b90505b600c54816112cf9190612ffc565b341015611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890612e87565b60405180910390fd5b61131b3382611fe5565b6001600f600082825461132e9190612fa6565b925050819055506000600c54826113459190612ffc565b346113509190613056565b905060008111156113d35760003373ffffffffffffffffffffffffffffffffffffffff168260405161138190612db3565b60006040518083038185875af1925050503d80600081146113be576040519150601f19603f3d011682016040523d82523d6000602084013e6113c3565b606091505b50509050806113d157600080fd5b505b5050565b6113df611fc6565b73ffffffffffffffffffffffffffffffffffffffff166113fd611198565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90612ec7565b60405180910390fd5b8181600d91906114649291906126af565b505050565b611471611c0f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114d6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114e3611c0f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611590611c0f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115d59190612e2f565b60405180910390a35050565b6115ec848484611c1c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461164e57611617848484846120dc565b61164d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061165f82611ae2565b611695576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061169f61223c565b90506000815114156116c057604051806020016040528060008152506116eb565b806116ca846122ce565b6040516020016116db929190612d8f565b6040516020818303038152906040525b915050919050565b600d80546117009061314a565b80601f016020809104026020016040519081016040528092919081815260200182805461172c9061314a565b80156117795780601f1061174e57610100808354040283529160200191611779565b820191906000526020600020905b81548152906001019060200180831161175c57829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61181d611fc6565b73ffffffffffffffffffffffffffffffffffffffff1661183b611198565b73ffffffffffffffffffffffffffffffffffffffff1614611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890612ec7565b60405180910390fd5b601460009054906101000a900460ff16156118ab57600080fd5b6118b53382611fe5565b50565b6118c0611fc6565b73ffffffffffffffffffffffffffffffffffffffff166118de611198565b73ffffffffffffffffffffffffffffffffffffffff1614611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192b90612ec7565b60405180910390fd5b8060138190555050565b611946611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611964611198565b73ffffffffffffffffffffffffffffffffffffffff16146119ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b190612ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2190612ea7565b60405180910390fd5b611a3381612003565b50565b611a3e611fc6565b73ffffffffffffffffffffffffffffffffffffffff16611a5c611198565b73ffffffffffffffffffffffffffffffffffffffff1614611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990612ec7565b60405180910390fd5b6001601460006101000a81548160ff021916908315150217905550565b601260009054906101000a900460ff1681565b600081611aed611c17565b11158015611afc575060005482105b8015611b3a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611b50611c17565b11611bd857600054811015611bd75760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611bd5575b6000811415611bcb576004600083600190039350838152602001908152602001600020549050611ba0565b8092505050611c0a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611c2782611b41565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c8e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611caf611c0f565b73ffffffffffffffffffffffffffffffffffffffff161480611cde5750611cdd85611cd8611c0f565b611781565b5b80611d235750611cec611c0f565b73ffffffffffffffffffffffffffffffffffffffff16611d0b846109d1565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d5c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dc3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd08585856001612328565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611ecd8661232e565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611f57576000600184019050600060046000838152602001908152602001600020541415611f55576000548114611f54578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fbf8585856001612338565b5050505050565b600033905090565b600082611fdb858461233e565b1490509392505050565b611fff8282604051806020016040528060008152506123d9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006120d3611c17565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612102611c0f565b8786866040518563ffffffff1660e01b81526004016121249493929190612de3565b602060405180830381600087803b15801561213e57600080fd5b505af192505050801561216f57506040513d601f19601f8201168201806040525081019061216c9190612b33565b60015b6121e9573d806000811461219f576040519150601f19603f3d011682016040523d82523d6000602084013e6121a4565b606091505b506000815114156121e1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d805461224b9061314a565b80601f01602080910402602001604051908101604052809291908181526020018280546122779061314a565b80156122c45780601f10612299576101008083540402835291602001916122c4565b820191906000526020600020905b8154815290600101906020018083116122a757829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561231457600183039250600a81066030018353600a810490506122f4565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60008082905060005b84518110156123ce57600085828151811061238b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116123ad576123a6838261268e565b92506123ba565b6123b7818461268e565b92505b5080806123c6906131ad565b915050612347565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612446576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612481576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248e6000858386612328565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124f3600185146126a5565b901b60a042901b6125038661232e565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612607575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b760008784806001019550876120dc565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061254857826000541461260257600080fd5b612672565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612608575b8160008190555050506126886000858386612338565b50505050565b600082600052816020526040600020905092915050565b6000819050919050565b8280546126bb9061314a565b90600052602060002090601f0160209004810192826126dd5760008555612724565b82601f106126f657803560ff1916838001178555612724565b82800160010185558215612724579182015b82811115612723578235825591602001919060010190612708565b5b5090506127319190612735565b5090565b5b8082111561274e576000816000905550600101612736565b5090565b600061276561276084612f27565b612f02565b90508281526020810184848401111561277d57600080fd5b612788848285613108565b509392505050565b60008135905061279f81613373565b92915050565b60008083601f8401126127b757600080fd5b8235905067ffffffffffffffff8111156127d057600080fd5b6020830191508360208202830111156127e857600080fd5b9250929050565b6000813590506127fe8161338a565b92915050565b600081359050612813816133a1565b92915050565b600081359050612828816133b8565b92915050565b60008151905061283d816133b8565b92915050565b600082601f83011261285457600080fd5b8135612864848260208601612752565b91505092915050565b60008083601f84011261287f57600080fd5b8235905067ffffffffffffffff81111561289857600080fd5b6020830191508360018202830111156128b057600080fd5b9250929050565b6000813590506128c6816133cf565b92915050565b6000602082840312156128de57600080fd5b60006128ec84828501612790565b91505092915050565b6000806040838503121561290857600080fd5b600061291685828601612790565b925050602061292785828601612790565b9150509250929050565b60008060006060848603121561294657600080fd5b600061295486828701612790565b935050602061296586828701612790565b9250506040612976868287016128b7565b9150509250925092565b6000806000806080858703121561299657600080fd5b60006129a487828801612790565b94505060206129b587828801612790565b93505060406129c6878288016128b7565b925050606085013567ffffffffffffffff8111156129e357600080fd5b6129ef87828801612843565b91505092959194509250565b60008060408385031215612a0e57600080fd5b6000612a1c85828601612790565b9250506020612a2d858286016127ef565b9150509250929050565b60008060408385031215612a4a57600080fd5b6000612a5885828601612790565b9250506020612a69858286016128b7565b9150509250929050565b60008060208385031215612a8657600080fd5b600083013567ffffffffffffffff811115612aa057600080fd5b612aac858286016127a5565b92509250509250929050565b600060208284031215612aca57600080fd5b6000612ad8848285016127ef565b91505092915050565b600060208284031215612af357600080fd5b6000612b0184828501612804565b91505092915050565b600060208284031215612b1c57600080fd5b6000612b2a84828501612819565b91505092915050565b600060208284031215612b4557600080fd5b6000612b538482850161282e565b91505092915050565b60008060208385031215612b6f57600080fd5b600083013567ffffffffffffffff811115612b8957600080fd5b612b958582860161286d565b92509250509250929050565b600060208284031215612bb357600080fd5b6000612bc1848285016128b7565b91505092915050565b612bd38161308a565b82525050565b612bea612be58261308a565b6131f6565b82525050565b612bf98161309c565b82525050565b612c08816130a8565b82525050565b6000612c1982612f58565b612c238185612f6e565b9350612c33818560208601613117565b612c3c816132b1565b840191505092915050565b6000612c5282612f63565b612c5c8185612f8a565b9350612c6c818560208601613117565b612c75816132b1565b840191505092915050565b6000612c8b82612f63565b612c958185612f9b565b9350612ca5818560208601613117565b80840191505092915050565b6000612cbe601483612f8a565b9150612cc9826132cf565b602082019050919050565b6000612ce1602683612f8a565b9150612cec826132f8565b604082019050919050565b6000612d04602083612f8a565b9150612d0f82613347565b602082019050919050565b6000612d27600083612f7f565b9150612d3282613370565b600082019050919050565b612d46816130fe565b82525050565b612d5d612d58826130fe565b61321a565b82525050565b6000612d6f8285612bd9565b601482019150612d7f8284612d4c565b6020820191508190509392505050565b6000612d9b8285612c80565b9150612da78284612c80565b91508190509392505050565b6000612dbe82612d1a565b9150819050919050565b6000602082019050612ddd6000830184612bca565b92915050565b6000608082019050612df86000830187612bca565b612e056020830186612bca565b612e126040830185612d3d565b8181036060830152612e248184612c0e565b905095945050505050565b6000602082019050612e446000830184612bf0565b92915050565b6000602082019050612e5f6000830184612bff565b92915050565b60006020820190508181036000830152612e7f8184612c47565b905092915050565b60006020820190508181036000830152612ea081612cb1565b9050919050565b60006020820190508181036000830152612ec081612cd4565b9050919050565b60006020820190508181036000830152612ee081612cf7565b9050919050565b6000602082019050612efc6000830184612d3d565b92915050565b6000612f0c612f1d565b9050612f18828261317c565b919050565b6000604051905090565b600067ffffffffffffffff821115612f4257612f41613282565b5b612f4b826132b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612fb1826130fe565b9150612fbc836130fe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ff157612ff0613224565b5b828201905092915050565b6000613007826130fe565b9150613012836130fe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561304b5761304a613224565b5b828202905092915050565b6000613061826130fe565b915061306c836130fe565b92508282101561307f5761307e613224565b5b828203905092915050565b6000613095826130de565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561313557808201518184015260208101905061311a565b83811115613144576000848401525b50505050565b6000600282049050600182168061316257607f821691505b6020821081141561317657613175613253565b5b50919050565b613185826132b1565b810181811067ffffffffffffffff821117156131a4576131a3613282565b5b80604052505050565b60006131b8826130fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131eb576131ea613224565b5b600182019050919050565b600061320182613208565b9050919050565b6000613213826132c2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4e6f7420656e6f756768204554482073656e742e000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61337c8161308a565b811461338757600080fd5b50565b6133938161309c565b811461339e57600080fd5b50565b6133aa816130a8565b81146133b557600080fd5b50565b6133c1816130b2565b81146133cc57600080fd5b50565b6133d8816130fe565b81146133e357600080fd5b5056fea2646970667358221220551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de82164736f6c63430008040033

Deployed Bytecode Sourcemap

44652:2877:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13180:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44780:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18193:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20261:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19721:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12234:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44899:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21147:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44970:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44698:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44936:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45076:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47341:185;;;;;;;;;;;;;:::i;:::-;;21388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45430:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45109:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17982:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47158:69;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13859:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43767:103;;;;;;;;;;;;;:::i;:::-;;45002:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46958:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44737:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44823:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43116:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18362:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46051:681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46849:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20537:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21644:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18537:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44863:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20916:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45291:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47056:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44025:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47235:98;;;;;;;;;;;;;:::i;:::-;;45053:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13180:615;13265:4;13580:10;13565:25;;:11;:25;;;;:102;;;;13657:10;13642:25;;:11;:25;;;;13565:102;:179;;;;13734:10;13719:25;;:11;:25;;;;13565:179;13545:199;;13180:615;;;:::o;44780:36::-;;;;:::o;18193:100::-;18247:13;18280:5;18273:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18193:100;:::o;20261:204::-;20329:7;20354:16;20362:7;20354;:16::i;:::-;20349:64;;20379:34;;;;;;;;;;;;;;20349:64;20433:15;:24;20449:7;20433:24;;;;;;;;;;;;;;;;;;;;;20426:31;;20261:204;;;:::o;19721:474::-;19794:13;19826:27;19845:7;19826:18;:27::i;:::-;19794:61;;19876:5;19870:11;;:2;:11;;;19866:48;;;19890:24;;;;;;;;;;;;;;19866:48;19954:5;19931:28;;:19;:17;:19::i;:::-;:28;;;19927:175;;19979:44;19996:5;20003:19;:17;:19::i;:::-;19979:16;:44::i;:::-;19974:128;;20051:35;;;;;;;;;;;;;;19974:128;19927:175;20141:2;20114:15;:24;20130:7;20114:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20179:7;20175:2;20159:28;;20168:5;20159:28;;;;;;;;;;;;19721:474;;;:::o;12234:315::-;12287:7;12515:15;:13;:15::i;:::-;12500:12;;12484:13;;:28;:46;12477:53;;12234:315;:::o;44899:30::-;;;;:::o;21147:170::-;21281:28;21291:4;21297:2;21301:7;21281:9;:28::i;:::-;21147:170;;;:::o;44970:25::-;;;;:::o;44698:32::-;;;;:::o;44936:25::-;;;;:::o;45076:26::-;;;;:::o;47341:185::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47391:11:::1;47405:21;47391:35;;47453:42;47437:65;;47510:3;47437:81;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43407:1;47341:185::o:0;21388:::-;21526:39;21543:4;21549:2;21553:7;21526:39;;;;;;;;;;;;:16;:39::i;:::-;21388:185;;;:::o;45430:613::-;45507:4;;;;;;;;;;;45499:13;;;;;;45545:15;;45531:11;;:29;45523:38;;;;;;45578:10;:22;45589:10;45578:22;;;;;;;;;;;;;;;;;;;;;;;;;45574:36;;;45602:8;;;45574:36;45681:12;45723:10;45743:1;45706:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45696:51;;;;;;45681:66;;45758:16;45777:43;45796:5;;45777:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45803:10;;45815:4;45777:18;:43::i;:::-;45758:62;;45836:11;45831:26;;45849:8;;;45831:26;45930:4;45905:10;:22;45916:10;45905:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45982:24;45992:10;46004:1;45982:9;:24::i;:::-;46034:1;46019:11;;:16;;;;;;;:::i;:::-;;;;;;;;45430:613;;;;:::o;45109:28::-;;;;;;;;;;;;;:::o;17982:144::-;18046:7;18089:27;18108:7;18089:18;:27::i;:::-;18066:52;;17982:144;;;:::o;47158:69::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47218:1:::1;47211:4;;:8;;;;;;;;;;;;;;;;;;47158:69:::0;:::o;13859:224::-;13923:7;13964:1;13947:19;;:5;:19;;;13943:60;;;13975:28;;;;;;;;;;;;;;13943:60;9198:13;14021:18;:25;14040:5;14021:25;;;;;;;;;;;;;;;;:54;14014:61;;13859:224;;;:::o;43767:103::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43832:30:::1;43859:1;43832:18;:30::i;:::-;43767:103::o:0;45002:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;46958:90::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47036:4:::1;47023:10;:17;;;;46958:90:::0;:::o;44737:36::-;;;;:::o;44823:33::-;;;;:::o;43116:87::-;43162:7;43189:6;;;;;;;;;;;43182:13;;43116:87;:::o;18362:104::-;18418:13;18451:7;18444:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18362:104;:::o;46051:681::-;46119:4;;;;;;;;;;;46111:13;;;;;;46152:14;;46143:6;;:23;46135:32;;;;;;46195:11;;46184:8;:22;46180:77;;;46234:11;;46223:22;;46180:77;46301:10;;46284:14;:12;:14::i;:::-;46273:8;:25;;;;:::i;:::-;:38;46269:109;;;46352:14;:12;:14::i;:::-;46339:10;;:27;;;;:::i;:::-;46328:38;;46269:109;46422:5;;46411:8;:16;;;;:::i;:::-;46398:9;:29;;46390:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46465:31;46475:10;46487:8;46465:9;:31::i;:::-;46517:1;46507:6;;:11;;;;;;;:::i;:::-;;;;;;;;46531:17;46575:5;;46564:8;:16;;;;:::i;:::-;46551:9;:30;;;;:::i;:::-;46531:50;;46608:1;46596:9;:13;46592:133;;;46627:12;46645:10;:15;;46668:9;46645:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46626:56;;;46705:7;46697:16;;;;;;46592:133;;46051:681;;:::o;46849:101::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46934:8:::1;;46923;:19;;;;;;;:::i;:::-;;46849:101:::0;;:::o;20537:308::-;20648:19;:17;:19::i;:::-;20636:31;;:8;:31;;;20632:61;;;20676:17;;;;;;;;;;;;;;20632:61;20758:8;20706:18;:39;20725:19;:17;:19::i;:::-;20706:39;;;;;;;;;;;;;;;:49;20746:8;20706:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20818:8;20782:55;;20797:19;:17;:19::i;:::-;20782:55;;;20828:8;20782:55;;;;;;:::i;:::-;;;;;;;;20537:308;;:::o;21644:396::-;21811:28;21821:4;21827:2;21831:7;21811:9;:28::i;:::-;21872:1;21854:2;:14;;;:19;21850:183;;21893:56;21924:4;21930:2;21934:7;21943:5;21893:30;:56::i;:::-;21888:145;;21977:40;;;;;;;;;;;;;;21888:145;21850:183;21644:396;;;;:::o;18537:318::-;18610:13;18641:16;18649:7;18641;:16::i;:::-;18636:59;;18666:29;;;;;;;;;;;;;;18636:59;18708:21;18732:10;:8;:10::i;:::-;18708:34;;18785:1;18766:7;18760:21;:26;;:87;;;;;;;;;;;;;;;;;18813:7;18822:18;18832:7;18822:9;:18::i;:::-;18796:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18760:87;18753:94;;;18537:318;;;:::o;44863:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20916:164::-;21013:4;21037:18;:25;21056:5;21037:25;;;;;;;;;;;;;;;:35;21063:8;21037:35;;;;;;;;;;;;;;;;;;;;;;;;;21030:42;;20916:164;;;;:::o;45291:131::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45360:16:::1;;;;;;;;;;;45359:17;45351:26;;;::::0;::::1;;45388;45398:10;45410:3;45388:9;:26::i;:::-;45291:131:::0;:::o;47056:94::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47137:5:::1;47123:11;:19;;;;47056:94:::0;:::o;44025:201::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44134:1:::1;44114:22;;:8;:22;;;;44106:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44190:28;44209:8;44190:18;:28::i;:::-;44025:201:::0;:::o;47235:98::-;43347:12;:10;:12::i;:::-;43336:23;;:7;:5;:7::i;:::-;:23;;;43328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47321:4:::1;47302:16;;:23;;;;;;;;;;;;;;;;;;47235:98::o:0;45053:16::-;;;;;;;;;;;;;:::o;22295:273::-;22352:4;22408:7;22389:15;:13;:15::i;:::-;:26;;:66;;;;;22442:13;;22432:7;:23;22389:66;:152;;;;;22540:1;9968:8;22493:17;:26;22511:7;22493:26;;;;;;;;;;;;:43;:48;22389:152;22369:172;;22295:273;;;:::o;15497:1129::-;15564:7;15584:12;15599:7;15584:22;;15667:4;15648:15;:13;:15::i;:::-;:23;15644:915;;15701:13;;15694:4;:20;15690:869;;;15739:14;15756:17;:23;15774:4;15756:23;;;;;;;;;;;;15739:40;;15872:1;9968:8;15845:6;:23;:28;15841:699;;;16364:113;16381:1;16371:6;:11;16364:113;;;16424:17;:25;16442:6;;;;;;;16424:25;;;;;;;;;;;;16415:34;;16364:113;;;16510:6;16503:13;;;;;;15841:699;15690:869;;15644:915;16587:31;;;;;;;;;;;;;;15497:1129;;;;:::o;36277:105::-;36337:7;36364:10;36357:17;;36277:105;:::o;11757:92::-;11813:7;11757:92;:::o;27534:2515::-;27649:27;27679;27698:7;27679:18;:27::i;:::-;27649:57;;27764:4;27723:45;;27739:19;27723:45;;;27719:86;;27777:28;;;;;;;;;;;;;;27719:86;27818:22;27867:4;27844:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27888:43;27905:4;27911:19;:17;:19::i;:::-;27888:16;:43::i;:::-;27844:87;:147;;;;27972:19;:17;:19::i;:::-;27948:43;;:20;27960:7;27948:11;:20::i;:::-;:43;;;27844:147;27818:174;;28010:17;28005:66;;28036:35;;;;;;;;;;;;;;28005:66;28100:1;28086:16;;:2;:16;;;28082:52;;;28111:23;;;;;;;;;;;;;;28082:52;28147:43;28169:4;28175:2;28179:7;28188:1;28147:21;:43::i;:::-;28263:15;:24;28279:7;28263:24;;;;;;;;;;;;28256:31;;;;;;;;;;;28655:18;:24;28674:4;28655:24;;;;;;;;;;;;;;;;28653:26;;;;;;;;;;;;28724:18;:22;28743:2;28724:22;;;;;;;;;;;;;;;;28722:24;;;;;;;;;;;10250:8;9852:3;29105:15;:41;;29063:21;29081:2;29063:17;:21::i;:::-;:84;:128;29017:17;:26;29035:7;29017:26;;;;;;;;;;;:174;;;;29361:1;10250:8;29311:19;:46;:51;29307:626;;;29383:19;29415:1;29405:7;:11;29383:33;;29572:1;29538:17;:30;29556:11;29538:30;;;;;;;;;;;;:35;29534:384;;;29676:13;;29661:11;:28;29657:242;;29856:19;29823:17;:30;29841:11;29823:30;;;;;;;;;;;:52;;;;29657:242;29534:384;29307:626;;29980:7;29976:2;29961:27;;29970:4;29961:27;;;;;;;;;;;;29999:42;30020:4;30026:2;30030:7;30039:1;29999:20;:42::i;:::-;27534:2515;;;;;:::o;41834:98::-;41887:7;41914:10;41907:17;;41834:98;:::o;39682:190::-;39807:4;39860;39831:25;39844:5;39851:4;39831:12;:25::i;:::-;:33;39824:40;;39682:190;;;;;:::o;22652:104::-;22721:27;22731:2;22735:8;22721:27;;;;;;;;;;;;:9;:27::i;:::-;22652:104;;:::o;44386:191::-;44460:16;44479:6;;;;;;;;;;;44460:25;;44505:8;44496:6;;:17;;;;;;;;;;;;;;;;;;44560:8;44529:40;;44550:8;44529:40;;;;;;;;;;;;44386:191;;:::o;12647:285::-;12694:7;12898:15;:13;:15::i;:::-;12882:13;;:31;12875:38;;12647:285;:::o;33746:716::-;33909:4;33955:2;33930:45;;;33976:19;:17;:19::i;:::-;33997:4;34003:7;34012:5;33930:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33926:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34230:1;34213:6;:13;:18;34209:235;;;34259:40;;;;;;;;;;;;;;34209:235;34402:6;34396:13;34387:6;34383:2;34379:15;34372:38;33926:529;34099:54;;;34089:64;;;:6;:64;;;;34082:71;;;33746:716;;;;;;:::o;46740:101::-;46792:13;46825:8;46818:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46740:101;:::o;36488:1959::-;36545:17;36966:3;36959:4;36953:11;36949:21;36942:28;;37057:3;37051:4;37044:17;37163:3;37620:5;37750:1;37745:3;37741:11;37734:18;;37887:2;37881:4;37877:13;37873:2;37869:22;37864:3;37856:36;37928:2;37922:4;37918:13;37910:21;;37511:682;37947:4;37511:682;;;38122:1;38117:3;38113:11;38106:18;;38173:2;38167:4;38163:13;38159:2;38155:22;38150:3;38142:36;38043:2;38037:4;38033:13;38025:21;;37511:682;;;37515:431;38244:3;38239;38235:13;38359:2;38354:3;38350:12;38343:19;;38422:6;38417:3;38410:19;36584:1856;;;;;:::o;35110:159::-;;;;;:::o;19282:148::-;19346:14;19407:5;19397:15;;19382:41;;;:::o;35928:158::-;;;;;:::o;40233:675::-;40316:7;40336:20;40359:4;40336:27;;40379:9;40374:497;40398:5;:12;40394:1;:16;40374:497;;;40432:20;40455:5;40461:1;40455:8;;;;;;;;;;;;;;;;;;;;;;40432:31;;40498:12;40482;:28;40478:382;;40625:42;40640:12;40654;40625:14;:42::i;:::-;40610:57;;40478:382;;;40802:42;40817:12;40831;40802:14;:42::i;:::-;40787:57;;40478:382;40374:497;40412:3;;;;;:::i;:::-;;;;40374:497;;;;40888:12;40881:19;;;40233:675;;;;:::o;23129:2236::-;23252:20;23275:13;;23252:36;;23317:1;23303:16;;:2;:16;;;23299:48;;;23328:19;;;;;;;;;;;;;;23299:48;23374:1;23362:8;:13;23358:44;;;23384:18;;;;;;;;;;;;;;23358:44;23415:61;23445:1;23449:2;23453:12;23467:8;23415:21;:61::i;:::-;24019:1;9335:2;23990:1;:25;;23989:31;23977:8;:44;23951:18;:22;23970:2;23951:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10115:3;24420:29;24447:1;24435:8;:13;24420:14;:29::i;:::-;:56;;9852:3;24357:15;:41;;24315:21;24333:2;24315:17;:21::i;:::-;:84;:162;24264:17;:31;24282:12;24264:31;;;;;;;;;;;:213;;;;24494:20;24517:12;24494:35;;24544:11;24573:8;24558:12;:23;24544:37;;24620:1;24602:2;:14;;;:19;24598:635;;24642:313;24698:12;24694:2;24673:38;;24690:1;24673:38;;;;;;;;;;;;24739:69;24778:1;24782:2;24786:14;;;;;;24802:5;24739:30;:69::i;:::-;24734:174;;24844:40;;;;;;;;;;;;;;24734:174;24950:3;24935:12;:18;24642:313;;25036:12;25019:13;;:29;25015:43;;25050:8;;;25015:43;24598:635;;;25099:119;25155:14;;;;;;25151:2;25130:40;;25147:1;25130:40;;;;;;;;;;;;25213:3;25198:12;:18;25099:119;;24598:635;25263:12;25247:13;:28;;;;23129:2236;;25297:60;25326:1;25330:2;25334:12;25348:8;25297:20;:60::i;:::-;23129:2236;;;;:::o;40916:224::-;40984:13;41047:1;41041:4;41034:15;41076:1;41070:4;41063:15;41117:4;41111;41101:21;41092:30;;41019:114;;;;:::o;19517:142::-;19575:14;19636:5;19626:15;;19611:41;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;518:367::-;591:8;601:6;651:3;644:4;636:6;632:17;628:27;618:2;;669:1;666;659:12;618:2;705:6;692:20;682:30;;735:18;727:6;724:30;721:2;;;767:1;764;757:12;721:2;804:4;796:6;792:17;780:29;;858:3;850:4;842:6;838:17;828:8;824:32;821:41;818:2;;;875:1;872;865:12;818:2;608:277;;;;;:::o;891:133::-;934:5;972:6;959:20;950:29;;988:30;1012:5;988:30;:::i;:::-;940:84;;;;:::o;1030:139::-;1076:5;1114:6;1101:20;1092:29;;1130:33;1157:5;1130:33;:::i;:::-;1082:87;;;;:::o;1175:137::-;1220:5;1258:6;1245:20;1236:29;;1274:32;1300:5;1274:32;:::i;:::-;1226:86;;;;:::o;1318:141::-;1374:5;1405:6;1399:13;1390:22;;1421:32;1447:5;1421:32;:::i;:::-;1380:79;;;;:::o;1478:271::-;1533:5;1582:3;1575:4;1567:6;1563:17;1559:27;1549:2;;1600:1;1597;1590:12;1549:2;1640:6;1627:20;1665:78;1739:3;1731:6;1724:4;1716:6;1712:17;1665:78;:::i;:::-;1656:87;;1539:210;;;;;:::o;1769:352::-;1827:8;1837:6;1887:3;1880:4;1872:6;1868:17;1864:27;1854:2;;1905:1;1902;1895:12;1854:2;1941:6;1928:20;1918:30;;1971:18;1963:6;1960:30;1957:2;;;2003:1;2000;1993:12;1957:2;2040:4;2032:6;2028:17;2016:29;;2094:3;2086:4;2078:6;2074:17;2064:8;2060:32;2057:41;2054:2;;;2111:1;2108;2101:12;2054:2;1844:277;;;;;:::o;2127:139::-;2173:5;2211:6;2198:20;2189:29;;2227:33;2254:5;2227:33;:::i;:::-;2179:87;;;;:::o;2272:262::-;2331:6;2380:2;2368:9;2359:7;2355:23;2351:32;2348:2;;;2396:1;2393;2386:12;2348:2;2439:1;2464:53;2509:7;2500:6;2489:9;2485:22;2464:53;:::i;:::-;2454:63;;2410:117;2338:196;;;;:::o;2540:407::-;2608:6;2616;2665:2;2653:9;2644:7;2640:23;2636:32;2633:2;;;2681:1;2678;2671:12;2633:2;2724:1;2749:53;2794:7;2785:6;2774:9;2770:22;2749:53;:::i;:::-;2739:63;;2695:117;2851:2;2877:53;2922:7;2913:6;2902:9;2898:22;2877:53;:::i;:::-;2867:63;;2822:118;2623:324;;;;;:::o;2953:552::-;3030:6;3038;3046;3095:2;3083:9;3074:7;3070:23;3066:32;3063:2;;;3111:1;3108;3101:12;3063:2;3154:1;3179:53;3224:7;3215:6;3204:9;3200:22;3179:53;:::i;:::-;3169:63;;3125:117;3281:2;3307:53;3352:7;3343:6;3332:9;3328:22;3307:53;:::i;:::-;3297:63;;3252:118;3409:2;3435:53;3480:7;3471:6;3460:9;3456:22;3435:53;:::i;:::-;3425:63;;3380:118;3053:452;;;;;:::o;3511:809::-;3606:6;3614;3622;3630;3679:3;3667:9;3658:7;3654:23;3650:33;3647:2;;;3696:1;3693;3686:12;3647:2;3739:1;3764:53;3809:7;3800:6;3789:9;3785:22;3764:53;:::i;:::-;3754:63;;3710:117;3866:2;3892:53;3937:7;3928:6;3917:9;3913:22;3892:53;:::i;:::-;3882:63;;3837:118;3994:2;4020:53;4065:7;4056:6;4045:9;4041:22;4020:53;:::i;:::-;4010:63;;3965:118;4150:2;4139:9;4135:18;4122:32;4181:18;4173:6;4170:30;4167:2;;;4213:1;4210;4203:12;4167:2;4241:62;4295:7;4286:6;4275:9;4271:22;4241:62;:::i;:::-;4231:72;;4093:220;3637:683;;;;;;;:::o;4326:401::-;4391:6;4399;4448:2;4436:9;4427:7;4423:23;4419:32;4416:2;;;4464:1;4461;4454:12;4416:2;4507:1;4532:53;4577:7;4568:6;4557:9;4553:22;4532:53;:::i;:::-;4522:63;;4478:117;4634:2;4660:50;4702:7;4693:6;4682:9;4678:22;4660:50;:::i;:::-;4650:60;;4605:115;4406:321;;;;;:::o;4733:407::-;4801:6;4809;4858:2;4846:9;4837:7;4833:23;4829:32;4826:2;;;4874:1;4871;4864:12;4826:2;4917:1;4942:53;4987:7;4978:6;4967:9;4963:22;4942:53;:::i;:::-;4932:63;;4888:117;5044:2;5070:53;5115:7;5106:6;5095:9;5091:22;5070:53;:::i;:::-;5060:63;;5015:118;4816:324;;;;;:::o;5146:425::-;5232:6;5240;5289:2;5277:9;5268:7;5264:23;5260:32;5257:2;;;5305:1;5302;5295:12;5257:2;5376:1;5365:9;5361:17;5348:31;5406:18;5398:6;5395:30;5392:2;;;5438:1;5435;5428:12;5392:2;5474:80;5546:7;5537:6;5526:9;5522:22;5474:80;:::i;:::-;5456:98;;;;5319:245;5247:324;;;;;:::o;5577:256::-;5633:6;5682:2;5670:9;5661:7;5657:23;5653:32;5650:2;;;5698:1;5695;5688:12;5650:2;5741:1;5766:50;5808:7;5799:6;5788:9;5784:22;5766:50;:::i;:::-;5756:60;;5712:114;5640:193;;;;:::o;5839:262::-;5898:6;5947:2;5935:9;5926:7;5922:23;5918:32;5915:2;;;5963:1;5960;5953:12;5915:2;6006:1;6031:53;6076:7;6067:6;6056:9;6052:22;6031:53;:::i;:::-;6021:63;;5977:117;5905:196;;;;:::o;6107:260::-;6165:6;6214:2;6202:9;6193:7;6189:23;6185:32;6182:2;;;6230:1;6227;6220:12;6182:2;6273:1;6298:52;6342:7;6333:6;6322:9;6318:22;6298:52;:::i;:::-;6288:62;;6244:116;6172:195;;;;:::o;6373:282::-;6442:6;6491:2;6479:9;6470:7;6466:23;6462:32;6459:2;;;6507:1;6504;6497:12;6459:2;6550:1;6575:63;6630:7;6621:6;6610:9;6606:22;6575:63;:::i;:::-;6565:73;;6521:127;6449:206;;;;:::o;6661:395::-;6732:6;6740;6789:2;6777:9;6768:7;6764:23;6760:32;6757:2;;;6805:1;6802;6795:12;6757:2;6876:1;6865:9;6861:17;6848:31;6906:18;6898:6;6895:30;6892:2;;;6938:1;6935;6928:12;6892:2;6974:65;7031:7;7022:6;7011:9;7007:22;6974:65;:::i;:::-;6956:83;;;;6819:230;6747:309;;;;;:::o;7062:262::-;7121:6;7170:2;7158:9;7149:7;7145:23;7141:32;7138:2;;;7186:1;7183;7176:12;7138:2;7229:1;7254:53;7299:7;7290:6;7279:9;7275:22;7254:53;:::i;:::-;7244:63;;7200:117;7128:196;;;;:::o;7330:118::-;7417:24;7435:5;7417:24;:::i;:::-;7412:3;7405:37;7395:53;;:::o;7454:157::-;7559:45;7579:24;7597:5;7579:24;:::i;:::-;7559:45;:::i;:::-;7554:3;7547:58;7537:74;;:::o;7617:109::-;7698:21;7713:5;7698:21;:::i;:::-;7693:3;7686:34;7676:50;;:::o;7732:118::-;7819:24;7837:5;7819:24;:::i;:::-;7814:3;7807:37;7797:53;;:::o;7856:360::-;7942:3;7970:38;8002:5;7970:38;:::i;:::-;8024:70;8087:6;8082:3;8024:70;:::i;:::-;8017:77;;8103:52;8148:6;8143:3;8136:4;8129:5;8125:16;8103:52;:::i;:::-;8180:29;8202:6;8180:29;:::i;:::-;8175:3;8171:39;8164:46;;7946:270;;;;;:::o;8222:364::-;8310:3;8338:39;8371:5;8338:39;:::i;:::-;8393:71;8457:6;8452:3;8393:71;:::i;:::-;8386:78;;8473:52;8518:6;8513:3;8506:4;8499:5;8495:16;8473:52;:::i;:::-;8550:29;8572:6;8550:29;:::i;:::-;8545:3;8541:39;8534:46;;8314:272;;;;;:::o;8592:377::-;8698:3;8726:39;8759:5;8726:39;:::i;:::-;8781:89;8863:6;8858:3;8781:89;:::i;:::-;8774:96;;8879:52;8924:6;8919:3;8912:4;8905:5;8901:16;8879:52;:::i;:::-;8956:6;8951:3;8947:16;8940:23;;8702:267;;;;;:::o;8975:366::-;9117:3;9138:67;9202:2;9197:3;9138:67;:::i;:::-;9131:74;;9214:93;9303:3;9214:93;:::i;:::-;9332:2;9327:3;9323:12;9316:19;;9121:220;;;:::o;9347:366::-;9489:3;9510:67;9574:2;9569:3;9510:67;:::i;:::-;9503:74;;9586:93;9675:3;9586:93;:::i;:::-;9704:2;9699:3;9695:12;9688:19;;9493:220;;;:::o;9719:366::-;9861:3;9882:67;9946:2;9941:3;9882:67;:::i;:::-;9875:74;;9958:93;10047:3;9958:93;:::i;:::-;10076:2;10071:3;10067:12;10060:19;;9865:220;;;:::o;10091:398::-;10250:3;10271:83;10352:1;10347:3;10271:83;:::i;:::-;10264:90;;10363:93;10452:3;10363:93;:::i;:::-;10481:1;10476:3;10472:11;10465:18;;10254:235;;;:::o;10495:118::-;10582:24;10600:5;10582:24;:::i;:::-;10577:3;10570:37;10560:53;;:::o;10619:157::-;10724:45;10744:24;10762:5;10744:24;:::i;:::-;10724:45;:::i;:::-;10719:3;10712:58;10702:74;;:::o;10782:397::-;10922:3;10937:75;11008:3;10999:6;10937:75;:::i;:::-;11037:2;11032:3;11028:12;11021:19;;11050:75;11121:3;11112:6;11050:75;:::i;:::-;11150:2;11145:3;11141:12;11134:19;;11170:3;11163:10;;10926:253;;;;;:::o;11185:435::-;11365:3;11387:95;11478:3;11469:6;11387:95;:::i;:::-;11380:102;;11499:95;11590:3;11581:6;11499:95;:::i;:::-;11492:102;;11611:3;11604:10;;11369:251;;;;;:::o;11626:379::-;11810:3;11832:147;11975:3;11832:147;:::i;:::-;11825:154;;11996:3;11989:10;;11814:191;;;:::o;12011:222::-;12104:4;12142:2;12131:9;12127:18;12119:26;;12155:71;12223:1;12212:9;12208:17;12199:6;12155:71;:::i;:::-;12109:124;;;;:::o;12239:640::-;12434:4;12472:3;12461:9;12457:19;12449:27;;12486:71;12554:1;12543:9;12539:17;12530:6;12486:71;:::i;:::-;12567:72;12635:2;12624:9;12620:18;12611:6;12567:72;:::i;:::-;12649;12717:2;12706:9;12702:18;12693:6;12649:72;:::i;:::-;12768:9;12762:4;12758:20;12753:2;12742:9;12738:18;12731:48;12796:76;12867:4;12858:6;12796:76;:::i;:::-;12788:84;;12439:440;;;;;;;:::o;12885:210::-;12972:4;13010:2;12999:9;12995:18;12987:26;;13023:65;13085:1;13074:9;13070:17;13061:6;13023:65;:::i;:::-;12977:118;;;;:::o;13101:222::-;13194:4;13232:2;13221:9;13217:18;13209:26;;13245:71;13313:1;13302:9;13298:17;13289:6;13245:71;:::i;:::-;13199:124;;;;:::o;13329:313::-;13442:4;13480:2;13469:9;13465:18;13457:26;;13529:9;13523:4;13519:20;13515:1;13504:9;13500:17;13493:47;13557:78;13630:4;13621:6;13557:78;:::i;:::-;13549:86;;13447:195;;;;:::o;13648:419::-;13814:4;13852:2;13841:9;13837:18;13829:26;;13901:9;13895:4;13891:20;13887:1;13876:9;13872:17;13865:47;13929:131;14055:4;13929:131;:::i;:::-;13921:139;;13819:248;;;:::o;14073:419::-;14239:4;14277:2;14266:9;14262:18;14254:26;;14326:9;14320:4;14316:20;14312:1;14301:9;14297:17;14290:47;14354:131;14480:4;14354:131;:::i;:::-;14346:139;;14244:248;;;:::o;14498:419::-;14664:4;14702:2;14691:9;14687:18;14679:26;;14751:9;14745:4;14741:20;14737:1;14726:9;14722:17;14715:47;14779:131;14905:4;14779:131;:::i;:::-;14771:139;;14669:248;;;:::o;14923:222::-;15016:4;15054:2;15043:9;15039:18;15031:26;;15067:71;15135:1;15124:9;15120:17;15111:6;15067:71;:::i;:::-;15021:124;;;;:::o;15151:129::-;15185:6;15212:20;;:::i;:::-;15202:30;;15241:33;15269:4;15261:6;15241:33;:::i;:::-;15192:88;;;:::o;15286:75::-;15319:6;15352:2;15346:9;15336:19;;15326:35;:::o;15367:307::-;15428:4;15518:18;15510:6;15507:30;15504:2;;;15540:18;;:::i;:::-;15504:2;15578:29;15600:6;15578:29;:::i;:::-;15570:37;;15662:4;15656;15652:15;15644:23;;15433:241;;;:::o;15680:98::-;15731:6;15765:5;15759:12;15749:22;;15738:40;;;:::o;15784:99::-;15836:6;15870:5;15864:12;15854:22;;15843:40;;;:::o;15889:168::-;15972:11;16006:6;16001:3;15994:19;16046:4;16041:3;16037:14;16022:29;;15984:73;;;;:::o;16063:147::-;16164:11;16201:3;16186:18;;16176:34;;;;:::o;16216:169::-;16300:11;16334:6;16329:3;16322:19;16374:4;16369:3;16365:14;16350:29;;16312:73;;;;:::o;16391:148::-;16493:11;16530:3;16515:18;;16505:34;;;;:::o;16545:305::-;16585:3;16604:20;16622:1;16604:20;:::i;:::-;16599:25;;16638:20;16656:1;16638:20;:::i;:::-;16633:25;;16792:1;16724:66;16720:74;16717:1;16714:81;16711:2;;;16798:18;;:::i;:::-;16711:2;16842:1;16839;16835:9;16828:16;;16589:261;;;;:::o;16856:348::-;16896:7;16919:20;16937:1;16919:20;:::i;:::-;16914:25;;16953:20;16971:1;16953:20;:::i;:::-;16948:25;;17141:1;17073:66;17069:74;17066:1;17063:81;17058:1;17051:9;17044:17;17040:105;17037:2;;;17148:18;;:::i;:::-;17037:2;17196:1;17193;17189:9;17178:20;;16904:300;;;;:::o;17210:191::-;17250:4;17270:20;17288:1;17270:20;:::i;:::-;17265:25;;17304:20;17322:1;17304:20;:::i;:::-;17299:25;;17343:1;17340;17337:8;17334:2;;;17348:18;;:::i;:::-;17334:2;17393:1;17390;17386:9;17378:17;;17255:146;;;;:::o;17407:96::-;17444:7;17473:24;17491:5;17473:24;:::i;:::-;17462:35;;17452:51;;;:::o;17509:90::-;17543:7;17586:5;17579:13;17572:21;17561:32;;17551:48;;;:::o;17605:77::-;17642:7;17671:5;17660:16;;17650:32;;;:::o;17688:149::-;17724:7;17764:66;17757:5;17753:78;17742:89;;17732:105;;;:::o;17843:126::-;17880:7;17920:42;17913:5;17909:54;17898:65;;17888:81;;;:::o;17975:77::-;18012:7;18041:5;18030:16;;18020:32;;;:::o;18058:154::-;18142:6;18137:3;18132;18119:30;18204:1;18195:6;18190:3;18186:16;18179:27;18109:103;;;:::o;18218:307::-;18286:1;18296:113;18310:6;18307:1;18304:13;18296:113;;;18395:1;18390:3;18386:11;18380:18;18376:1;18371:3;18367:11;18360:39;18332:2;18329:1;18325:10;18320:15;;18296:113;;;18427:6;18424:1;18421:13;18418:2;;;18507:1;18498:6;18493:3;18489:16;18482:27;18418:2;18267:258;;;;:::o;18531:320::-;18575:6;18612:1;18606:4;18602:12;18592:22;;18659:1;18653:4;18649:12;18680:18;18670:2;;18736:4;18728:6;18724:17;18714:27;;18670:2;18798;18790:6;18787:14;18767:18;18764:38;18761:2;;;18817:18;;:::i;:::-;18761:2;18582:269;;;;:::o;18857:281::-;18940:27;18962:4;18940:27;:::i;:::-;18932:6;18928:40;19070:6;19058:10;19055:22;19034:18;19022:10;19019:34;19016:62;19013:2;;;19081:18;;:::i;:::-;19013:2;19121:10;19117:2;19110:22;18900:238;;;:::o;19144:233::-;19183:3;19206:24;19224:5;19206:24;:::i;:::-;19197:33;;19252:66;19245:5;19242:77;19239:2;;;19322:18;;:::i;:::-;19239:2;19369:1;19362:5;19358:13;19351:20;;19187:190;;;:::o;19383:100::-;19422:7;19451:26;19471:5;19451:26;:::i;:::-;19440:37;;19430:53;;;:::o;19489:94::-;19528:7;19557:20;19571:5;19557:20;:::i;:::-;19546:31;;19536:47;;;:::o;19589:79::-;19628:7;19657:5;19646:16;;19636:32;;;:::o;19674:180::-;19722:77;19719:1;19712:88;19819:4;19816:1;19809:15;19843:4;19840:1;19833:15;19860:180;19908:77;19905:1;19898:88;20005:4;20002:1;19995:15;20029:4;20026:1;20019:15;20046:180;20094:77;20091:1;20084:88;20191:4;20188:1;20181:15;20215:4;20212:1;20205:15;20232:102;20273:6;20324:2;20320:7;20315:2;20308:5;20304:14;20300:28;20290:38;;20280:54;;;:::o;20340:94::-;20373:8;20421:5;20417:2;20413:14;20392:35;;20382:52;;;:::o;20440:170::-;20580:22;20576:1;20568:6;20564:14;20557:46;20546:64;:::o;20616:225::-;20756:34;20752:1;20744:6;20740:14;20733:58;20825:8;20820:2;20812:6;20808:15;20801:33;20722:119;:::o;20847:182::-;20987:34;20983:1;20975:6;20971:14;20964:58;20953:76;:::o;21035:114::-;21141:8;:::o;21155:122::-;21228:24;21246:5;21228:24;:::i;:::-;21221:5;21218:35;21208:2;;21267:1;21264;21257:12;21208:2;21198:79;:::o;21283:116::-;21353:21;21368:5;21353:21;:::i;:::-;21346:5;21343:32;21333:2;;21389:1;21386;21379:12;21333:2;21323:76;:::o;21405:122::-;21478:24;21496:5;21478:24;:::i;:::-;21471:5;21468:35;21458:2;;21517:1;21514;21507:12;21458:2;21448:79;:::o;21533:120::-;21605:23;21622:5;21605:23;:::i;:::-;21598:5;21595:34;21585:2;;21643:1;21640;21633:12;21585:2;21575:78;:::o;21659:122::-;21732:24;21750:5;21732:24;:::i;:::-;21725:5;21722:35;21712:2;;21771:1;21768;21761:12;21712:2;21702:79;:::o

Swarm Source

ipfs://551a6125546d7b37bc2d3bda0db42c38f852c7dbafabdbe0916df00f787de821
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.