ETH Price: $3,411.07 (+1.68%)

Token

NoNo from SEER (NONO)
 

Overview

Max Total Supply

1,500 NONO

Holders

854

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 NONO
0x8e3cc18e0d6a71d397d630bc14a80f4aba1e792e
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:
NONO

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
constantinople EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

// Sources flattened with hardhat v2.8.3 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/extensions/[email protected]

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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] 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 erc721a/contracts/extensions/[email protected]


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

pragma solidity ^0.8.4;


/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}


// 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/NONO.sol




pragma solidity ^0.8.4;


contract NONO is ERC721A, ERC721AQueryable, Ownable {

    modifier onlyCores {
        require(isCore[msg.sender], "cores only");
        _;
    }

    bool public revealed;
    bool public start;
    uint256 public preMintPeriod;
    uint256 public alistMintPeriod;

    uint256 public startAt;
    string private baseURI_;
    string private preRevealURI_;

    address public collabManager;
    address[] public cores;
    address[] public devs;
    address[] public alist;
    address[] public whitelist;
    mapping(address => bool) public isWhitelisted;
    mapping(address => bool) public isCore;
    mapping(address => bool) public isAlist;
    mapping(address => bool) public isDev;

    uint256 public mintLimit;
    uint256 public whitelistMintLimit;
    uint256 public alistMintLimit;
    uint256 public devMintLimit;
    uint256 public collabMintLimit;
    uint256 public coreMintLimit;
    mapping(address => uint256) public mintCount;
    mapping(address => uint256) public alistMintCount;
    mapping(address => uint256) public whitelistMintCount;
    mapping(address => uint256) public devMintCount;
    mapping(address => uint256) public collabMintCount;
    mapping(address => uint256) public coreMintCount;


    uint256 public PRICE;
    uint256 public MAX_SUPPLY;

    constructor(
        string memory name,
        string memory symbol,
        string memory uri, 
        string memory preUri, 
        uint256 mintPrice, 
        uint256 maxSupply
    ) ERC721A(name, symbol) {
        baseURI_ = uri;
        preRevealURI_ = preUri;
        PRICE = mintPrice;
        MAX_SUPPLY = maxSupply;
        
        alistMintPeriod = 4 hours;
        preMintPeriod = 24 hours;
    }

    function reveal() external onlyOwner {
        revealed = true;
    }

    function baseURI() public view returns(string memory) {
        if(revealed) {
            return baseURI_;
        } else {
            return preRevealURI_;
        }
    }

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

        string memory base = baseURI();
        return revealed ? string(abi.encodePacked(base, _toString(tokenId))) : base;
    }

    function setAlistMintPeriod(uint256 timePeriod) external onlyOwner {
        alistMintPeriod = timePeriod;
    }

    function setPreMintPeriod(uint256 timePeriod) external onlyOwner {
        preMintPeriod = timePeriod;
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI_ = uri;
    }

    function setPreRevealURI(string memory uri) external onlyOwner {
        preRevealURI_ = uri;
    }

    function setPrice(uint256 _price) external onlyOwner {
        require(_price > 0, "zero price");
        PRICE = _price;
    }

    function setMaxSupply(uint256 supply) external onlyOwner {
        require(supply >= totalSupply(), "cannot lower than current supply");
        MAX_SUPPLY = supply;
    }

    function starts() external onlyOwner {
        start = true;
        startAt = block.timestamp;
    }

    function setMintLimit(uint256 _mintLimit) external onlyOwner {
        mintLimit = _mintLimit;
    }

    function setWhitelistMintLimit(uint256 _whitelistMintLimit) external onlyOwner {
        whitelistMintLimit = _whitelistMintLimit;
    }

    function setAlistMintLimit(uint256 _alistMintLimit) external onlyOwner {
        alistMintLimit = _alistMintLimit;
    }

    function setDevMintLimit(uint256 _devMintLimit) external onlyOwner {
        devMintLimit = _devMintLimit;
    }

    function setCollabMintLimit(uint256 _collabMintLimit) external onlyOwner {
        collabMintLimit = _collabMintLimit;
    }

    function setCoreMintLimit(uint256 _corebMintLimit) external onlyOwner {
        coreMintLimit = _corebMintLimit;
    }

    function setCores(address[] memory _cores) external onlyOwner {
        cores = _cores;
        for(uint256 i = 0; i < _cores.length; i++) {
            isCore[_cores[i]] = true;
        }
    }

    function setDevs(address[] memory _devs) external onlyOwner {
        require(_devs.length > 0, "zero length");

        devs = _devs;
        for(uint256 i; i < _devs.length; i++) {
            isDev[_devs[i]] = true;
        }
    }

    function setAlist(address[] memory _alist) external onlyOwner {
        require(_alist.length > 0, "zero length");

        alist = _alist;
        for(uint256 i; i < _alist.length; i++) {
            isAlist[_alist[i]] = true;
        }
    }

   function setCollab(address _collab) external onlyOwner {
        require(_collab != address(0), "zero length");

        collabManager = _collab;
    }

    function setWhitelist(address[] memory _whitelist) external onlyOwner {
        require(_whitelist.length > 0, "zero length");

        whitelist = _whitelist;
        for(uint256 i; i < _whitelist.length; i++) {
            isWhitelisted[_whitelist[i]] = true;
        }
    }

    function drop(address at, uint256 quantity) external onlyOwner {
        require(totalSupply()+quantity <= MAX_SUPPLY, "max supply reached");
        _safeMint(at, quantity);
    }

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

    function burn(uint256 tokenId) external onlyOwner {
        _burn(tokenId);
    }

    function mint(uint256 quantity) external payable {
        require(start, "sale not start");
        require(quantity > 0, "zero quantity");
        require(totalSupply() + quantity <= MAX_SUPPLY, "max supply reached");
        
        bool haveRole;
        uint256 mintSize;
        if(isDev[msg.sender] && block.timestamp > startAt + alistMintPeriod + preMintPeriod) {
            require(devMintCount[msg.sender] + mintCount[msg.sender] + quantity <= devMintLimit + mintLimit, "mint limit reached");
            
            haveRole = true;

            uint256 devSize = quantity + devMintCount[msg.sender] <= devMintLimit
            ? quantity
            : devMintLimit - devMintCount[msg.sender];

            mintSize = quantity - devSize;

            devMintCount[msg.sender] += devSize;
            if(devSize > 0) {
                alistMint(msg.sender, devSize, 0);
            }
        }
        if(collabManager == msg.sender) {
            require(collabMintCount[msg.sender] + mintCount[msg.sender] < mintLimit + collabMintLimit, "mint limit reached");

            haveRole = true;

            uint256 collabSize = quantity + collabMintCount[msg.sender] <= collabMintLimit
            ? quantity
            : collabMintLimit - collabMintCount[msg.sender];

            mintSize = quantity - collabSize;
            
            if(collabSize > 0) {
                alistMint(msg.sender, collabSize, 2);
            }
        }
        if(isAlist[msg.sender]) {
            require(alistMintCount[msg.sender] + mintCount[msg.sender] < mintLimit + alistMintLimit, "free mint limit reached");
            
            haveRole = true;

            uint256 alistSize = quantity + alistMintCount[msg.sender] <= alistMintLimit
            ? quantity
            : alistMintLimit - alistMintCount[msg.sender];

            mintSize = quantity - alistSize;

            if(alistSize > 0) {
                alistMint(msg.sender, alistSize, 1);
            }
        }

        // premint
        if(isWhitelisted[msg.sender]) {
            if (block.timestamp > startAt + alistMintPeriod && block.timestamp <= startAt + alistMintPeriod + preMintPeriod) {
                require(whitelistMintCount[msg.sender] + quantity <= whitelistMintLimit, "whitelist mint limit reached");
                require(msg.value >= quantity * PRICE, "value too low");

                whitelistMintCount[msg.sender] += quantity;
                _safeMint(msg.sender, quantity);
                return;
            }
        }
        
        
        if(!haveRole) {
            require(mintCount[msg.sender] + quantity <= mintLimit, "public mint limit reached");            
            mintSize = quantity;
        } else {
            require(mintCount[msg.sender] + mintSize <= mintLimit, "public mint limit reached");
        }


        if(mintSize > 0) {
            if(block.timestamp > startAt + alistMintPeriod) {
                require(msg.value >= mintSize * PRICE, "value too low");
                mintCount[msg.sender] += mintSize;
                _safeMint(msg.sender, mintSize);
            } else {
                revert("public mint not start");
            }
        }
    }

    function coreRewards(uint256 quantity) external onlyCores {
        require(coreMintCount[msg.sender] + quantity <= coreMintLimit, "core limit reeached");
        coreMintCount[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);
    }

    function alistMint(address to, uint256 quantity, uint256 role) internal {
        if(role == 1) {
            alistMintCount[msg.sender] += quantity;
        } else if(role == 2) {
            collabMintCount[msg.sender] += quantity;
        } else {
            devMintCount[msg.sender] += quantity;
        }

        _safeMint(to, quantity);
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"preUri","type":"string"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"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":"InvalidQueryRange","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":"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":"uint256","name":"","type":"uint256"}],"name":"alist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alistMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alistMintPeriod","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collabManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collabMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collabMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"coreMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coreMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"coreRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cores","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"devs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"at","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"drop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"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":"isAlist","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":[{"internalType":"address","name":"","type":"address"}],"name":"isCore","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDev","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMintPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_alist","type":"address[]"}],"name":"setAlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_alistMintLimit","type":"uint256"}],"name":"setAlistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timePeriod","type":"uint256"}],"name":"setAlistMintPeriod","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collab","type":"address"}],"name":"setCollab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collabMintLimit","type":"uint256"}],"name":"setCollabMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_corebMintLimit","type":"uint256"}],"name":"setCoreMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_cores","type":"address[]"}],"name":"setCores","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devMintLimit","type":"uint256"}],"name":"setDevMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_devs","type":"address[]"}],"name":"setDevs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timePeriod","type":"uint256"}],"name":"setPreMintPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPreRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistMintLimit","type":"uint256"}],"name":"setWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"starts","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162003b2f38038062003b2f83398101604081905262000034916200026c565b8551869086906200004d90600290602085019062000113565b5080516200006390600390602084019062000113565b505060008055506200007533620000c1565b83516200008a90600c90602087019062000113565b508251620000a090600d90602086019062000113565b506023919091556024555050613840600a55505062015180600955620003b7565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001219062000332565b90600052602060002090601f01602090048101928262000145576000855562000190565b82601f106200016057805160ff191683800117855562000190565b8280016001018555821562000190579182015b828111156200019057825182559160200191906001019062000173565b506200019e929150620001a2565b5090565b5b808211156200019e5760008155600101620001a3565b600082601f830112620001ca578081fd5b81516001600160401b0380821115620001e757620001e762000388565b604051601f8301601f19908116603f0116810190828211818310171562000212576200021262000388565b816040528381526020925086838588010111156200022e578485fd5b8491505b8382101562000251578582018301518183018401529082019062000232565b838211156200026257848385830101525b9695505050505050565b60008060008060008060c0878903121562000285578182fd5b86516001600160401b03808211156200029c578384fd5b620002aa8a838b01620001b9565b97506020890151915080821115620002c0578384fd5b620002ce8a838b01620001b9565b96506040890151915080821115620002e4578384fd5b620002f28a838b01620001b9565b9550606089015191508082111562000308578384fd5b506200031789828a01620001b9565b9350506080870151915060a087015190509295509295509295565b600181811c908216806200034757607f821691505b6020821081141562000382577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61376880620003c76000396000f3fe6080604052600436106104355760003560e01c806370a08231116102295780639e6a1d7d1161012e578063c23dc68f116100b6578063e985e9c51161007a578063e985e9c514610cf7578063ed9ec88814610d17578063ede5a96d14610d44578063f2fde38b14610d70578063f421764814610d9057600080fd5b8063c23dc68f14610c5e578063c744656514610c8b578063c87b56dd14610ca1578063ca13229e14610cc1578063ddd1783a14610ce157600080fd5b8063ae941890116100fd578063ae94189014610bad578063b67f94ba14610bcd578063b6c912fc14610bed578063b88d4fde14610c1d578063be9a655514610c3d57600080fd5b80639e6a1d7d14610b45578063a0712d6814610b65578063a22cb46514610b78578063a475b5dd14610b9857600080fd5b80638d859f3e116101b157806391ca3bb51161018057806391ca3bb514610acf57806395d89b4114610ae4578063996517cf14610af957806399a2557a14610b0f5780639afb583014610b2f57600080fd5b80638d859f3e14610a5b5780638da5cb5b14610a715780638de48c0b14610a8f57806391b7f5ed14610aaf57600080fd5b80637ebd1b30116101f85780637ebd1b30146109b85780638462151c146109d85780638936bc1114610a055780638c59314f14610a1b5780638d0f8cef14610a3b57600080fd5b806370a0823114610926578063715018a614610946578063740090b41461095b5780637b2e5c371461098857600080fd5b8063381b965c1161033a57806351830227116102c25780635eeacb5f116102865780635eeacb5f146108915780636352211e146108b157806369e1fd3a146108d15780636c0360eb146108f15780636f8b44b01461090657600080fd5b806351830227146107ed57806353e911af1461080e57806355f804b31461082e5780635755294c1461084e5780635bbb21771461086457600080fd5b80633fe9cbed116103095780633fe9cbed1461074057806341626a6f1461076057806342842e0e1461078d57806342966c68146107ad578063475aa7a7146107cd57600080fd5b8063381b965c146106ae5780633af32abf146106ce5780633bdf4ac6146106fe5780633ccfd60b1461072b57600080fd5b806311264cf3116103bd57806326b6b7b71161038c57806326b6b7b71461060b5780632a85db55146106385780633132eb911461065857806332cb6b0c14610678578063369b012d1461068e57600080fd5b806311264cf31461059c57806315011a28146105b257806318160ddd146105d257806323b872dd146105eb57600080fd5b8063081812fc11610404578063081812fc146104f4578063091bd95314610514578063095ea7b3146105365780630c3f64bf146105565780630d1482d61461058657600080fd5b806301ffc9a714610441578063046ac3c81461047657806304d5e0e51461049a57806306fdde03146104d257600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b5061046161045c36600461333c565b610db0565b60405190151581526020015b60405180910390f35b34801561048257600080fd5b5061048c60195481565b60405190815260200161046d565b3480156104a657600080fd5b506104ba6104b53660046133b9565b610e02565b6040516001600160a01b03909116815260200161046d565b3480156104de57600080fd5b506104e7610e2c565b60405161046d919061350b565b34801561050057600080fd5b506104ba61050f3660046133b9565b610ebe565b34801561052057600080fd5b5061053461052f3660046133b9565b610f02565b005b34801561054257600080fd5b506105346105513660046131bd565b610f3a565b34801561056257600080fd5b50610461610571366004613084565b60166020526000908152604090205460ff1681565b34801561059257600080fd5b5061048c601c5481565b3480156105a857600080fd5b5061048c60095481565b3480156105be57600080fd5b506105346105cd3660046133b9565b61100d565b3480156105de57600080fd5b506001546000540361048c565b3480156105f757600080fd5b506105346106063660046130d0565b61103c565b34801561061757600080fd5b5061048c610626366004613084565b601e6020526000908152604090205481565b34801561064457600080fd5b50610534610653366004613374565b61104c565b34801561066457600080fd5b50610534610673366004613218565b61108d565b34801561068457600080fd5b5061048c60245481565b34801561069a57600080fd5b506105346106a9366004613084565b611141565b3480156106ba57600080fd5b506105346106c93660046133b9565b6111b3565b3480156106da57600080fd5b506104616106e9366004613084565b60136020526000908152604090205460ff1681565b34801561070a57600080fd5b5061048c610719366004613084565b601f6020526000908152604090205481565b34801561073757600080fd5b506105346111e2565b34801561074c57600080fd5b5061053461075b3660046133b9565b611253565b34801561076c57600080fd5b5061048c61077b366004613084565b60216020526000908152604090205481565b34801561079957600080fd5b506105346107a83660046130d0565b611282565b3480156107b957600080fd5b506105346107c83660046133b9565b61129d565b3480156107d957600080fd5b506105346107e83660046133b9565b6112d0565b3480156107f957600080fd5b5060085461046190600160a01b900460ff1681565b34801561081a57600080fd5b50610534610829366004613218565b6112ff565b34801561083a57600080fd5b50610534610849366004613374565b6113d4565b34801561085a57600080fd5b5061048c601a5481565b34801561087057600080fd5b5061088461087f3660046132b6565b611411565b60405161046d9190613469565b34801561089d57600080fd5b506104ba6108ac3660046133b9565b611501565b3480156108bd57600080fd5b506104ba6108cc3660046133b9565b611511565b3480156108dd57600080fd5b506104ba6108ec3660046133b9565b61151c565b3480156108fd57600080fd5b506104e761152c565b34801561091257600080fd5b506105346109213660046133b9565b61155b565b34801561093257600080fd5b5061048c610941366004613084565b6115e0565b34801561095257600080fd5b5061053461162e565b34801561096757600080fd5b5061048c610976366004613084565b60226020526000908152604090205481565b34801561099457600080fd5b506104616109a3366004613084565b60156020526000908152604090205460ff1681565b3480156109c457600080fd5b506104ba6109d33660046133b9565b611664565b3480156109e457600080fd5b506109f86109f3366004613084565b611674565b60405161046d91906134d3565b348015610a1157600080fd5b5061048c600a5481565b348015610a2757600080fd5b50610534610a36366004613218565b611798565b348015610a4757600080fd5b50610534610a563660046131bd565b61186d565b348015610a6757600080fd5b5061048c60235481565b348015610a7d57600080fd5b506008546001600160a01b03166104ba565b348015610a9b57600080fd5b50600e546104ba906001600160a01b031681565b348015610abb57600080fd5b50610534610aca3660046133b9565b6118ff565b348015610adb57600080fd5b5061053461196b565b348015610af057600080fd5b506104e76119ae565b348015610b0557600080fd5b5061048c60175481565b348015610b1b57600080fd5b506109f8610b2a3660046131e6565b6119bd565b348015610b3b57600080fd5b5061048c601b5481565b348015610b5157600080fd5b50610534610b603660046133b9565b611b56565b610534610b733660046133b9565b611b85565b348015610b8457600080fd5b50610534610b93366004613183565b6122bc565b348015610ba457600080fd5b50610534612352565b348015610bb957600080fd5b50610534610bc83660046133b9565b612391565b348015610bd957600080fd5b50610534610be83660046133b9565b61246e565b348015610bf957600080fd5b50610461610c08366004613084565b60146020526000908152604090205460ff1681565b348015610c2957600080fd5b50610534610c3836600461310b565b61249d565b348015610c4957600080fd5b5060085461046190600160a81b900460ff1681565b348015610c6a57600080fd5b50610c7e610c793660046133b9565b6124e7565b60405161046d9190613578565b348015610c9757600080fd5b5061048c600b5481565b348015610cad57600080fd5b506104e7610cbc3660046133b9565b612550565b348015610ccd57600080fd5b50610534610cdc3660046133b9565b6125cd565b348015610ced57600080fd5b5061048c60185481565b348015610d0357600080fd5b50610461610d1236600461309e565b6125fc565b348015610d2357600080fd5b5061048c610d32366004613084565b601d6020526000908152604090205481565b348015610d5057600080fd5b5061048c610d5f366004613084565b602080526000908152604090205481565b348015610d7c57600080fd5b50610534610d8b366004613084565b61262a565b348015610d9c57600080fd5b50610534610dab366004613218565b6126c2565b60006301ffc9a760e01b6001600160e01b031983161480610de157506380ac58cd60e01b6001600160e01b03198316145b80610dfc5750635b5e139f60e01b6001600160e01b03198316145b92915050565b600f8181548110610e1257600080fd5b6000918252602090912001546001600160a01b0316905081565b606060028054610e3b9061367a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e679061367a565b8015610eb45780601f10610e8957610100808354040283529160200191610eb4565b820191906000526020600020905b815481529060010190602001808311610e9757829003601f168201915b5050505050905090565b6000610ec982612797565b610ee6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6008546001600160a01b03163314610f355760405162461bcd60e51b8152600401610f2c90613543565b60405180910390fd5b600a55565b6000610f45826127be565b9050806001600160a01b0316836001600160a01b03161415610f7a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610fb157610f9481336125fc565b610fb1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146110375760405162461bcd60e51b8152600401610f2c90613543565b601a55565b61104783838361281f565b505050565b6008546001600160a01b031633146110765760405162461bcd60e51b8152600401610f2c90613543565b805161108990600d906020840190612f23565b5050565b6008546001600160a01b031633146110b75760405162461bcd60e51b8152600401610f2c90613543565b80516110ca90600f906020840190612fa7565b5060005b8151811015611089576001601460008484815181106110fd57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611139816136b5565b9150506110ce565b6008546001600160a01b0316331461116b5760405162461bcd60e51b8152600401610f2c90613543565b6001600160a01b0381166111915760405162461bcd60e51b8152600401610f2c9061351e565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610f2c90613543565b601855565b6008546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610f2c90613543565b6008546001600160a01b03166040516001600160a01b039190911690303180156108fc02916000818181858888f19350505050158015611250573d6000803e3d6000fd5b50565b6008546001600160a01b0316331461127d5760405162461bcd60e51b8152600401610f2c90613543565b600955565b6110478383836040518060200160405280600081525061249d565b6008546001600160a01b031633146112c75760405162461bcd60e51b8152600401610f2c90613543565b611250816129b0565b6008546001600160a01b031633146112fa5760405162461bcd60e51b8152600401610f2c90613543565b601c55565b6008546001600160a01b031633146113295760405162461bcd60e51b8152600401610f2c90613543565b600081511161134a5760405162461bcd60e51b8152600401610f2c9061351e565b805161135d906011906020840190612fa7565b5060005b81518110156110895760016015600084848151811061139057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113cc816136b5565b915050611361565b6008546001600160a01b031633146113fe5760405162461bcd60e51b8152600401610f2c90613543565b805161108990600c906020840190612f23565b80516060906000816001600160401b0381111561143e57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561148957816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161145c5790505b50905060005b8281146114f9576114c68582815181106114b957634e487b7160e01b600052603260045260246000fd5b60200260200101516124e7565b8282815181106114e657634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161148f565b509392505050565b60108181548110610e1257600080fd5b6000610dfc826127be565b60118181548110610e1257600080fd5b600854606090600160a01b900460ff161561154e57600c8054610e3b9061367a565b600d8054610e3b9061367a565b6008546001600160a01b031633146115855760405162461bcd60e51b8152600401610f2c90613543565b600154600054038110156115db5760405162461bcd60e51b815260206004820181905260248201527f63616e6e6f74206c6f776572207468616e2063757272656e7420737570706c796044820152606401610f2c565b602455565b60006001600160a01b038216611609576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146116585760405162461bcd60e51b8152600401610f2c90613543565b61166260006129bb565b565b60128181548110610e1257600080fd5b60606000806000611684856115e0565b90506000816001600160401b038111156116ae57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156116d7578160200160208202803683370190505b5090506116fd604080516060810182526000808252602082018190529181019190915290565b60005b83861461178c5761171081612a0d565b915081604001511561172157611784565b81516001600160a01b03161561173657815194505b876001600160a01b0316856001600160a01b03161415611784578083878060010198508151811061177757634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611700565b50909695505050505050565b6008546001600160a01b031633146117c25760405162461bcd60e51b8152600401610f2c90613543565b60008151116117e35760405162461bcd60e51b8152600401610f2c9061351e565b80516117f6906010906020840190612fa7565b5060005b81518110156110895760016016600084848151811061182957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611865816136b5565b9150506117fa565b6008546001600160a01b031633146118975760405162461bcd60e51b8152600401610f2c90613543565b602454816118a86001546000540390565b6118b29190613600565b11156118f55760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610f2c565b6110898282612a42565b6008546001600160a01b031633146119295760405162461bcd60e51b8152600401610f2c90613543565b600081116119665760405162461bcd60e51b815260206004820152600a6024820152697a65726f20707269636560b01b6044820152606401610f2c565b602355565b6008546001600160a01b031633146119955760405162461bcd60e51b8152600401610f2c90613543565b6008805460ff60a81b1916600160a81b17905542600b55565b606060038054610e3b9061367a565b60608183106119df57604051631960ccad60e11b815260040160405180910390fd5b6000806119eb60005490565b9050808411156119f9578093505b6000611a04876115e0565b905084861015611a235785850381811015611a1d578091505b50611a27565b5060005b6000816001600160401b03811115611a4f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905081611a8b579350611b4f92505050565b6000611a96886124e7565b905060008160400151611aa7575080515b885b888114158015611ab95750848714155b15611b4357611ac781612a0d565b9250826040015115611ad857611b3b565b82516001600160a01b031615611aed57825191505b8a6001600160a01b0316826001600160a01b03161415611b3b5780848880600101995081518110611b2e57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611aa9565b50505092835250909150505b9392505050565b6008546001600160a01b03163314611b805760405162461bcd60e51b8152600401610f2c90613543565b601755565b600854600160a81b900460ff16611bcf5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081cdd185c9d60921b6044820152606401610f2c565b60008111611c0f5760405162461bcd60e51b815260206004820152600d60248201526c7a65726f207175616e7469747960981b6044820152606401610f2c565b60245481611c206001546000540390565b611c2a9190613600565b1115611c6d5760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610f2c565b33600090815260166020526040812054819060ff168015611ca95750600954600a54600b54611c9c9190613600565b611ca69190613600565b42115b15611dc457601754601a54611cbe9190613600565b336000908152601d6020908152604080832054918052909120548591611ce391613600565b611ced9190613600565b1115611d305760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b6044820152606401610f2c565b601a5433600090815260208052604081205460019450909190611d539086613600565b1115611d7a57336000908152602080526040902054601a54611d759190613637565b611d7c565b835b9050611d888185613637565b336000908152602080526040812080549294508392909190611dab908490613600565b90915550508015611dc257611dc233826000612a5c565b505b600e546001600160a01b0316331415611ebf57601b54601754611de79190613600565b336000908152601d6020908152604080832054602190925290912054611e0d9190613600565b10611e4f5760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b6044820152606401610f2c565b601b543360009081526021602052604081205460019450909190611e739086613600565b1115611e9b5733600090815260216020526040902054601b54611e969190613637565b611e9d565b835b9050611ea98185613637565b91508015611ebd57611ebd33826002612a5c565b505b3360009081526015602052604090205460ff1615611fca57601954601754611ee79190613600565b336000908152601d6020908152604080832054601e90925290912054611f0d9190613600565b10611f5a5760405162461bcd60e51b815260206004820152601760248201527f66726565206d696e74206c696d697420726561636865640000000000000000006044820152606401610f2c565b601954336000908152601e602052604081205460019450909190611f7e9086613600565b1115611fa657336000908152601e6020526040902054601954611fa19190613637565b611fa8565b835b9050611fb48185613637565b91508015611fc857611fc833826001612a5c565b505b3360009081526013602052604090205460ff161561210857600a54600b54611ff29190613600565b4211801561201c5750600954600a54600b5461200e9190613600565b6120189190613600565b4211155b1561210857601854336000908152601f602052604090205461203f908590613600565b111561208d5760405162461bcd60e51b815260206004820152601c60248201527f77686974656c697374206d696e74206c696d69742072656163686564000000006044820152606401610f2c565b60235461209a9084613618565b3410156120d95760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b6044820152606401610f2c565b336000908152601f6020526040812080548592906120f8908490613600565b9091555061104790503384612a42565b8161217c57601754336000908152601d602052604090205461212b908590613600565b11156121755760405162461bcd60e51b81526020600482015260196024820152781c1d589b1a58c81b5a5b9d081b1a5b5a5d081c995858da1959603a1b6044820152606401610f2c565b50816121e4565b601754336000908152601d602052604090205461219a908390613600565b11156121e45760405162461bcd60e51b81526020600482015260196024820152781c1d589b1a58c81b5a5b9d081b1a5b5a5d081c995858da1959603a1b6044820152606401610f2c565b801561104757600a54600b546121fa9190613600565b42111561227c5760235461220e9082613618565b34101561224d5760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b6044820152606401610f2c565b336000908152601d60205260408120805483929061226c908490613600565b9091555061104790503382612a42565b60405162461bcd60e51b81526020600482015260156024820152741c1d589b1a58c81b5a5b9d081b9bdd081cdd185c9d605a1b6044820152606401610f2c565b6001600160a01b0382163314156122e65760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461237c5760405162461bcd60e51b8152600401610f2c90613543565b6008805460ff60a01b1916600160a01b179055565b3360009081526014602052604090205460ff166123dd5760405162461bcd60e51b815260206004820152600a602482015269636f726573206f6e6c7960b01b6044820152606401610f2c565b601c54336000908152602260205260409020546123fb908390613600565b111561243f5760405162461bcd60e51b815260206004820152601360248201527218dbdc99481b1a5b5a5d081c99595858da1959606a1b6044820152606401610f2c565b336000908152602260205260408120805483929061245e908490613600565b9091555061125090503382612a42565b6008546001600160a01b031633146124985760405162461bcd60e51b8152600401610f2c90613543565b601955565b6124a884848461281f565b6001600160a01b0383163b156124e1576124c484848484612ae5565b6124e1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101839052909150600054831061252c5792915050565b61253583612a0d565b90508060400151156125475792915050565b611b4f83612bdd565b606061255b82612797565b61257857604051630a14c4b560e41b815260040160405180910390fd5b600061258261152c565b600854909150600160a01b900460ff1661259c5780611b4f565b806125a684612c0b565b6040516020016125b79291906133fd565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146125f75760405162461bcd60e51b8152600401610f2c90613543565b601b55565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146126545760405162461bcd60e51b8152600401610f2c90613543565b6001600160a01b0381166126b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f2c565b611250816129bb565b6008546001600160a01b031633146126ec5760405162461bcd60e51b8152600401610f2c90613543565b600081511161270d5760405162461bcd60e51b8152600401610f2c9061351e565b8051612720906012906020840190612fa7565b5060005b81518110156110895760016013600084848151811061275357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061278f816136b5565b915050612724565b6000805482108015610dfc575050600090815260046020526040902054600160e01b161590565b60008160005481101561280657600081815260046020526040902054600160e01b8116612804575b80611b4f5750600019016000818152600460205260409020546127e6565b505b604051636f96cda160e11b815260040160405180910390fd5b600061282a826127be565b9050836001600160a01b0316816001600160a01b03161461285d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061287b575061287b85336125fc565b8061289657503361288b84610ebe565b6001600160a01b0316145b9050806128b657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166128dd57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b86178117909155821661297a57600183016000818152600460205260409020546129785760005481146129785760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061371383398151915260405160405180910390a45050505050565b611250816000612c5a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160608101825260008082526020820181905291810191909152600082815260046020526040902054610dfc90612d9c565b611089828260405180602001604052806000815250612dd6565b8060011415612a8f57336000908152601e602052604081208054849290612a84908490613600565b90915550612adb9050565b8060021415612ab7573360009081526021602052604081208054849290612a84908490613600565b33600090815260208052604081208054849290612ad5908490613600565b90915550505b6110478383612a42565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b1a90339089908890889060040161342c565b602060405180830381600087803b158015612b3457600080fd5b505af1925050508015612b64575060408051601f3d908101601f19168201909252612b6191810190613358565b60015b612bbf573d808015612b92576040519150601f19603f3d011682016040523d82523d6000602084013e612b97565b606091505b508051612bb7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160608101825260008082526020820181905291810191909152610dfc612c06836127be565b612d9c565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c4857600183039250600a81066030018353600a9004612c2a565b50819003601f19909101908152919050565b6000612c65836127be565b9050808215612cc9576000336001600160a01b0383161480612c8c5750612c8c82336125fc565b80612ca7575033612c9c86610ebe565b6001600160a01b0316145b905080612cc757604051632ce44b5f60e11b815260040160405180910390fd5b505b600084815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005825280832080546fffffffffffffffffffffffffffffffff01905586835260049091529020600360e01b4260a01b8317179055600160e11b8216612d685760018401600081815260046020526040902054612d66576000548114612d665760008181526004602052604090208390555b505b60405184906000906001600160a01b03841690600080516020613713833981519152908390a4505060018054810190555050565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b038416612dff57604051622e076360e81b815260040160405180910390fd5b82612e1d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612ee0575b60405182906001600160a01b03881690600090600080516020613713833981519152908290a4612ea96000878480600101955087612ae5565b612ec6576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e70578260005414612edb57600080fd5b612f13565b5b6040516001830192906001600160a01b03881690600090600080516020613713833981519152908290a4808210612ee1575b5060009081556124e19085838684565b828054612f2f9061367a565b90600052602060002090601f016020900481019282612f515760008555612f97565b82601f10612f6a57805160ff1916838001178555612f97565b82800160010185558215612f97579182015b82811115612f97578251825591602001919060010190612f7c565b50612fa3929150612ffc565b5090565b828054828255906000526020600020908101928215612f97579160200282015b82811115612f9757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612fc7565b5b80821115612fa35760008155600101612ffd565b60006001600160401b0383111561302a5761302a6136e6565b61303d601f8401601f19166020016135ad565b905082815283838301111561305157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461307f57600080fd5b919050565b600060208284031215613095578081fd5b611b4f82613068565b600080604083850312156130b0578081fd5b6130b983613068565b91506130c760208401613068565b90509250929050565b6000806000606084860312156130e4578081fd5b6130ed84613068565b92506130fb60208501613068565b9150604084013590509250925092565b60008060008060808587031215613120578081fd5b61312985613068565b935061313760208601613068565b92506040850135915060608501356001600160401b03811115613158578182fd5b8501601f81018713613168578182fd5b61317787823560208401613011565b91505092959194509250565b60008060408385031215613195578182fd5b61319e83613068565b9150602083013580151581146131b2578182fd5b809150509250929050565b600080604083850312156131cf578182fd5b6131d883613068565b946020939093013593505050565b6000806000606084860312156131fa578283fd5b61320384613068565b95602085013595506040909401359392505050565b6000602080838503121561322a578182fd5b82356001600160401b0381111561323f578283fd5b8301601f8101851361324f578283fd5b803561326261325d826135dd565b6135ad565b80828252848201915084840188868560051b8701011115613281578687fd5b8694505b838510156132aa5761329681613068565b835260019490940193918501918501613285565b50979650505050505050565b600060208083850312156132c8578182fd5b82356001600160401b038111156132dd578283fd5b8301601f810185136132ed578283fd5b80356132fb61325d826135dd565b80828252848201915084840188868560051b870101111561331a578687fd5b8694505b838510156132aa57803583526001949094019391850191850161331e565b60006020828403121561334d578081fd5b8135611b4f816136fc565b600060208284031215613369578081fd5b8151611b4f816136fc565b600060208284031215613385578081fd5b81356001600160401b0381111561339a578182fd5b8201601f810184136133aa578182fd5b612bd584823560208401613011565b6000602082840312156133ca578081fd5b5035919050565b600081518084526133e981602086016020860161364e565b601f01601f19169290920160200192915050565b6000835161340f81846020880161364e565b83519083019061342381836020880161364e565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061345f908301846133d1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561178c576134c083855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101613485565b6020808252825182820181905260009190848201906040850190845b8181101561178c578351835292840192918401916001016134ef565b602081526000611b4f60208301846133d1565b6020808252600b908201526a0f4cae4de40d8cadccee8d60ab1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610dfc565b604051601f8201601f191681016001600160401b03811182821017156135d5576135d56136e6565b604052919050565b60006001600160401b038211156135f6576135f66136e6565b5060051b60200190565b60008219821115613613576136136136d0565b500190565b6000816000190483118215151615613632576136326136d0565b500290565b600082821015613649576136496136d0565b500390565b60005b83811015613669578181015183820152602001613651565b838111156124e15750506000910152565b600181811c9082168061368e57607f821691505b602082108114156136af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136c9576136c96136d0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461125057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122016cfe8cc7bc5e5a903efd7e81842e0a311fc36a6b5bfcd603dc3e4e63518154f64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000f8b0a10e4700000000000000000000000000000000000000000000000000000000000000001f90000000000000000000000000000000000000000000000000000000000000000e4e6f4e6f2066726f6d205345455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e4f4e4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5242526779767037784665454d7065483365334b48344c446e4b38396b32506a556436504b4e4269614b52370000000000000000000000

Deployed Bytecode

0x6080604052600436106104355760003560e01c806370a08231116102295780639e6a1d7d1161012e578063c23dc68f116100b6578063e985e9c51161007a578063e985e9c514610cf7578063ed9ec88814610d17578063ede5a96d14610d44578063f2fde38b14610d70578063f421764814610d9057600080fd5b8063c23dc68f14610c5e578063c744656514610c8b578063c87b56dd14610ca1578063ca13229e14610cc1578063ddd1783a14610ce157600080fd5b8063ae941890116100fd578063ae94189014610bad578063b67f94ba14610bcd578063b6c912fc14610bed578063b88d4fde14610c1d578063be9a655514610c3d57600080fd5b80639e6a1d7d14610b45578063a0712d6814610b65578063a22cb46514610b78578063a475b5dd14610b9857600080fd5b80638d859f3e116101b157806391ca3bb51161018057806391ca3bb514610acf57806395d89b4114610ae4578063996517cf14610af957806399a2557a14610b0f5780639afb583014610b2f57600080fd5b80638d859f3e14610a5b5780638da5cb5b14610a715780638de48c0b14610a8f57806391b7f5ed14610aaf57600080fd5b80637ebd1b30116101f85780637ebd1b30146109b85780638462151c146109d85780638936bc1114610a055780638c59314f14610a1b5780638d0f8cef14610a3b57600080fd5b806370a0823114610926578063715018a614610946578063740090b41461095b5780637b2e5c371461098857600080fd5b8063381b965c1161033a57806351830227116102c25780635eeacb5f116102865780635eeacb5f146108915780636352211e146108b157806369e1fd3a146108d15780636c0360eb146108f15780636f8b44b01461090657600080fd5b806351830227146107ed57806353e911af1461080e57806355f804b31461082e5780635755294c1461084e5780635bbb21771461086457600080fd5b80633fe9cbed116103095780633fe9cbed1461074057806341626a6f1461076057806342842e0e1461078d57806342966c68146107ad578063475aa7a7146107cd57600080fd5b8063381b965c146106ae5780633af32abf146106ce5780633bdf4ac6146106fe5780633ccfd60b1461072b57600080fd5b806311264cf3116103bd57806326b6b7b71161038c57806326b6b7b71461060b5780632a85db55146106385780633132eb911461065857806332cb6b0c14610678578063369b012d1461068e57600080fd5b806311264cf31461059c57806315011a28146105b257806318160ddd146105d257806323b872dd146105eb57600080fd5b8063081812fc11610404578063081812fc146104f4578063091bd95314610514578063095ea7b3146105365780630c3f64bf146105565780630d1482d61461058657600080fd5b806301ffc9a714610441578063046ac3c81461047657806304d5e0e51461049a57806306fdde03146104d257600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b5061046161045c36600461333c565b610db0565b60405190151581526020015b60405180910390f35b34801561048257600080fd5b5061048c60195481565b60405190815260200161046d565b3480156104a657600080fd5b506104ba6104b53660046133b9565b610e02565b6040516001600160a01b03909116815260200161046d565b3480156104de57600080fd5b506104e7610e2c565b60405161046d919061350b565b34801561050057600080fd5b506104ba61050f3660046133b9565b610ebe565b34801561052057600080fd5b5061053461052f3660046133b9565b610f02565b005b34801561054257600080fd5b506105346105513660046131bd565b610f3a565b34801561056257600080fd5b50610461610571366004613084565b60166020526000908152604090205460ff1681565b34801561059257600080fd5b5061048c601c5481565b3480156105a857600080fd5b5061048c60095481565b3480156105be57600080fd5b506105346105cd3660046133b9565b61100d565b3480156105de57600080fd5b506001546000540361048c565b3480156105f757600080fd5b506105346106063660046130d0565b61103c565b34801561061757600080fd5b5061048c610626366004613084565b601e6020526000908152604090205481565b34801561064457600080fd5b50610534610653366004613374565b61104c565b34801561066457600080fd5b50610534610673366004613218565b61108d565b34801561068457600080fd5b5061048c60245481565b34801561069a57600080fd5b506105346106a9366004613084565b611141565b3480156106ba57600080fd5b506105346106c93660046133b9565b6111b3565b3480156106da57600080fd5b506104616106e9366004613084565b60136020526000908152604090205460ff1681565b34801561070a57600080fd5b5061048c610719366004613084565b601f6020526000908152604090205481565b34801561073757600080fd5b506105346111e2565b34801561074c57600080fd5b5061053461075b3660046133b9565b611253565b34801561076c57600080fd5b5061048c61077b366004613084565b60216020526000908152604090205481565b34801561079957600080fd5b506105346107a83660046130d0565b611282565b3480156107b957600080fd5b506105346107c83660046133b9565b61129d565b3480156107d957600080fd5b506105346107e83660046133b9565b6112d0565b3480156107f957600080fd5b5060085461046190600160a01b900460ff1681565b34801561081a57600080fd5b50610534610829366004613218565b6112ff565b34801561083a57600080fd5b50610534610849366004613374565b6113d4565b34801561085a57600080fd5b5061048c601a5481565b34801561087057600080fd5b5061088461087f3660046132b6565b611411565b60405161046d9190613469565b34801561089d57600080fd5b506104ba6108ac3660046133b9565b611501565b3480156108bd57600080fd5b506104ba6108cc3660046133b9565b611511565b3480156108dd57600080fd5b506104ba6108ec3660046133b9565b61151c565b3480156108fd57600080fd5b506104e761152c565b34801561091257600080fd5b506105346109213660046133b9565b61155b565b34801561093257600080fd5b5061048c610941366004613084565b6115e0565b34801561095257600080fd5b5061053461162e565b34801561096757600080fd5b5061048c610976366004613084565b60226020526000908152604090205481565b34801561099457600080fd5b506104616109a3366004613084565b60156020526000908152604090205460ff1681565b3480156109c457600080fd5b506104ba6109d33660046133b9565b611664565b3480156109e457600080fd5b506109f86109f3366004613084565b611674565b60405161046d91906134d3565b348015610a1157600080fd5b5061048c600a5481565b348015610a2757600080fd5b50610534610a36366004613218565b611798565b348015610a4757600080fd5b50610534610a563660046131bd565b61186d565b348015610a6757600080fd5b5061048c60235481565b348015610a7d57600080fd5b506008546001600160a01b03166104ba565b348015610a9b57600080fd5b50600e546104ba906001600160a01b031681565b348015610abb57600080fd5b50610534610aca3660046133b9565b6118ff565b348015610adb57600080fd5b5061053461196b565b348015610af057600080fd5b506104e76119ae565b348015610b0557600080fd5b5061048c60175481565b348015610b1b57600080fd5b506109f8610b2a3660046131e6565b6119bd565b348015610b3b57600080fd5b5061048c601b5481565b348015610b5157600080fd5b50610534610b603660046133b9565b611b56565b610534610b733660046133b9565b611b85565b348015610b8457600080fd5b50610534610b93366004613183565b6122bc565b348015610ba457600080fd5b50610534612352565b348015610bb957600080fd5b50610534610bc83660046133b9565b612391565b348015610bd957600080fd5b50610534610be83660046133b9565b61246e565b348015610bf957600080fd5b50610461610c08366004613084565b60146020526000908152604090205460ff1681565b348015610c2957600080fd5b50610534610c3836600461310b565b61249d565b348015610c4957600080fd5b5060085461046190600160a81b900460ff1681565b348015610c6a57600080fd5b50610c7e610c793660046133b9565b6124e7565b60405161046d9190613578565b348015610c9757600080fd5b5061048c600b5481565b348015610cad57600080fd5b506104e7610cbc3660046133b9565b612550565b348015610ccd57600080fd5b50610534610cdc3660046133b9565b6125cd565b348015610ced57600080fd5b5061048c60185481565b348015610d0357600080fd5b50610461610d1236600461309e565b6125fc565b348015610d2357600080fd5b5061048c610d32366004613084565b601d6020526000908152604090205481565b348015610d5057600080fd5b5061048c610d5f366004613084565b602080526000908152604090205481565b348015610d7c57600080fd5b50610534610d8b366004613084565b61262a565b348015610d9c57600080fd5b50610534610dab366004613218565b6126c2565b60006301ffc9a760e01b6001600160e01b031983161480610de157506380ac58cd60e01b6001600160e01b03198316145b80610dfc5750635b5e139f60e01b6001600160e01b03198316145b92915050565b600f8181548110610e1257600080fd5b6000918252602090912001546001600160a01b0316905081565b606060028054610e3b9061367a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e679061367a565b8015610eb45780601f10610e8957610100808354040283529160200191610eb4565b820191906000526020600020905b815481529060010190602001808311610e9757829003601f168201915b5050505050905090565b6000610ec982612797565b610ee6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6008546001600160a01b03163314610f355760405162461bcd60e51b8152600401610f2c90613543565b60405180910390fd5b600a55565b6000610f45826127be565b9050806001600160a01b0316836001600160a01b03161415610f7a5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610fb157610f9481336125fc565b610fb1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146110375760405162461bcd60e51b8152600401610f2c90613543565b601a55565b61104783838361281f565b505050565b6008546001600160a01b031633146110765760405162461bcd60e51b8152600401610f2c90613543565b805161108990600d906020840190612f23565b5050565b6008546001600160a01b031633146110b75760405162461bcd60e51b8152600401610f2c90613543565b80516110ca90600f906020840190612fa7565b5060005b8151811015611089576001601460008484815181106110fd57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611139816136b5565b9150506110ce565b6008546001600160a01b0316331461116b5760405162461bcd60e51b8152600401610f2c90613543565b6001600160a01b0381166111915760405162461bcd60e51b8152600401610f2c9061351e565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031633146111dd5760405162461bcd60e51b8152600401610f2c90613543565b601855565b6008546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610f2c90613543565b6008546001600160a01b03166040516001600160a01b039190911690303180156108fc02916000818181858888f19350505050158015611250573d6000803e3d6000fd5b50565b6008546001600160a01b0316331461127d5760405162461bcd60e51b8152600401610f2c90613543565b600955565b6110478383836040518060200160405280600081525061249d565b6008546001600160a01b031633146112c75760405162461bcd60e51b8152600401610f2c90613543565b611250816129b0565b6008546001600160a01b031633146112fa5760405162461bcd60e51b8152600401610f2c90613543565b601c55565b6008546001600160a01b031633146113295760405162461bcd60e51b8152600401610f2c90613543565b600081511161134a5760405162461bcd60e51b8152600401610f2c9061351e565b805161135d906011906020840190612fa7565b5060005b81518110156110895760016015600084848151811061139057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806113cc816136b5565b915050611361565b6008546001600160a01b031633146113fe5760405162461bcd60e51b8152600401610f2c90613543565b805161108990600c906020840190612f23565b80516060906000816001600160401b0381111561143e57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561148957816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161145c5790505b50905060005b8281146114f9576114c68582815181106114b957634e487b7160e01b600052603260045260246000fd5b60200260200101516124e7565b8282815181106114e657634e487b7160e01b600052603260045260246000fd5b602090810291909101015260010161148f565b509392505050565b60108181548110610e1257600080fd5b6000610dfc826127be565b60118181548110610e1257600080fd5b600854606090600160a01b900460ff161561154e57600c8054610e3b9061367a565b600d8054610e3b9061367a565b6008546001600160a01b031633146115855760405162461bcd60e51b8152600401610f2c90613543565b600154600054038110156115db5760405162461bcd60e51b815260206004820181905260248201527f63616e6e6f74206c6f776572207468616e2063757272656e7420737570706c796044820152606401610f2c565b602455565b60006001600160a01b038216611609576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146116585760405162461bcd60e51b8152600401610f2c90613543565b61166260006129bb565b565b60128181548110610e1257600080fd5b60606000806000611684856115e0565b90506000816001600160401b038111156116ae57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156116d7578160200160208202803683370190505b5090506116fd604080516060810182526000808252602082018190529181019190915290565b60005b83861461178c5761171081612a0d565b915081604001511561172157611784565b81516001600160a01b03161561173657815194505b876001600160a01b0316856001600160a01b03161415611784578083878060010198508151811061177757634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611700565b50909695505050505050565b6008546001600160a01b031633146117c25760405162461bcd60e51b8152600401610f2c90613543565b60008151116117e35760405162461bcd60e51b8152600401610f2c9061351e565b80516117f6906010906020840190612fa7565b5060005b81518110156110895760016016600084848151811061182957634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611865816136b5565b9150506117fa565b6008546001600160a01b031633146118975760405162461bcd60e51b8152600401610f2c90613543565b602454816118a86001546000540390565b6118b29190613600565b11156118f55760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610f2c565b6110898282612a42565b6008546001600160a01b031633146119295760405162461bcd60e51b8152600401610f2c90613543565b600081116119665760405162461bcd60e51b815260206004820152600a6024820152697a65726f20707269636560b01b6044820152606401610f2c565b602355565b6008546001600160a01b031633146119955760405162461bcd60e51b8152600401610f2c90613543565b6008805460ff60a81b1916600160a81b17905542600b55565b606060038054610e3b9061367a565b60608183106119df57604051631960ccad60e11b815260040160405180910390fd5b6000806119eb60005490565b9050808411156119f9578093505b6000611a04876115e0565b905084861015611a235785850381811015611a1d578091505b50611a27565b5060005b6000816001600160401b03811115611a4f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905081611a8b579350611b4f92505050565b6000611a96886124e7565b905060008160400151611aa7575080515b885b888114158015611ab95750848714155b15611b4357611ac781612a0d565b9250826040015115611ad857611b3b565b82516001600160a01b031615611aed57825191505b8a6001600160a01b0316826001600160a01b03161415611b3b5780848880600101995081518110611b2e57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b600101611aa9565b50505092835250909150505b9392505050565b6008546001600160a01b03163314611b805760405162461bcd60e51b8152600401610f2c90613543565b601755565b600854600160a81b900460ff16611bcf5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081cdd185c9d60921b6044820152606401610f2c565b60008111611c0f5760405162461bcd60e51b815260206004820152600d60248201526c7a65726f207175616e7469747960981b6044820152606401610f2c565b60245481611c206001546000540390565b611c2a9190613600565b1115611c6d5760405162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610f2c565b33600090815260166020526040812054819060ff168015611ca95750600954600a54600b54611c9c9190613600565b611ca69190613600565b42115b15611dc457601754601a54611cbe9190613600565b336000908152601d6020908152604080832054918052909120548591611ce391613600565b611ced9190613600565b1115611d305760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b6044820152606401610f2c565b601a5433600090815260208052604081205460019450909190611d539086613600565b1115611d7a57336000908152602080526040902054601a54611d759190613637565b611d7c565b835b9050611d888185613637565b336000908152602080526040812080549294508392909190611dab908490613600565b90915550508015611dc257611dc233826000612a5c565b505b600e546001600160a01b0316331415611ebf57601b54601754611de79190613600565b336000908152601d6020908152604080832054602190925290912054611e0d9190613600565b10611e4f5760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b6044820152606401610f2c565b601b543360009081526021602052604081205460019450909190611e739086613600565b1115611e9b5733600090815260216020526040902054601b54611e969190613637565b611e9d565b835b9050611ea98185613637565b91508015611ebd57611ebd33826002612a5c565b505b3360009081526015602052604090205460ff1615611fca57601954601754611ee79190613600565b336000908152601d6020908152604080832054601e90925290912054611f0d9190613600565b10611f5a5760405162461bcd60e51b815260206004820152601760248201527f66726565206d696e74206c696d697420726561636865640000000000000000006044820152606401610f2c565b601954336000908152601e602052604081205460019450909190611f7e9086613600565b1115611fa657336000908152601e6020526040902054601954611fa19190613637565b611fa8565b835b9050611fb48185613637565b91508015611fc857611fc833826001612a5c565b505b3360009081526013602052604090205460ff161561210857600a54600b54611ff29190613600565b4211801561201c5750600954600a54600b5461200e9190613600565b6120189190613600565b4211155b1561210857601854336000908152601f602052604090205461203f908590613600565b111561208d5760405162461bcd60e51b815260206004820152601c60248201527f77686974656c697374206d696e74206c696d69742072656163686564000000006044820152606401610f2c565b60235461209a9084613618565b3410156120d95760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b6044820152606401610f2c565b336000908152601f6020526040812080548592906120f8908490613600565b9091555061104790503384612a42565b8161217c57601754336000908152601d602052604090205461212b908590613600565b11156121755760405162461bcd60e51b81526020600482015260196024820152781c1d589b1a58c81b5a5b9d081b1a5b5a5d081c995858da1959603a1b6044820152606401610f2c565b50816121e4565b601754336000908152601d602052604090205461219a908390613600565b11156121e45760405162461bcd60e51b81526020600482015260196024820152781c1d589b1a58c81b5a5b9d081b1a5b5a5d081c995858da1959603a1b6044820152606401610f2c565b801561104757600a54600b546121fa9190613600565b42111561227c5760235461220e9082613618565b34101561224d5760405162461bcd60e51b815260206004820152600d60248201526c76616c756520746f6f206c6f7760981b6044820152606401610f2c565b336000908152601d60205260408120805483929061226c908490613600565b9091555061104790503382612a42565b60405162461bcd60e51b81526020600482015260156024820152741c1d589b1a58c81b5a5b9d081b9bdd081cdd185c9d605a1b6044820152606401610f2c565b6001600160a01b0382163314156122e65760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461237c5760405162461bcd60e51b8152600401610f2c90613543565b6008805460ff60a01b1916600160a01b179055565b3360009081526014602052604090205460ff166123dd5760405162461bcd60e51b815260206004820152600a602482015269636f726573206f6e6c7960b01b6044820152606401610f2c565b601c54336000908152602260205260409020546123fb908390613600565b111561243f5760405162461bcd60e51b815260206004820152601360248201527218dbdc99481b1a5b5a5d081c99595858da1959606a1b6044820152606401610f2c565b336000908152602260205260408120805483929061245e908490613600565b9091555061125090503382612a42565b6008546001600160a01b031633146124985760405162461bcd60e51b8152600401610f2c90613543565b601955565b6124a884848461281f565b6001600160a01b0383163b156124e1576124c484848484612ae5565b6124e1576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101839052909150600054831061252c5792915050565b61253583612a0d565b90508060400151156125475792915050565b611b4f83612bdd565b606061255b82612797565b61257857604051630a14c4b560e41b815260040160405180910390fd5b600061258261152c565b600854909150600160a01b900460ff1661259c5780611b4f565b806125a684612c0b565b6040516020016125b79291906133fd565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146125f75760405162461bcd60e51b8152600401610f2c90613543565b601b55565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146126545760405162461bcd60e51b8152600401610f2c90613543565b6001600160a01b0381166126b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f2c565b611250816129bb565b6008546001600160a01b031633146126ec5760405162461bcd60e51b8152600401610f2c90613543565b600081511161270d5760405162461bcd60e51b8152600401610f2c9061351e565b8051612720906012906020840190612fa7565b5060005b81518110156110895760016013600084848151811061275357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061278f816136b5565b915050612724565b6000805482108015610dfc575050600090815260046020526040902054600160e01b161590565b60008160005481101561280657600081815260046020526040902054600160e01b8116612804575b80611b4f5750600019016000818152600460205260409020546127e6565b505b604051636f96cda160e11b815260040160405180910390fd5b600061282a826127be565b9050836001600160a01b0316816001600160a01b03161461285d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061287b575061287b85336125fc565b8061289657503361288b84610ebe565b6001600160a01b0316145b9050806128b657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166128dd57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091529020600160e11b4260a01b86178117909155821661297a57600183016000818152600460205260409020546129785760005481146129785760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b031660008051602061371383398151915260405160405180910390a45050505050565b611250816000612c5a565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160608101825260008082526020820181905291810191909152600082815260046020526040902054610dfc90612d9c565b611089828260405180602001604052806000815250612dd6565b8060011415612a8f57336000908152601e602052604081208054849290612a84908490613600565b90915550612adb9050565b8060021415612ab7573360009081526021602052604081208054849290612a84908490613600565b33600090815260208052604081208054849290612ad5908490613600565b90915550505b6110478383612a42565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b1a90339089908890889060040161342c565b602060405180830381600087803b158015612b3457600080fd5b505af1925050508015612b64575060408051601f3d908101601f19168201909252612b6191810190613358565b60015b612bbf573d808015612b92576040519150601f19603f3d011682016040523d82523d6000602084013e612b97565b606091505b508051612bb7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160608101825260008082526020820181905291810191909152610dfc612c06836127be565b612d9c565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612c4857600183039250600a81066030018353600a9004612c2a565b50819003601f19909101908152919050565b6000612c65836127be565b9050808215612cc9576000336001600160a01b0383161480612c8c5750612c8c82336125fc565b80612ca7575033612c9c86610ebe565b6001600160a01b0316145b905080612cc757604051632ce44b5f60e11b815260040160405180910390fd5b505b600084815260066020908152604080832080546001600160a01b03191690556001600160a01b03841683526005825280832080546fffffffffffffffffffffffffffffffff01905586835260049091529020600360e01b4260a01b8317179055600160e11b8216612d685760018401600081815260046020526040902054612d66576000548114612d665760008181526004602052604090208390555b505b60405184906000906001600160a01b03841690600080516020613713833981519152908390a4505060018054810190555050565b604080516060810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b90921615159082015290565b6000546001600160a01b038416612dff57604051622e076360e81b815260040160405180910390fd5b82612e1d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612ee0575b60405182906001600160a01b03881690600090600080516020613713833981519152908290a4612ea96000878480600101955087612ae5565b612ec6576040516368d2bf6b60e11b815260040160405180910390fd5b808210612e70578260005414612edb57600080fd5b612f13565b5b6040516001830192906001600160a01b03881690600090600080516020613713833981519152908290a4808210612ee1575b5060009081556124e19085838684565b828054612f2f9061367a565b90600052602060002090601f016020900481019282612f515760008555612f97565b82601f10612f6a57805160ff1916838001178555612f97565b82800160010185558215612f97579182015b82811115612f97578251825591602001919060010190612f7c565b50612fa3929150612ffc565b5090565b828054828255906000526020600020908101928215612f97579160200282015b82811115612f9757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612fc7565b5b80821115612fa35760008155600101612ffd565b60006001600160401b0383111561302a5761302a6136e6565b61303d601f8401601f19166020016135ad565b905082815283838301111561305157600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461307f57600080fd5b919050565b600060208284031215613095578081fd5b611b4f82613068565b600080604083850312156130b0578081fd5b6130b983613068565b91506130c760208401613068565b90509250929050565b6000806000606084860312156130e4578081fd5b6130ed84613068565b92506130fb60208501613068565b9150604084013590509250925092565b60008060008060808587031215613120578081fd5b61312985613068565b935061313760208601613068565b92506040850135915060608501356001600160401b03811115613158578182fd5b8501601f81018713613168578182fd5b61317787823560208401613011565b91505092959194509250565b60008060408385031215613195578182fd5b61319e83613068565b9150602083013580151581146131b2578182fd5b809150509250929050565b600080604083850312156131cf578182fd5b6131d883613068565b946020939093013593505050565b6000806000606084860312156131fa578283fd5b61320384613068565b95602085013595506040909401359392505050565b6000602080838503121561322a578182fd5b82356001600160401b0381111561323f578283fd5b8301601f8101851361324f578283fd5b803561326261325d826135dd565b6135ad565b80828252848201915084840188868560051b8701011115613281578687fd5b8694505b838510156132aa5761329681613068565b835260019490940193918501918501613285565b50979650505050505050565b600060208083850312156132c8578182fd5b82356001600160401b038111156132dd578283fd5b8301601f810185136132ed578283fd5b80356132fb61325d826135dd565b80828252848201915084840188868560051b870101111561331a578687fd5b8694505b838510156132aa57803583526001949094019391850191850161331e565b60006020828403121561334d578081fd5b8135611b4f816136fc565b600060208284031215613369578081fd5b8151611b4f816136fc565b600060208284031215613385578081fd5b81356001600160401b0381111561339a578182fd5b8201601f810184136133aa578182fd5b612bd584823560208401613011565b6000602082840312156133ca578081fd5b5035919050565b600081518084526133e981602086016020860161364e565b601f01601f19169290920160200192915050565b6000835161340f81846020880161364e565b83519083019061342381836020880161364e565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061345f908301846133d1565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561178c576134c083855180516001600160a01b031682526020808201516001600160401b0316908301526040908101511515910152565b9284019260609290920191600101613485565b6020808252825182820181905260009190848201906040850190845b8181101561178c578351835292840192918401916001016134ef565b602081526000611b4f60208301846133d1565b6020808252600b908201526a0f4cae4de40d8cadccee8d60ab1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81516001600160a01b031681526020808301516001600160401b03169082015260408083015115159082015260608101610dfc565b604051601f8201601f191681016001600160401b03811182821017156135d5576135d56136e6565b604052919050565b60006001600160401b038211156135f6576135f66136e6565b5060051b60200190565b60008219821115613613576136136136d0565b500190565b6000816000190483118215151615613632576136326136d0565b500290565b600082821015613649576136496136d0565b500390565b60005b83811015613669578181015183820152602001613651565b838111156124e15750506000910152565b600181811c9082168061368e57607f821691505b602082108114156136af57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136c9576136c96136d0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461125057600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122016cfe8cc7bc5e5a903efd7e81842e0a311fc36a6b5bfcd603dc3e4e63518154f64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000f8b0a10e4700000000000000000000000000000000000000000000000000000000000000001f90000000000000000000000000000000000000000000000000000000000000000e4e6f4e6f2066726f6d205345455200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044e4f4e4f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5242526779767037784665454d7065483365334b48344c446e4b38396b32506a556436504b4e4269614b52370000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): NoNo from SEER
Arg [1] : symbol (string): NONO
Arg [2] : uri (string):
Arg [3] : preUri (string): ipfs://QmRBRgyvp7xFeEMpeH3e3KH4LDnK89k2PjUd6PKNBiaKR7
Arg [4] : mintPrice (uint256): 70000000000000000
Arg [5] : maxSupply (uint256): 8080

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001f90
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [7] : 4e6f4e6f2066726f6d2053454552000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 4e4f4e4f00000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [12] : 697066733a2f2f516d5242526779767037784665454d7065483365334b48344c
Arg [13] : 446e4b38396b32506a556436504b4e4269614b52370000000000000000000000


Deployed Bytecode Sourcemap

50619:9503:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15602:615;;;;;;;;;;-1:-1:-1;15602:615:0;;;;;:::i;:::-;;:::i;:::-;;;9469:14:1;;9462:22;9444:41;;9432:2;9417:18;15602:615:0;;;;;;;;51414:29;;;;;;;;;;;;;;;;;;;15763:25:1;;;15751:2;15736:18;51414:29:0;15718:76:1;51035:22:0;;;;;;;;;;-1:-1:-1;51035:22:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7399:32:1;;;7381:51;;7369:2;7354:18;51035:22:0;7336:102:1;20615:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22683:204::-;;;;;;;;;;-1:-1:-1;22683:204:0;;;;;:::i;:::-;;:::i;52959:114::-;;;;;;;;;;-1:-1:-1;52959:114:0;;;;;:::i;:::-;;:::i;:::-;;22143:474;;;;;;;;;;-1:-1:-1;22143:474:0;;;;;:::i;:::-;;:::i;51297:37::-;;;;;;;;;;-1:-1:-1;51297:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51521:28;;;;;;;;;;;;;;;;50830;;;;;;;;;;;;;;;;54225:114;;;;;;;;;;-1:-1:-1;54225:114:0;;;;;:::i;:::-;;:::i;14656:315::-;;;;;;;;;;-1:-1:-1;14922:12:0;;14709:7;14906:13;:28;14656:315;;23569:170;;;;;;;;;;-1:-1:-1;23569:170:0;;;;;:::i;:::-;;:::i;51607:49::-;;;;;;;;;;-1:-1:-1;51607:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;53298:101;;;;;;;;;;-1:-1:-1;53298:101:0;;;;;:::i;:::-;;:::i;54609:199::-;;;;;;;;;;-1:-1:-1;54609:199:0;;;;;:::i;:::-;;:::i;51920:25::-;;;;;;;;;;;;;;;;55322:155;;;;;;;;;;-1:-1:-1;55322:155:0;;;;;:::i;:::-;;:::i;53949:138::-;;;;;;;;;;-1:-1:-1;53949:138:0;;;;;:::i;:::-;;:::i;51154:45::-;;;;;;;;;;-1:-1:-1;51154:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51663:53;;;;;;;;;;-1:-1:-1;51663:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;55968:106;;;;;;;;;;;;;:::i;53081:110::-;;;;;;;;;;-1:-1:-1;53081:110:0;;;;;:::i;:::-;;:::i;51777:50::-;;;;;;;;;;-1:-1:-1;51777:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;23810:185;;;;;;;;;;-1:-1:-1;23810:185:0;;;;;:::i;:::-;;:::i;56082:83::-;;;;;;;;;;-1:-1:-1;56082:83:0;;;;;:::i;:::-;;:::i;54481:120::-;;;;;;;;;;-1:-1:-1;54481:120:0;;;;;:::i;:::-;;:::i;50779:20::-;;;;;;;;;;-1:-1:-1;50779:20:0;;;;-1:-1:-1;;;50779:20:0;;;;;;55065:250;;;;;;;;;;-1:-1:-1;55065:250:0;;;;;:::i;:::-;;:::i;53199:91::-;;;;;;;;;;-1:-1:-1;53199:91:0;;;;;:::i;:::-;;:::i;51450:27::-;;;;;;;;;;;;;;;;42404:468;;;;;;;;;;-1:-1:-1;42404:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51064:21::-;;;;;;;;;;-1:-1:-1;51064:21:0;;;;;:::i;:::-;;:::i;20404:144::-;;;;;;;;;;-1:-1:-1;20404:144:0;;;;;:::i;:::-;;:::i;51092:22::-;;;;;;;;;;-1:-1:-1;51092:22:0;;;;;:::i;:::-;;:::i;52468:180::-;;;;;;;;;;;;;:::i;53545:174::-;;;;;;;;;;-1:-1:-1;53545:174:0;;;;;:::i;:::-;;:::i;16281:224::-;;;;;;;;;;-1:-1:-1;16281:224:0;;;;;:::i;:::-;;:::i;49735:103::-;;;;;;;;;;;;;:::i;51834:48::-;;;;;;;;;;-1:-1:-1;51834:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;51251:39;;;;;;;;;;-1:-1:-1;51251:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51121:26;;;;;;;;;;-1:-1:-1;51121:26:0;;;;;:::i;:::-;;:::i;46216:892::-;;;;;;;;;;-1:-1:-1;46216:892:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50865:30::-;;;;;;;;;;;;;;;;54816:241;;;;;;;;;;-1:-1:-1;54816:241:0;;;;;:::i;:::-;;:::i;55777:183::-;;;;;;;;;;-1:-1:-1;55777:183:0;;;;;:::i;:::-;;:::i;51893:20::-;;;;;;;;;;;;;;;;49084:87;;;;;;;;;;-1:-1:-1;49157:6:0;;-1:-1:-1;;;;;49157:6:0;49084:87;;51000:28;;;;;;;;;;-1:-1:-1;51000:28:0;;;;-1:-1:-1;;;;;51000:28:0;;;53407:130;;;;;;;;;;-1:-1:-1;53407:130:0;;;;;:::i;:::-;;:::i;53727:104::-;;;;;;;;;;;;;:::i;20784:::-;;;;;;;;;;;;;:::i;51343:24::-;;;;;;;;;;;;;;;;43262:2505;;;;;;;;;;-1:-1:-1;43262:2505:0;;;;;:::i;:::-;;:::i;51484:30::-;;;;;;;;;;;;;;;;53839:102;;;;;;;;;;-1:-1:-1;53839:102:0;;;;;:::i;:::-;;:::i;56173:3279::-;;;;;;:::i;:::-;;:::i;22959:308::-;;;;;;;;;;-1:-1:-1;22959:308:0;;;;;:::i;:::-;;:::i;52389:71::-;;;;;;;;;;;;;:::i;59460:254::-;;;;;;;;;;-1:-1:-1;59460:254:0;;;;;:::i;:::-;;:::i;54095:122::-;;;;;;;;;;-1:-1:-1;54095:122:0;;;;;:::i;:::-;;:::i;51206:38::-;;;;;;;;;;-1:-1:-1;51206:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24066:396;;;;;;;;;;-1:-1:-1;24066:396:0;;;;;:::i;:::-;;:::i;50806:17::-;;;;;;;;;;-1:-1:-1;50806:17:0;;;;-1:-1:-1;;;50806:17:0;;;;;;41825:420;;;;;;;;;;-1:-1:-1;41825:420:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50904:22::-;;;;;;;;;;;;;;;;52656:295;;;;;;;;;;-1:-1:-1;52656:295:0;;;;;:::i;:::-;;:::i;54347:126::-;;;;;;;;;;-1:-1:-1;54347:126:0;;;;;:::i;:::-;;:::i;51374:33::-;;;;;;;;;;;;;;;;23338:164;;;;;;;;;;-1:-1:-1;23338:164:0;;;;;:::i;:::-;;:::i;51556:44::-;;;;;;;;;;-1:-1:-1;51556:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;51723:47;;;;;;;;;;-1:-1:-1;51723:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;49993:201;;;;;;;;;;-1:-1:-1;49993:201:0;;;;;:::i;:::-;;:::i;55485:284::-;;;;;;;;;;-1:-1:-1;55485:284:0;;;;;:::i;:::-;;:::i;15602:615::-;15687:4;-1:-1:-1;;;;;;;;;15987:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;16064:25:0;;;15987:102;:179;;;-1:-1:-1;;;;;;;;;;16141:25:0;;;15987:179;15967:199;15602:615;-1:-1:-1;;15602:615:0:o;51035:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51035:22:0;;-1:-1:-1;51035:22:0;:::o;20615:100::-;20669:13;20702:5;20695:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20615:100;:::o;22683:204::-;22751:7;22776:16;22784:7;22776;:16::i;:::-;22771:64;;22801:34;;-1:-1:-1;;;22801:34:0;;;;;;;;;;;22771:64;-1:-1:-1;22855:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22855:24:0;;22683:204::o;52959:114::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;;;;;;;;;53037:15:::1;:28:::0;52959:114::o;22143:474::-;22216:13;22248:27;22267:7;22248:18;:27::i;:::-;22216:61;;22298:5;-1:-1:-1;;;;;22292:11:0;:2;-1:-1:-1;;;;;22292:11:0;;22288:48;;;22312:24;;-1:-1:-1;;;22312:24:0;;;;;;;;;;;22288:48;47882:10;-1:-1:-1;;;;;22353:28:0;;;22349:175;;22401:44;22418:5;47882:10;23338:164;:::i;22401:44::-;22396:128;;22473:35;;-1:-1:-1;;;22473:35:0;;;;;;;;;;;22396:128;22536:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;22536:29:0;-1:-1:-1;;;;;22536:29:0;;;;;;;;;22581:28;;22536:24;;22581:28;;;;;;;22143:474;;;:::o;54225:114::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54303:12:::1;:28:::0;54225:114::o;23569:170::-;23703:28;23713:4;23719:2;23723:7;23703:9;:28::i;:::-;23569:170;;;:::o;53298:101::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53372:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;53298:101:::0;:::o;54609:199::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54682:14;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54711:9;54707:94;54730:6;:13;54726:1;:17;54707:94;;;54785:4;54765:6;:17;54772:6;54779:1;54772:9;;;;;;-1:-1:-1::0;;;54772:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;54765:17:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;54765:17:0;:24;;-1:-1:-1;;54765:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54745:3;::::1;::::0;::::1;:::i;:::-;;;;54707:94;;55322:155:::0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55396:21:0;::::1;55388:45;;;;-1:-1:-1::0;;;55388:45:0::1;;;;;;;:::i;:::-;55446:13;:23:::0;;-1:-1:-1;;;;;;55446:23:0::1;-1:-1:-1::0;;;;;55446:23:0;;;::::1;::::0;;;::::1;::::0;;55322:155::o;53949:138::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54039:18:::1;:40:::0;53949:138::o;55968:106::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;49157:6;;-1:-1:-1;;;;;49157:6:0;56018:48:::1;::::0;-1:-1:-1;;;;;56018:25:0;;;::::1;::::0;56052:4:::1;56044:21;56018:48:::0;::::1;;;::::0;::::1;::::0;;;56044:21;56018:25;:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55968:106::o:0;53081:110::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53157:13:::1;:26:::0;53081:110::o;23810:185::-;23948:39;23965:4;23971:2;23975:7;23948:39;;;;;;;;;;;;:16;:39::i;56082:83::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;56143:14:::1;56149:7;56143:5;:14::i;54481:120::-:0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54562:13:::1;:31:::0;54481:120::o;55065:250::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;55162:1:::1;55146:6;:13;:17;55138:41;;;;-1:-1:-1::0;;;55138:41:0::1;;;;;;;:::i;:::-;55192:14:::0;;::::1;::::0;:5:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55221:9;55217:91;55236:6;:13;55232:1;:17;55217:91;;;55292:4;55271:7;:18;55279:6;55286:1;55279:9;;;;;;-1:-1:-1::0;;;55279:9:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;55271:18:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;55271:18:0;:25;;-1:-1:-1;;55271:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55251:3;::::1;::::0;::::1;:::i;:::-;;;;55217:91;;53199::::0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53268:14;;::::1;::::0;:8:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;42404:468::-:0;42579:15;;42493:23;;42554:22;42579:15;-1:-1:-1;;;;;42646:36:0;;;;;-1:-1:-1;;;42646:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;42646:36:0;;-1:-1:-1;;42646:36:0;;;;;;;;;;;;42609:73;;42702:9;42697:125;42718:14;42713:1;:19;42697:125;;42774:32;42794:8;42803:1;42794:11;;;;;;-1:-1:-1;;;42794:11:0;;;;;;;;;;;;;;;42774:19;:32::i;:::-;42758:10;42769:1;42758:13;;;;;;-1:-1:-1;;;42758:13:0;;;;;;;;;;;;;;;;;;:48;42734:3;;42697:125;;;-1:-1:-1;42843:10:0;42404:468;-1:-1:-1;;;42404:468:0:o;51064:21::-;;;;;;;;;;;;20404:144;20468:7;20511:27;20530:7;20511:18;:27::i;51092:22::-;;;;;;;;;;;;52468:180;52536:8;;52507:13;;-1:-1:-1;;;52536:8:0;;;;52533:108;;;52568:8;52561:15;;;;;:::i;52533:108::-;52616:13;52609:20;;;;;:::i;53545:174::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;14922:12;;14709:7;14906:13;:28;53621:6:::1;:23;;53613:68;;;::::0;-1:-1:-1;;;53613:68:0;;15190:2:1;53613:68:0::1;::::0;::::1;15172:21:1::0;;;15209:18;;;15202:30;15268:34;15248:18;;;15241:62;15320:18;;53613:68:0::1;15162:182:1::0;53613:68:0::1;53692:10;:19:::0;53545:174::o;16281:224::-;16345:7;-1:-1:-1;;;;;16369:19:0;;16365:60;;16397:28;;-1:-1:-1;;;16397:28:0;;;;;;;;;;;16365:60;-1:-1:-1;;;;;;16443:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;16443:54:0;;16281:224::o;49735:103::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;49800:30:::1;49827:1;49800:18;:30::i;:::-;49735:103::o:0;51121:26::-;;;;;;;;;;;;46216:892;46286:16;46340:19;46374:25;46414:22;46439:16;46449:5;46439:9;:16::i;:::-;46414:41;;46470:25;46512:14;-1:-1:-1;;;;;46498:29:0;;;;;-1:-1:-1;;;46498:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46498:29:0;;46470:57;;46542:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;46542:31:0;46593:9;46588:472;46637:14;46622:11;:29;46588:472;;46689:15;46702:1;46689:12;:15::i;:::-;46677:27;;46727:9;:16;;;46723:73;;;46768:8;;46723:73;46818:14;;-1:-1:-1;;;;;46818:28:0;;46814:111;;46891:14;;;-1:-1:-1;46814:111:0;46968:5;-1:-1:-1;;;;;46947:26:0;:17;-1:-1:-1;;;;;46947:26:0;;46943:102;;;47024:1;46998:8;47007:13;;;;;;46998:23;;;;;;-1:-1:-1;;;46998:23:0;;;;;;;;;;;;;;:27;;;;;46943:102;46653:3;;46588:472;;;-1:-1:-1;47081:8:0;;46216:892;-1:-1:-1;;;;;;46216:892:0:o;54816:241::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54910:1:::1;54895:5;:12;:16;54887:40;;;;-1:-1:-1::0;;;54887:40:0::1;;;;;;;:::i;:::-;54940:12:::0;;::::1;::::0;:4:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;;54967:9;54963:87;54982:5;:12;54978:1;:16;54963:87;;;55034:4;55016:5;:15;55022:5;55028:1;55022:8;;;;;;-1:-1:-1::0;;;55022:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;55016:15:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;55016:15:0;:22;;-1:-1:-1;;55016:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54996:3;::::1;::::0;::::1;:::i;:::-;;;;54963:87;;55777:183:::0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;55885:10:::1;;55873:8;55859:13;14922:12:::0;;14709:7;14906:13;:28;;14656:315;55859:13:::1;:22;;;;:::i;:::-;:36;;55851:67;;;::::0;-1:-1:-1;;;55851:67:0;;12766:2:1;55851:67:0::1;::::0;::::1;12748:21:1::0;12805:2;12785:18;;;12778:30;-1:-1:-1;;;12824:18:1;;;12817:48;12882:18;;55851:67:0::1;12738:168:1::0;55851:67:0::1;55929:23;55939:2;55943:8;55929:9;:23::i;53407:130::-:0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53488:1:::1;53479:6;:10;53471:33;;;::::0;-1:-1:-1;;;53471:33:0;;12427:2:1;53471:33:0::1;::::0;::::1;12409:21:1::0;12466:2;12446:18;;;12439:30;-1:-1:-1;;;12485:18:1;;;12478:40;12535:18;;53471:33:0::1;12399:160:1::0;53471:33:0::1;53515:5;:14:::0;53407:130::o;53727:104::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53775:5:::1;:12:::0;;-1:-1:-1;;;;53775:12:0::1;-1:-1:-1::0;;;53775:12:0::1;::::0;;53808:15:::1;53798:7;:25:::0;53727:104::o;20784:::-;20840:13;20873:7;20866:14;;;;;:::i;43262:2505::-;43397:16;43464:4;43455:5;:13;43451:45;;43477:19;;-1:-1:-1;;;43477:19:0;;;;;;;;;;;43451:45;43511:19;43545:17;43565:14;14397:7;14424:13;;14350:95;43565:14;43545:34;-1:-1:-1;43816:9:0;43809:4;:16;43805:73;;;43853:9;43846:16;;43805:73;43892:25;43920:16;43930:5;43920:9;:16::i;:::-;43892:44;;44114:4;44106:5;:12;44102:278;;;44161:12;;;44196:31;;;44192:111;;;44272:11;44252:31;;44192:111;44102:278;;;;-1:-1:-1;44363:1:0;44102:278;44394:25;44436:17;-1:-1:-1;;;;;44422:32:0;;;;;-1:-1:-1;;;44422:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44422:32:0;-1:-1:-1;44394:60:0;-1:-1:-1;44473:22:0;44469:78;;44523:8;-1:-1:-1;44516:15:0;;-1:-1:-1;;;44516:15:0;44469:78;44691:31;44725:26;44745:5;44725:19;:26::i;:::-;44691:60;;44766:25;45011:9;:16;;;45006:92;;-1:-1:-1;45068:14:0;;45006:92;45129:5;45112:478;45141:4;45136:1;:9;;:45;;;;;45164:17;45149:11;:32;;45136:45;45112:478;;;45219:15;45232:1;45219:12;:15::i;:::-;45207:27;;45257:9;:16;;;45253:73;;;45298:8;;45253:73;45348:14;;-1:-1:-1;;;;;45348:28:0;;45344:111;;45421:14;;;-1:-1:-1;45344:111:0;45498:5;-1:-1:-1;;;;;45477:26:0;:17;-1:-1:-1;;;;;45477:26:0;;45473:102;;;45554:1;45528:8;45537:13;;;;;;45528:23;;;;;;-1:-1:-1;;;45528:23:0;;;;;;;;;;;;;;:27;;;;;45473:102;45183:3;;45112:478;;;-1:-1:-1;;;45675:29:0;;;-1:-1:-1;45682:8:0;;-1:-1:-1;;43262:2505:0;;;;;;:::o;53839:102::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;53911:9:::1;:22:::0;53839:102::o;56173:3279::-;56241:5;;-1:-1:-1;;;56241:5:0;;;;56233:32;;;;-1:-1:-1;;;56233:32:0;;11378:2:1;56233:32:0;;;11360:21:1;11417:2;11397:18;;;11390:30;-1:-1:-1;;;11436:18:1;;;11429:44;11490:18;;56233:32:0;11350:164:1;56233:32:0;56295:1;56284:8;:12;56276:38;;;;-1:-1:-1;;;56276:38:0;;14848:2:1;56276:38:0;;;14830:21:1;14887:2;14867:18;;;14860:30;-1:-1:-1;;;14906:18:1;;;14899:43;14959:18;;56276:38:0;14820:163:1;56276:38:0;56361:10;;56349:8;56333:13;14922:12;;14709:7;14906:13;:28;;14656:315;56333:13;:24;;;;:::i;:::-;:38;;56325:69;;;;-1:-1:-1;;;56325:69:0;;12766:2:1;56325:69:0;;;12748:21:1;12805:2;12785:18;;;12778:30;-1:-1:-1;;;12824:18:1;;;12817:48;12882:18;;56325:69:0;12738:168:1;56325:69:0;56475:10;56415:13;56469:17;;;:5;:17;;;;;;56415:13;;56469:17;;:80;;;;;56536:13;;56518:15;;56508:7;;:25;;;;:::i;:::-;:41;;;;:::i;:::-;56490:15;:59;56469:80;56466:635;;;56652:9;;56637:12;;:24;;;;:::i;:::-;56611:10;56601:21;;;;:9;:21;;;;;;;;;56574:24;;;;;;;56625:8;;56574:48;;;:::i;:::-;:59;;;;:::i;:::-;:87;;56566:118;;;;-1:-1:-1;;;56566:118:0;;14501:2:1;56566:118:0;;;14483:21:1;14540:2;14520:18;;;14513:30;-1:-1:-1;;;14559:18:1;;;14552:48;14617:18;;56566:118:0;14473:168:1;56566:118:0;56802:12;;56787:10;56745:15;56774:24;;;:12;:24;;;;;;56724:4;;-1:-1:-1;56745:15:0;;56802:12;56763:35;;:8;:35;:::i;:::-;:51;;:130;;56882:10;56869:24;;;;:12;:24;;;;;;56854:12;;:39;;56869:24;56854:39;:::i;:::-;56763:130;;;56830:8;56763:130;56745:148;-1:-1:-1;56921:18:0;56745:148;56921:8;:18;:::i;:::-;56969:10;56956:24;;;;:12;:24;;;;;:35;;56910:29;;-1:-1:-1;56984:7:0;;56956:24;;;:35;;56984:7;;56956:35;:::i;:::-;;;;-1:-1:-1;;57009:11:0;;57006:84;;57041:33;57051:10;57063:7;57072:1;57041:9;:33::i;:::-;56466:635;;57114:13;;-1:-1:-1;;;;;57114:13:0;57131:10;57114:27;57111:550;;;57232:15;;57220:9;;:27;;;;:::i;:::-;57206:10;57196:21;;;;:9;:21;;;;;;;;;57166:15;:27;;;;;;;:51;;57196:21;57166:51;:::i;:::-;:81;57158:112;;;;-1:-1:-1;;;57158:112:0;;14501:2:1;57158:112:0;;;14483:21:1;14540:2;14520:18;;;14513:30;-1:-1:-1;;;14559:18:1;;;14552:48;14617:18;;57158:112:0;14473:168:1;57158:112:0;57382:15;;57367:10;57319:18;57351:27;;;:15;:27;;;;;;57298:4;;-1:-1:-1;57319:18:0;;57382:15;57340:38;;:8;:38;:::i;:::-;:57;;:142;;57471:10;57455:27;;;;:15;:27;;;;;;57437:15;;:45;;57455:27;57437:45;:::i;:::-;57340:142;;;57413:8;57340:142;57319:163;-1:-1:-1;57510:21:0;57319:163;57510:8;:21;:::i;:::-;57499:32;-1:-1:-1;57563:14:0;;57560:90;;57598:36;57608:10;57620;57632:1;57598:9;:36::i;:::-;57111:550;;57682:10;57674:19;;;;:7;:19;;;;;;;;57671:537;;;57783:14;;57771:9;;:26;;;;:::i;:::-;57757:10;57747:21;;;;:9;:21;;;;;;;;;57718:14;:26;;;;;;;:50;;57747:21;57718:50;:::i;:::-;:79;57710:115;;;;-1:-1:-1;;;57710:115:0;;11721:2:1;57710:115:0;;;11703:21:1;11760:2;11740:18;;;11733:30;11799:25;11779:18;;;11772:53;11842:18;;57710:115:0;11693:173:1;57710:115:0;57947:14;;57932:10;57886:17;57917:26;;;:14;:26;;;;;;57865:4;;-1:-1:-1;57886:17:0;;57947:14;57906:37;;:8;:37;:::i;:::-;:55;;:138;;58033:10;58018:26;;;;:14;:26;;;;;;58001:14;;:43;;58018:26;58001:43;:::i;:::-;57906:138;;;57977:8;57906:138;57886:158;-1:-1:-1;58072:20:0;57886:158;58072:8;:20;:::i;:::-;58061:31;-1:-1:-1;58112:13:0;;58109:88;;58146:35;58156:10;58168:9;58179:1;58146:9;:35::i;:::-;57671:537;;58257:10;58243:25;;;;:13;:25;;;;;;;;58240:520;;;58317:15;;58307:7;;:25;;;;:::i;:::-;58289:15;:43;:107;;;;;58383:13;;58365:15;;58355:7;;:25;;;;:::i;:::-;:41;;;;:::i;:::-;58336:15;:60;;58289:107;58285:464;;;58470:18;;58444:10;58425:30;;;;:18;:30;;;;;;:41;;58458:8;;58425:41;:::i;:::-;:63;;58417:104;;;;-1:-1:-1;;;58417:104:0;;10679:2:1;58417:104:0;;;10661:21:1;10718:2;10698:18;;;10691:30;10757;10737:18;;;10730:58;10805:18;;58417:104:0;10651:178:1;58417:104:0;58572:5;;58561:16;;:8;:16;:::i;:::-;58548:9;:29;;58540:55;;;;-1:-1:-1;;;58540:55:0;;11036:2:1;58540:55:0;;;11018:21:1;11075:2;11055:18;;;11048:30;-1:-1:-1;;;11094:18:1;;;11087:43;11147:18;;58540:55:0;11008:163:1;58540:55:0;58635:10;58616:30;;;;:18;:30;;;;;:42;;58650:8;;58616:30;:42;;58650:8;;58616:42;:::i;:::-;;;;-1:-1:-1;58677:31:0;;-1:-1:-1;58687:10:0;58699:8;58677:9;:31::i;58285:464::-;58794:8;58790:286;;58863:9;;58837:10;58827:21;;;;:9;:21;;;;;;:32;;58851:8;;58827:32;:::i;:::-;:45;;58819:83;;;;-1:-1:-1;;;58819:83:0;;12073:2:1;58819:83:0;;;12055:21:1;12112:2;12092:18;;;12085:30;-1:-1:-1;;;12131:18:1;;;12124:55;12196:18;;58819:83:0;12045:175:1;58819:83:0;-1:-1:-1;58940:8:0;58790:286;;;59025:9;;58999:10;58989:21;;;;:9;:21;;;;;;:32;;59013:8;;58989:32;:::i;:::-;:45;;58981:83;;;;-1:-1:-1;;;58981:83:0;;12073:2:1;58981:83:0;;;12055:21:1;12112:2;12092:18;;;12085:30;-1:-1:-1;;;12131:18:1;;;12124:55;12196:18;;58981:83:0;12045:175:1;58981:83:0;59093:12;;59090:355;;59153:15;;59143:7;;:25;;;;:::i;:::-;59125:15;:43;59122:312;;;59221:5;;59210:16;;:8;:16;:::i;:::-;59197:9;:29;;59189:55;;;;-1:-1:-1;;;59189:55:0;;11036:2:1;59189:55:0;;;11018:21:1;11075:2;11055:18;;;11048:30;-1:-1:-1;;;11094:18:1;;;11087:43;11147:18;;59189:55:0;11008:163:1;59189:55:0;59273:10;59263:21;;;;:9;:21;;;;;:33;;59288:8;;59263:21;:33;;59288:8;;59263:33;:::i;:::-;;;;-1:-1:-1;59315:31:0;;-1:-1:-1;59325:10:0;59337:8;59315:9;:31::i;59122:312::-;59387:31;;-1:-1:-1;;;59387:31:0;;10329:2:1;59387:31:0;;;10311:21:1;10368:2;10348:18;;;10341:30;-1:-1:-1;;;10387:18:1;;;10380:51;10448:18;;59387:31:0;10301:171:1;22959:308:0;-1:-1:-1;;;;;23058:31:0;;47882:10;23058:31;23054:61;;;23098:17;;-1:-1:-1;;;23098:17:0;;;;;;;;;;;23054:61;47882:10;23128:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;23128:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;23128:60:0;;;;;;;;;;23204:55;;9444:41:1;;;23128:49:0;;47882:10;23204:55;;9417:18:1;23204:55:0;;;;;;;22959:308;;:::o;52389:71::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;52437:8:::1;:15:::0;;-1:-1:-1;;;;52437:15:0::1;-1:-1:-1::0;;;52437:15:0::1;::::0;;52389:71::o;59460:254::-;50725:10;50718:18;;;;:6;:18;;;;;;;;50710:41;;;;-1:-1:-1;;;50710:41:0;;14162:2:1;50710:41:0;;;14144:21:1;14201:2;14181:18;;;14174:30;-1:-1:-1;;;14220:18:1;;;14213:40;14270:18;;50710:41:0;14134:160:1;50710:41:0;59577:13:::1;::::0;59551:10:::1;59537:25;::::0;;;:13:::1;:25;::::0;;;;;:36:::1;::::0;59565:8;;59537:36:::1;:::i;:::-;:53;;59529:85;;;::::0;-1:-1:-1;;;59529:85:0;;13453:2:1;59529:85:0::1;::::0;::::1;13435:21:1::0;13492:2;13472:18;;;13465:30;-1:-1:-1;;;13511:18:1;;;13504:49;13570:18;;59529:85:0::1;13425:169:1::0;59529:85:0::1;59639:10;59625:25;::::0;;;:13:::1;:25;::::0;;;;:37;;59654:8;;59625:25;:37:::1;::::0;59654:8;;59625:37:::1;:::i;:::-;::::0;;;-1:-1:-1;59675:31:0::1;::::0;-1:-1:-1;59685:10:0::1;59697:8:::0;59675:9:::1;:31::i;54095:122::-:0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54177:14:::1;:32:::0;54095:122::o;24066:396::-;24233:28;24243:4;24249:2;24253:7;24233:9;:28::i;:::-;-1:-1:-1;;;;;24276:14:0;;;:19;24272:183;;24315:56;24346:4;24352:2;24356:7;24365:5;24315:30;:56::i;:::-;24310:145;;24399:40;;-1:-1:-1;;;24399:40:0;;;;;;;;;;;24310:145;24066:396;;;;:::o;41825:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14397:7:0;14424:13;42010:7;:25;41977:103;;42059:9;41825:420;-1:-1:-1;;41825:420:0:o;41977:103::-;42102:21;42115:7;42102:12;:21::i;:::-;42090:33;;42138:9;:16;;;42134:65;;;42178:9;41825:420;-1:-1:-1;;41825:420:0:o;42134:65::-;42216:21;42229:7;42216:12;:21::i;52656:295::-;52721:13;52760:16;52768:7;52760;:16::i;:::-;52755:59;;52785:29;;-1:-1:-1;;;52785:29:0;;;;;;;;;;;52755:59;52827:18;52848:9;:7;:9::i;:::-;52875:8;;52827:30;;-1:-1:-1;;;;52875:8:0;;;;:68;;52939:4;52875:68;;;52910:4;52916:18;52926:7;52916:9;:18::i;:::-;52893:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52868:75;52656:295;-1:-1:-1;;;52656:295:0:o;54347:126::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;54431:15:::1;:34:::0;54347:126::o;23338:164::-;-1:-1:-1;;;;;23459:25:0;;;23435:4;23459:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23338:164::o;49993:201::-;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50082:22:0;::::1;50074:73;;;::::0;-1:-1:-1;;;50074:73:0;;9922:2:1;50074:73:0::1;::::0;::::1;9904:21:1::0;9961:2;9941:18;;;9934:30;10000:34;9980:18;;;9973:62;-1:-1:-1;;;10051:18:1;;;10044:36;10097:19;;50074:73:0::1;9894:228:1::0;50074:73:0::1;50158:28;50177:8;50158:18;:28::i;55485:284::-:0;49157:6;;-1:-1:-1;;;;;49157:6:0;47882:10;49304:23;49296:68;;;;-1:-1:-1;;;49296:68:0;;;;;;;:::i;:::-;55594:1:::1;55574:10;:17;:21;55566:45;;;;-1:-1:-1::0;;;55566:45:0::1;;;;;;;:::i;:::-;55624:22:::0;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;55661:9;55657:105;55676:10;:17;55672:1;:21;55657:105;;;55746:4;55715:13;:28;55729:10;55740:1;55729:13;;;;;;-1:-1:-1::0;;;55729:13:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;55715:28:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;55715:28:0;:35;;-1:-1:-1;;55715:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55695:3;::::1;::::0;::::1;:::i;:::-;;;;55657:105;;24717:273:::0;24774:4;24864:13;;24854:7;:23;24811:152;;;;-1:-1:-1;;24915:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;24915:43:0;:48;;24717:273::o;17919:1129::-;17986:7;18021;18123:13;;18116:4;:20;18112:869;;;18161:14;18178:23;;;:17;:23;;;;;;-1:-1:-1;;;18267:23:0;;18263:699;;18786:113;18793:11;18786:113;;-1:-1:-1;;;18864:6:0;18846:25;;;;:17;:25;;;;;;18786:113;;18263:699;18112:869;;19009:31;;-1:-1:-1;;;19009:31:0;;;;;;;;;;;29956:2515;30071:27;30101;30120:7;30101:18;:27::i;:::-;30071:57;;30186:4;-1:-1:-1;;;;;30145:45:0;30161:19;-1:-1:-1;;;;;30145:45:0;;30141:86;;30199:28;;-1:-1:-1;;;30199:28:0;;;;;;;;;;;30141:86;30240:22;47882:10;-1:-1:-1;;;;;30266:27:0;;;;:87;;-1:-1:-1;30310:43:0;30327:4;47882:10;23338:164;:::i;30310:43::-;30266:147;;;-1:-1:-1;47882:10:0;30370:20;30382:7;30370:11;:20::i;:::-;-1:-1:-1;;;;;30370:43:0;;30266:147;30240:174;;30432:17;30427:66;;30458:35;;-1:-1:-1;;;30458:35:0;;;;;;;;;;;30427:66;-1:-1:-1;;;;;30508:16:0;;30504:52;;30533:23;;-1:-1:-1;;;30533:23:0;;;;;;;;;;;30504:52;30685:24;;;;:15;:24;;;;;;;;30678:31;;-1:-1:-1;;;;;;30678:31:0;;;-1:-1:-1;;;;;31077:24:0;;;;;:18;:24;;;;;31075:26;;-1:-1:-1;;31075:26:0;;;31146:22;;;;;;;31144:24;;-1:-1:-1;31144:24:0;;;31439:26;;;:17;:26;;;;;-1:-1:-1;;;31527:15:0;12274:3;31527:41;31485:84;;:128;;31439:174;;;31733:46;;31729:626;;31837:1;31827:11;;31805:19;31960:30;;;:17;:30;;;;;;31956:384;;32098:13;;32083:11;:28;32079:242;;32245:30;;;;:17;:30;;;;;:52;;;32079:242;31729:626;;32402:7;32398:2;-1:-1:-1;;;;;32383:27:0;32392:4;-1:-1:-1;;;;;32383:27:0;-1:-1:-1;;;;;;;;;;;32383:27:0;;;;;;;;;29956:2515;;;;;:::o;32549:89::-;32609:21;32615:7;32624:5;32609;:21::i;50354:191::-;50447:6;;;-1:-1:-1;;;;;50464:17:0;;;-1:-1:-1;;;;;;50464:17:0;;;;;;;50497:40;;50447:6;;;50464:17;50447:6;;50497:40;;50428:16;;50497:40;50354:191;;:::o;19528:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;19648:24:0;;;;:17;:24;;;;;;19629:44;;:18;:44::i;25074:104::-;25143:27;25153:2;25157:8;25143:27;;;;;;;;;;;;:9;:27::i;59722:360::-;59808:4;59816:1;59808:9;59805:234;;;59849:10;59834:26;;;;:14;:26;;;;;:38;;59864:8;;59834:26;:38;;59864:8;;59834:38;:::i;:::-;;;;-1:-1:-1;59805:234:0;;-1:-1:-1;59805:234:0;;59893:4;59901:1;59893:9;59890:149;;;59935:10;59919:27;;;;:15;:27;;;;;:39;;59950:8;;59919:27;:39;;59950:8;;59919:39;:::i;59890:149::-;60004:10;59991:24;;;;:12;:24;;;;;:36;;60019:8;;59991:24;:36;;60019:8;;59991:36;:::i;:::-;;;;-1:-1:-1;;59890:149:0;60051:23;60061:2;60065:8;60051:9;:23::i;36168:716::-;36352:88;;-1:-1:-1;;;36352:88:0;;36331:4;;-1:-1:-1;;;;;36352:45:0;;;;;:88;;47882:10;;36419:4;;36425:7;;36434:5;;36352:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36352:88:0;;;;;;;;-1:-1:-1;;36352:88:0;;;;;;;;;;;;:::i;:::-;;;36348:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36635:13:0;;36631:235;;36681:40;;-1:-1:-1;;;36681:40:0;;;;;;;;;;;36631:235;36824:6;36818:13;36809:6;36805:2;36801:15;36794:38;36348:529;-1:-1:-1;;;;;;36511:64:0;-1:-1:-1;;;36511:64:0;;-1:-1:-1;36348:529:0;36168:716;;;;;;:::o;20184:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;20287:47:0;20306:27;20325:7;20306:18;:27::i;:::-;20287:18;:47::i;38910:1959::-;39381:4;39375:11;;39388:3;39371:21;;39466:17;;;;40163:11;;;40042:5;40295:2;40309;40299:13;;40291:22;40163:11;40278:36;40350:2;40340:13;;39933:682;40369:4;39933:682;;;40544:1;40539:3;40535:11;40528:18;;40595:2;40589:4;40585:13;40581:2;40577:22;40572:3;40564:36;40465:2;40455:13;;39933:682;;;-1:-1:-1;40657:13:0;;;-1:-1:-1;;40772:12:0;;;40832:19;;;40772:12;39006:1856;-1:-1:-1;39006:1856:0:o;32867:2809::-;32947:27;32977;32996:7;32977:18;:27::i;:::-;32947:57;-1:-1:-1;32947:57:0;33082:311;;;;33116:22;47882:10;-1:-1:-1;;;;;33142:27:0;;;;:91;;-1:-1:-1;33190:43:0;33207:4;47882:10;23338:164;:::i;33190:43::-;33142:155;;;-1:-1:-1;47882:10:0;33254:20;33266:7;33254:11;:20::i;:::-;-1:-1:-1;;;;;33254:43:0;;33142:155;33116:182;;33320:17;33315:66;;33346:35;;-1:-1:-1;;;33346:35:0;;;;;;;;;;;33315:66;33082:311;;33529:24;;;;:15;:24;;;;;;;;33522:31;;-1:-1:-1;;;;;;33522:31:0;;;-1:-1:-1;;;;;34142:24:0;;;;:18;:24;;;;;:59;;34170:31;34142:59;;;34439:26;;;:17;:26;;;;;-1:-1:-1;;;34529:15:0;12274:3;34529:41;34485:86;;:165;34439:211;;-1:-1:-1;;;34770:46:0;;34766:626;;34874:1;34864:11;;34842:19;34997:30;;;:17;:30;;;;;;34993:384;;35135:13;;35120:11;:28;35116:242;;35282:30;;;;:17;:30;;;;;:52;;;35116:242;34766:626;;35420:35;;35447:7;;35443:1;;-1:-1:-1;;;;;35420:35:0;;;-1:-1:-1;;;;;;;;;;;35420:35:0;35443:1;;35420:35;-1:-1:-1;;35643:12:0;:14;;;;;;-1:-1:-1;;32867:2809:0:o;19142:295::-;-1:-1:-1;;;;;;;;;;;;;19252:41:0;;;;12274:3;19338:32;;;-1:-1:-1;;;;;19304:67:0;-1:-1:-1;;;19304:67:0;-1:-1:-1;;;19401:23:0;;;:28;;-1:-1:-1;;;19382:47:0;-1:-1:-1;19142:295:0:o;25551:2236::-;25674:20;25697:13;-1:-1:-1;;;;;25725:16:0;;25721:48;;25750:19;;-1:-1:-1;;;25750:19:0;;;;;;;;;;;25721:48;25784:13;25780:44;;25806:18;;-1:-1:-1;;;25806:18:0;;;;;;;;;;;25780:44;-1:-1:-1;;;;;26373:22:0;;;;;;:18;:22;;;;11757:2;26373:22;;;:70;;26411:31;26399:44;;26373:70;;;26686:31;;;:17;:31;;;;;26779:15;12274:3;26779:41;26737:84;;-1:-1:-1;26857:13:0;;12537:3;26842:56;26737:162;26686:213;;:31;;26980:23;;;;27024:14;:19;27020:635;;27064:313;27095:38;;27120:12;;-1:-1:-1;;;;;27095:38:0;;;27112:1;;-1:-1:-1;;;;;;;;;;;27095:38:0;27112:1;;27095:38;27161:69;27200:1;27204:2;27208:14;;;;;;27224:5;27161:30;:69::i;:::-;27156:174;;27266:40;;-1:-1:-1;;;27266:40:0;;;;;;;;;;;27156:174;27372:3;27357:12;:18;27064:313;;27458:12;27441:13;;:29;27437:43;;27472:8;;;27437:43;27020:635;;;27521:119;27552:40;;27577:14;;;;;-1:-1:-1;;;;;27552:40:0;;;27569:1;;-1:-1:-1;;;;;;;;;;;27552:40:0;27569:1;;27552:40;27635:3;27620:12;:18;27521:119;;27020:635;-1:-1:-1;27669:13:0;:28;;;27719:60;;27752:2;27756:12;27770:8;27719:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:196::-;662:6;715:2;703:9;694:7;690:23;686:32;683:2;;;736:6;728;721:22;683:2;764:29;783:9;764:29;:::i;804:270::-;872:6;880;933:2;921:9;912:7;908:23;904:32;901:2;;;954:6;946;939:22;901:2;982:29;1001:9;982:29;:::i;:::-;972:39;;1030:38;1064:2;1053:9;1049:18;1030:38;:::i;:::-;1020:48;;891:183;;;;;:::o;1079:338::-;1156:6;1164;1172;1225:2;1213:9;1204:7;1200:23;1196:32;1193:2;;;1246:6;1238;1231:22;1193:2;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1407:2;1396:9;1392:18;1379:32;1369:42;;1183:234;;;;;:::o;1422:696::-;1517:6;1525;1533;1541;1594:3;1582:9;1573:7;1569:23;1565:33;1562:2;;;1616:6;1608;1601:22;1562:2;1644:29;1663:9;1644:29;:::i;:::-;1634:39;;1692:38;1726:2;1715:9;1711:18;1692:38;:::i;:::-;1682:48;;1777:2;1766:9;1762:18;1749:32;1739:42;;1832:2;1821:9;1817:18;1804:32;-1:-1:-1;;;;;1851:6:1;1848:30;1845:2;;;1896:6;1888;1881:22;1845:2;1924:22;;1977:4;1969:13;;1965:27;-1:-1:-1;1955:2:1;;2011:6;2003;1996:22;1955:2;2039:73;2104:7;2099:2;2086:16;2081:2;2077;2073:11;2039:73;:::i;:::-;2029:83;;;1552:566;;;;;;;:::o;2123:367::-;2188:6;2196;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2298:29;2317:9;2298:29;:::i;:::-;2288:39;;2377:2;2366:9;2362:18;2349:32;2424:5;2417:13;2410:21;2403:5;2400:32;2390:2;;2451:6;2443;2436:22;2390:2;2479:5;2469:15;;;2207:283;;;;;:::o;2495:264::-;2563:6;2571;2624:2;2612:9;2603:7;2599:23;2595:32;2592:2;;;2645:6;2637;2630:22;2592:2;2673:29;2692:9;2673:29;:::i;:::-;2663:39;2749:2;2734:18;;;;2721:32;;-1:-1:-1;;;2582:177:1:o;2764:332::-;2841:6;2849;2857;2910:2;2898:9;2889:7;2885:23;2881:32;2878:2;;;2931:6;2923;2916:22;2878:2;2959:29;2978:9;2959:29;:::i;:::-;2949:39;3035:2;3020:18;;3007:32;;-1:-1:-1;3086:2:1;3071:18;;;3058:32;;2868:228;-1:-1:-1;;;2868:228:1:o;3101:953::-;3185:6;3216:2;3259;3247:9;3238:7;3234:23;3230:32;3227:2;;;3280:6;3272;3265:22;3227:2;3325:9;3312:23;-1:-1:-1;;;;;3350:6:1;3347:30;3344:2;;;3395:6;3387;3380:22;3344:2;3423:22;;3476:4;3468:13;;3464:27;-1:-1:-1;3454:2:1;;3510:6;3502;3495:22;3454:2;3551;3538:16;3574:60;3590:43;3630:2;3590:43;:::i;:::-;3574:60;:::i;:::-;3656:3;3680:2;3675:3;3668:15;3708:2;3703:3;3699:12;3692:19;;3739:2;3735;3731:11;3787:7;3782:2;3776;3773:1;3769:10;3765:2;3761:19;3757:28;3754:41;3751:2;;;3813:6;3805;3798:22;3751:2;3840:6;3831:15;;3855:169;3869:2;3866:1;3863:9;3855:169;;;3926:23;3945:3;3926:23;:::i;:::-;3914:36;;3887:1;3880:9;;;;;3970:12;;;;4002;;3855:169;;;-1:-1:-1;4043:5:1;3196:858;-1:-1:-1;;;;;;;3196:858:1:o;4059:947::-;4143:6;4174:2;4217;4205:9;4196:7;4192:23;4188:32;4185:2;;;4238:6;4230;4223:22;4185:2;4283:9;4270:23;-1:-1:-1;;;;;4308:6:1;4305:30;4302:2;;;4353:6;4345;4338:22;4302:2;4381:22;;4434:4;4426:13;;4422:27;-1:-1:-1;4412:2:1;;4468:6;4460;4453:22;4412:2;4509;4496:16;4532:60;4548:43;4588:2;4548:43;:::i;4532:60::-;4614:3;4638:2;4633:3;4626:15;4666:2;4661:3;4657:12;4650:19;;4697:2;4693;4689:11;4745:7;4740:2;4734;4731:1;4727:10;4723:2;4719:19;4715:28;4712:41;4709:2;;;4771:6;4763;4756:22;4709:2;4798:6;4789:15;;4813:163;4827:2;4824:1;4821:9;4813:163;;;4884:17;;4872:30;;4845:1;4838:9;;;;;4922:12;;;;4954;;4813:163;;5011:255;5069:6;5122:2;5110:9;5101:7;5097:23;5093:32;5090:2;;;5143:6;5135;5128:22;5090:2;5187:9;5174:23;5206:30;5230:5;5206:30;:::i;5271:259::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:2;;;5414:6;5406;5399:22;5361:2;5451:9;5445:16;5470:30;5494:5;5470:30;:::i;5535:480::-;5604:6;5657:2;5645:9;5636:7;5632:23;5628:32;5625:2;;;5678:6;5670;5663:22;5625:2;5723:9;5710:23;-1:-1:-1;;;;;5748:6:1;5745:30;5742:2;;;5793:6;5785;5778:22;5742:2;5821:22;;5874:4;5866:13;;5862:27;-1:-1:-1;5852:2:1;;5908:6;5900;5893:22;5852:2;5936:73;6001:7;5996:2;5983:16;5978:2;5974;5970:11;5936:73;:::i;6020:190::-;6079:6;6132:2;6120:9;6111:7;6107:23;6103:32;6100:2;;;6153:6;6145;6138:22;6100:2;-1:-1:-1;6181:23:1;;6090:120;-1:-1:-1;6090:120:1:o;6215:257::-;6256:3;6294:5;6288:12;6321:6;6316:3;6309:19;6337:63;6393:6;6386:4;6381:3;6377:14;6370:4;6363:5;6359:16;6337:63;:::i;:::-;6454:2;6433:15;-1:-1:-1;;6429:29:1;6420:39;;;;6461:4;6416:50;;6264:208;-1:-1:-1;;6264:208:1:o;6760:470::-;6939:3;6977:6;6971:13;6993:53;7039:6;7034:3;7027:4;7019:6;7015:17;6993:53;:::i;:::-;7109:13;;7068:16;;;;7131:57;7109:13;7068:16;7165:4;7153:17;;7131:57;:::i;:::-;7204:20;;6947:283;-1:-1:-1;;;;6947:283:1:o;7443:488::-;-1:-1:-1;;;;;7712:15:1;;;7694:34;;7764:15;;7759:2;7744:18;;7737:43;7811:2;7796:18;;7789:34;;;7859:3;7854:2;7839:18;;7832:31;;;7637:4;;7880:45;;7905:19;;7897:6;7880:45;:::i;:::-;7872:53;7646:285;-1:-1:-1;;;;;;7646:285:1:o;7936:723::-;8167:2;8219:21;;;8289:13;;8192:18;;;8311:22;;;8138:4;;8167:2;8390:15;;;;8364:2;8349:18;;;8138:4;8436:197;8450:6;8447:1;8444:13;8436:197;;;8499:52;8547:3;8538:6;8532:13;6561:12;;-1:-1:-1;;;;;6557:38:1;6545:51;;6649:4;6638:16;;;6632:23;-1:-1:-1;;;;;6628:48:1;6612:14;;;6605:72;6740:4;6729:16;;;6723:23;6716:31;6709:39;6693:14;;6686:63;6535:220;8499:52;8608:15;;;;8580:4;8571:14;;;;;8472:1;8465:9;8436:197;;8664:635;8835:2;8887:21;;;8957:13;;8860:18;;;8979:22;;;8806:4;;8835:2;9058:15;;;;9032:2;9017:18;;;8806:4;9104:169;9118:6;9115:1;9112:13;9104:169;;;9179:13;;9167:26;;9248:15;;;;9213:12;;;;9140:1;9133:9;9104:169;;9496:219;9645:2;9634:9;9627:21;9608:4;9665:44;9705:2;9694:9;9690:18;9682:6;9665:44;:::i;12911:335::-;13113:2;13095:21;;;13152:2;13132:18;;;13125:30;-1:-1:-1;;;13186:2:1;13171:18;;13164:41;13237:2;13222:18;;13085:161::o;13599:356::-;13801:2;13783:21;;;13820:18;;;13813:30;13879:34;13874:2;13859:18;;13852:62;13946:2;13931:18;;13773:182::o;15349:263::-;6561:12;;-1:-1:-1;;;;;6557:38:1;6545:51;;6649:4;6638:16;;;6632:23;-1:-1:-1;;;;;6628:48:1;6612:14;;;6605:72;6740:4;6729:16;;;6723:23;6716:31;6709:39;6693:14;;;6686:63;15543:2;15528:18;;15555:51;6535:220;15799:275;15870:2;15864:9;15935:2;15916:13;;-1:-1:-1;;15912:27:1;15900:40;;-1:-1:-1;;;;;15955:34:1;;15991:22;;;15952:62;15949:2;;;16017:18;;:::i;:::-;16053:2;16046:22;15844:230;;-1:-1:-1;15844:230:1:o;16079:183::-;16139:4;-1:-1:-1;;;;;16164:6:1;16161:30;16158:2;;;16194:18;;:::i;:::-;-1:-1:-1;16239:1:1;16235:14;16251:4;16231:25;;16148:114::o;16267:128::-;16307:3;16338:1;16334:6;16331:1;16328:13;16325:2;;;16344:18;;:::i;:::-;-1:-1:-1;16380:9:1;;16315:80::o;16400:168::-;16440:7;16506:1;16502;16498:6;16494:14;16491:1;16488:21;16483:1;16476:9;16469:17;16465:45;16462:2;;;16513:18;;:::i;:::-;-1:-1:-1;16553:9:1;;16452:116::o;16573:125::-;16613:4;16641:1;16638;16635:8;16632:2;;;16646:18;;:::i;:::-;-1:-1:-1;16683:9:1;;16622:76::o;16703:258::-;16775:1;16785:113;16799:6;16796:1;16793:13;16785:113;;;16875:11;;;16869:18;16856:11;;;16849:39;16821:2;16814:10;16785:113;;;16916:6;16913:1;16910:13;16907:2;;;-1:-1:-1;;16951:1:1;16933:16;;16926:27;16756:205::o;16966:380::-;17045:1;17041:12;;;;17088;;;17109:2;;17163:4;17155:6;17151:17;17141:27;;17109:2;17216;17208:6;17205:14;17185:18;17182:38;17179:2;;;17262:10;17257:3;17253:20;17250:1;17243:31;17297:4;17294:1;17287:15;17325:4;17322:1;17315:15;17179:2;;17021:325;;;:::o;17351:135::-;17390:3;-1:-1:-1;;17411:17:1;;17408:2;;;17431:18;;:::i;:::-;-1:-1:-1;17478:1:1;17467:13;;17398:88::o;17491:127::-;17552:10;17547:3;17543:20;17540:1;17533:31;17583:4;17580:1;17573:15;17607:4;17604:1;17597:15;17623:127;17684:10;17679:3;17675:20;17672:1;17665:31;17715:4;17712:1;17705:15;17739:4;17736:1;17729:15;17755:131;-1:-1:-1;;;;;;17829:32:1;;17819:43;;17809:2;;17876:1;17873;17866:12

Swarm Source

ipfs://16cfe8cc7bc5e5a903efd7e81842e0a311fc36a6b5bfcd603dc3e4e63518154f
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.