ETH Price: $3,365.24 (+0.52%)

Token

THEJIMS (JIMS)
 

Overview

Max Total Supply

5,678 JIMS

Holders

2,756

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
plisskenmgs.eth
Balance
1 JIMS
0x0bbb59a521c625c9d1f9b745ad3c13ef5b97a399
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:
THEJIMS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-13
*/

// SPDX-License-Identifier: MIT

// TheJIMS NFT
// Max Supply = 5678
// Max per wallet = 5
// 1 free, rest 0.0055 eth each
// THE GAME IS ABOUT TO BEGIN

// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((#@@@@@@@@@@((@@@@@@@@@@(((@@@@@@@@@(((((%@@@@@@@@(((((@@@@@@@@@@&(((((
// ((((((((((#@@@@@@@@@@((@@@@@@@@@@(((@@@@@@@@@@&((@@@@@@@@@@((#@@@@@@@@@@@@@@@(((
// (((((((((((((&@@@@@((((((@@@@@@(((((((@@@@@@@@@@@@@@@@@@@((((#@@@@@(((((@@@@@(((
// (((((((((((((&@@@@@((((((@@@@@@(((((((@@@@@%@@@@@@@@@@@@@(((((@@@@@@@@@@@@@(((((
// (((((((((((((&@@@@@((((((@@@@@@(((((((@@@@@((@@@@@((@@@@@((((((((&@@@@@@@@@@@(((
// (((%@@@@@((((&@@@@@((((((@@@@@@(((((((@@@@@(((&@&(((@@@@@((((#@@@@@(((((@@@@@(((
// ((((@@@@@@@@@@@@@@(((((@@@@@@@@@@(((@@@@@@@@@@(((&@@@@@@@@@(((@@@@@@@@@@@@@@@(((
// (((((((@@@@@@@@#(((((((@@@@@@@@@@(((@@@@@@@@@@(((&@@@@@@@@@((((((@@@@@@@@@((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

pragma solidity ^0.8.0;

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

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

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

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;

        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length)
        internal
        pure
        returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

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

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

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

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

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

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

interface IERC721 is IERC165 {
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

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

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

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

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

    function approve(address to, uint256 tokenId) external;

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

    function setApprovalForAll(address operator, bool _approved) external;

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

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

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);

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

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

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

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

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

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 1;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;
    string private _name;
    string private _symbol;
    mapping(uint256 => TokenOwnership) private _ownerships;
    mapping(address => AddressData) private _addressData;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

    function totalSupply() public view override returns (uint256) {
        return currentIndex - 1;
    }

    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

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

    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

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

        revert("ERC721A: unable to determine the owner of token");
    }

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

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

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

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

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

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

    function _getUriExtension() internal view virtual returns (string memory) {
        return "";
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721A: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

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

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

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

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

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

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

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

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

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

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);
        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

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

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

contract THEJIMS is Ownable, ERC721A, ReentrancyGuard {
    using Strings for uint256;
    using SafeMath for uint256;
    bool public burnable;

    string public uriSuffix = ".json";

    uint256 public MAX_PER_Transaction = 5; // maximum amount that user can mint per transaction
    uint256 public TotalCollectionSize_ = 5678; // total number of nfts
    uint256 public MAX_PER_Wallet = 5;

    //prices

    uint256 public price = 0.0055 ether;

    uint256 private constant MaxMintPerBatch_ = 200; //max mint per traction
    uint256 public remaining;

    mapping(uint256 => uint256) public cache;
    mapping(uint256 => uint256) public cachePosition;

    bool public paused = true;
    bool public presaleIsActive = false;

    string private baseTokenURI = "";

    bytes32 public merkleRoot;

    constructor()
        ERC721A("THEJIMS", "JIMS", MaxMintPerBatch_, TotalCollectionSize_)
    {}

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A)
        returns (bool)
    {
        return
            interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }

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

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

    // function hashTransaction(address sender, uint256 qty, address address_) private pure returns(bytes32)
    // {
    //       bytes32 hash = keccak256(abi.encodePacked(
    //         "\x19Ethereum Signed Message:\n32",
    //         keccak256(abi.encodePacked(sender, qty, address_)))
    //       );
    //       return hash;
    // }

    function burn(uint256 tokenId) external returns (uint256) {
        require(burnable, "This contract does not allow burning");
        require(
            msg.sender == ownerOf(tokenId),
            "Burner is not the owner of token"
        );
        // _burn(tokenId);
        return tokenId;
    }

    function VerifyMessage(
        bytes32 _hashedMessage,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public pure returns (address) {
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 prefixedHashMessage = keccak256(
            abi.encodePacked(prefix, _hashedMessage)
        );
        address signer = ecrecover(prefixedHashMessage, _v, _r, _s);
        return signer;
    }

    function mint(uint256 quantity) public payable {
        require(!paused, "mint is paused");
        require(
            totalSupply() + quantity <= TotalCollectionSize_,
            "reached max supply"
        );
        require(
            numberMinted(msg.sender) + quantity <= MAX_PER_Wallet,
            "limit per wallet exceeded"
        );
        require(quantity <= MAX_PER_Transaction, "can not mint this many");

        if (msg.value == 0 && quantity == 1) {
            require(balanceOf(msg.sender) < 1, "Already minted free!");
            _safeMint(msg.sender, quantity);
        } else if (balanceOf(msg.sender) >= 1) {
            require(msg.value >= _shouldPay(quantity), "Insufficient funds!");
            _safeMint(msg.sender, quantity);
        } else {
            require(
                msg.value >= _shouldPay(quantity - 1),
                "Insufficient funds!"
            );
            _safeMint(msg.sender, quantity);
        }
    }

    function _shouldPay(uint256 _quantity) private view returns (uint256) {
        uint256 shouldPay = price * _quantity;
        return shouldPay;
    }

    function isValid(bytes32[] memory merkleproof, bytes32 leaf)
        public
        view
        returns (bool)
    {
        return MerkleProof.verify(merkleproof, merkleRoot, leaf);
    }

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

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

    function airdrop(address[] memory address_, uint256 tokenCount)
        external
        onlyOwner
        returns (uint256)
    {
        require(
            totalSupply() + address_.length * tokenCount <=
                TotalCollectionSize_,
            "This exceeds the maximum number of NFTs on sale!"
        );
        for (uint256 i = 0; i < address_.length; ) {
            _safeMint(address_[i], tokenCount);
            ++i;
        }
        return totalSupply();
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

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

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

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

    function setMAX_PER_Transaction(uint256 q) public onlyOwner {
        MAX_PER_Transaction = q;
    }

    function setCollectionSize(uint256 q) public onlyOwner {
        TotalCollectionSize_ = q;
    }

    function setMaxPerWallet(uint256 _newLimit) public onlyOwner {
        MAX_PER_Wallet = _newLimit;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TotalCollectionSize_","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hashedMessage","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"VerifyMessage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"address_","type":"address[]"},{"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"airdrop","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cache","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cachePosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":"bytes32[]","name":"merkleproof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600180556000600855610100604052600560c081905264173539b7b760d91b60e09081526200003291600b91906200024c565b506005600c81905561162e600d55600e5566138a388a43c000600f556013805461ffff191660011790556040805160208101918290526000908190526200007c916014916200024c565b503480156200008a57600080fd5b50604051806040016040528060078152602001665448454a494d5360c81b815250604051806040016040528060048152602001634a494d5360e01b81525060c8600d54620000e7620000e1620001f860201b60201c565b620001fc565b60008111620001545760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001b65760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200014b565b8351620001cb9060029060208701906200024c565b508251620001e19060039060208601906200024c565b5060a091909152608052505060016009556200032f565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200025a90620002f2565b90600052602060002090601f0160209004810192826200027e5760008555620002c9565b82601f106200029957805160ff1916838001178555620002c9565b82800160010185558215620002c9579182015b82811115620002c9578251825591602001919060010190620002ac565b50620002d7929150620002db565b5090565b5b80821115620002d75760008155600101620002dc565b600181811c908216806200030757607f821691505b602082108114156200032957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051612d666200036060003960008181611cce01528181611cf801526121f7015260005050612d666000f3fe6080604052600436106102885760003560e01c80635c975abb1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd14610799578063d7224ba0146107b9578063dc33e681146107cf578063e268e4d3146107ef578063e985e9c51461080f578063f2fde38b1461085857600080fd5b8063a22cb465146106cc578063aca8ffe7146106ec578063b88d4fde1461070c578063b8a20ed01461072c578063c204642c1461074c578063c31f7dcf1461076c57600080fd5b80638da5cb5b116101135780638da5cb5b146106095780639231ab2a1461062757806395d89b4114610674578063a035b1fe14610689578063a0712d681461069f578063a07c7ce4146106b257600080fd5b80635c975abb1461055a5780636352211e14610574578063659934c11461059457806370a08231146105b4578063715018a6146105d45780637cb64759146105e957600080fd5b80632eb4a7ab116101fe57806349590657116101b757806349590657146104c45780634f6ccce7146104d957806351d7ff93146104f95780635503a0e81461050f57806355234ec01461052457806355f804b31461053a57600080fd5b80632eb4a7ab1461041a5780632f745c591461043057806330f72cd4146104505780633ccfd60b1461046f57806342842e0e1461048457806342966c68146104a457600080fd5b80630e775209116102505780630e7752091461035e57806317bf72c61461038257806317e04a71146103af57806318160ddd146103c557806323b872dd146103da57806325dc45ce146103fa57600080fd5b806301ffc9a71461028d57806302329a29146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046128a1565b610878565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd36600461282a565b6108a3565b005b3480156102f057600080fd5b506102f96108e9565b6040516102b99190612a72565b34801561031257600080fd5b50610326610321366004612845565b61097b565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e26103593660046126ca565b610a06565b34801561036a57600080fd5b50610374600d5481565b6040519081526020016102b9565b34801561038e57600080fd5b5061037461039d366004612845565b60116020526000908152604090205481565b3480156103bb57600080fd5b50610374600e5481565b3480156103d157600080fd5b50610374610b1e565b3480156103e657600080fd5b506102e26103f53660046125e9565b610b33565b34801561040657600080fd5b506102e2610415366004612845565b610b3e565b34801561042657600080fd5b5061037460155481565b34801561043c57600080fd5b5061037461044b3660046126ca565b610b6d565b34801561045c57600080fd5b506013546102ad90610100900460ff1681565b34801561047b57600080fd5b506102e2610ce4565b34801561049057600080fd5b506102e261049f3660046125e9565b610dce565b3480156104b057600080fd5b506103746104bf366004612845565b610de9565b3480156104d057600080fd5b50601554610374565b3480156104e557600080fd5b506103746104f4366004612845565b610eb7565b34801561050557600080fd5b50610374600c5481565b34801561051b57600080fd5b506102f9610f1b565b34801561053057600080fd5b5061037460105481565b34801561054657600080fd5b506102e26105553660046128db565b610fa9565b34801561056657600080fd5b506013546102ad9060ff1681565b34801561058057600080fd5b5061032661058f366004612845565b610fea565b3480156105a057600080fd5b506103266105af36600461285e565b610ffc565b3480156105c057600080fd5b506103746105cf36600461259b565b6110d0565b3480156105e057600080fd5b506102e2611161565b3480156105f557600080fd5b506102e2610604366004612845565b611197565b34801561061557600080fd5b506000546001600160a01b0316610326565b34801561063357600080fd5b50610647610642366004612845565b6111c6565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102b9565b34801561068057600080fd5b506102f96111e3565b34801561069557600080fd5b50610374600f5481565b6102e26106ad366004612845565b6111f2565b3480156106be57600080fd5b50600a546102ad9060ff1681565b3480156106d857600080fd5b506102e26106e73660046126a0565b61141f565b3480156106f857600080fd5b506102e2610707366004612845565b6114e4565b34801561071857600080fd5b506102e2610727366004612625565b611513565b34801561073857600080fd5b506102ad61074736600461279d565b61154c565b34801561075857600080fd5b506103746107673660046126f4565b611562565b34801561077857600080fd5b50610374610787366004612845565b60126020526000908152604090205481565b3480156107a557600080fd5b506102f96107b4366004612845565b61165e565b3480156107c557600080fd5b5061037460085481565b3480156107db57600080fd5b506103746107ea36600461259b565b61172d565b3480156107fb57600080fd5b506102e261080a366004612845565b611738565b34801561081b57600080fd5b506102ad61082a3660046125b6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561086457600080fd5b506102e261087336600461259b565b611767565b600063152a902d60e11b6001600160e01b03198316148061089d575061089d826117ff565b92915050565b6000546001600160a01b031633146108d65760405162461bcd60e51b81526004016108cd90612a85565b60405180910390fd5b6013805460ff1916911515919091179055565b6060600280546108f890612c58565b80601f016020809104026020016040519081016040528092919081815260200182805461092490612c58565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b6000610988826001541190565b6109ea5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016108cd565b506000908152600660205260409020546001600160a01b031690565b6000610a1182610fea565b9050806001600160a01b0316836001600160a01b03161415610a805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108cd565b336001600160a01b0382161480610a9c5750610a9c813361082a565b610b0e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108cd565b610b1983838361186a565b505050565b600060018054610b2e9190612bfe565b905090565b610b198383836118c6565b6000546001600160a01b03163314610b685760405162461bcd60e51b81526004016108cd90612a85565b600c55565b6000610b78836110d0565b8210610bd15760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108cd565b6000610bdb610b1e565b905060008060005b83811015610c84576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c3557805192505b876001600160a01b0316836001600160a01b03161415610c715786841415610c635750935061089d92505050565b83610c6d81612c93565b9450505b5080610c7c81612c93565b915050610be3565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108cd565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016108cd90612a85565b60026009541415610d615760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108cd565b6002600955600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610db3576040519150601f19603f3d011682016040523d82523d6000602084013e610db8565b606091505b5050905080610dc657600080fd5b506001600955565b610b1983838360405180602001604052806000815250611513565b600a5460009060ff16610e4a5760405162461bcd60e51b8152602060048201526024808201527f5468697320636f6e747261637420646f6573206e6f7420616c6c6f77206275726044820152636e696e6760e01b60648201526084016108cd565b610e5382610fea565b6001600160a01b0316336001600160a01b031614610eb35760405162461bcd60e51b815260206004820181905260248201527f4275726e6572206973206e6f7420746865206f776e6572206f6620746f6b656e60448201526064016108cd565b5090565b6000610ec1610b1e565b8210610eb35760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108cd565b600b8054610f2890612c58565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490612c58565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505081565b6000546001600160a01b03163314610fd35760405162461bcd60e51b81526004016108cd90612a85565b8051610fe6906014906020840190612488565b5050565b6000610ff582611c4c565b5192915050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161104c92919061294f565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156110b7573d6000803e3d6000fd5b5050604051601f1901519450505050505b949350505050565b60006001600160a01b03821661113c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108cd565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461118b5760405162461bcd60e51b81526004016108cd90612a85565b6111956000611df5565b565b6000546001600160a01b031633146111c15760405162461bcd60e51b81526004016108cd90612a85565b601555565b604080518082019091526000808252602082015261089d82611c4c565b6060600380546108f890612c58565b60135460ff16156112365760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b60448201526064016108cd565b600d5481611242610b1e565b61124c9190612b8b565b111561128f5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b60448201526064016108cd565b600e548161129c3361172d565b6112a69190612b8b565b11156112f45760405162461bcd60e51b815260206004820152601960248201527f6c696d6974207065722077616c6c65742065786365656465640000000000000060448201526064016108cd565b600c5481111561133f5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b60448201526064016108cd565b3415801561134d5750806001145b156113ae57600161135d336110d0565b106113a15760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206d696e74656420667265652160601b60448201526064016108cd565b6113ab3382611e45565b50565b60016113b9336110d0565b1061140c576113c781611e5f565b3410156113a15760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016108cd565b6113c761141a600183612bfe565b611e5f565b6001600160a01b0382163314156114785760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108cd565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b0316331461150e5760405162461bcd60e51b81526004016108cd90612a85565b600d55565b61151e8484846118c6565b61152a84848484611e70565b6115465760405162461bcd60e51b81526004016108cd90612aba565b50505050565b600061155b8360155484611f7a565b9392505050565b600080546001600160a01b0316331461158d5760405162461bcd60e51b81526004016108cd90612a85565b600d5482845161159d9190612bb7565b6115a5610b1e565b6115af9190612b8b565b11156116165760405162461bcd60e51b815260206004820152603060248201527f54686973206578636565647320746865206d6178696d756d206e756d6265722060448201526f6f66204e465473206f6e2073616c652160801b60648201526084016108cd565b60005b83518110156116555761164584828151811061163757611637612cee565b602002602001015184611e45565b61164e81612c93565b9050611619565b5061155b610b1e565b606061166b826001541190565b6116cf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108cd565b60006116d9611f90565b905060008151116116f9576040518060200160405280600081525061155b565b8061170384611f9f565b600b60405160200161171793929190612971565b6040516020818303038152906040529392505050565b600061089d8261209c565b6000546001600160a01b031633146117625760405162461bcd60e51b81526004016108cd90612a85565b600e55565b6000546001600160a01b031633146117915760405162461bcd60e51b81526004016108cd90612a85565b6001600160a01b0381166117f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6113ab81611df5565b60006001600160e01b031982166380ac58cd60e01b148061183057506001600160e01b03198216635b5e139f60e01b145b8061184b57506001600160e01b0319821663780e9d6360e01b145b8061089d57506301ffc9a760e01b6001600160e01b031983161461089d565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118d182611c4c565b80519091506000906001600160a01b0316336001600160a01b031614806119085750336118fd8461097b565b6001600160a01b0316145b8061191a5750815161191a903361082a565b9050806119845760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108cd565b846001600160a01b031682600001516001600160a01b0316146119f85760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108cd565b6001600160a01b038416611a5c5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108cd565b611a6c600084846000015161186a565b6001600160a01b0385166000908152600560205260408120805460019290611a9e9084906001600160801b0316612bd6565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611aea91859116612b60565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b71846001612b8b565b6000818152600460205260409020549091506001600160a01b0316611c0257611b9b816001541190565b15611c025760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c6b826001541190565b611cca5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108cd565b60007f00000000000000000000000000000000000000000000000000000000000000008310611d2b57611d1d7f000000000000000000000000000000000000000000000000000000000000000084612bfe565b611d28906001612b8b565b90505b825b818110611d94576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d8157949350505050565b5080611d8c81612c41565b915050611d2d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108cd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610fe682826040518060200160405280600081525061213a565b60008082600f5461155b9190612bb7565b60006001600160a01b0384163b15611f7257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611eb4903390899088908890600401612a35565b602060405180830381600087803b158015611ece57600080fd5b505af1925050508015611efe575060408051601f3d908101601f19168201909252611efb918101906128be565b60015b611f58573d808015611f2c576040519150601f19603f3d011682016040523d82523d6000602084013e611f31565b606091505b508051611f505760405162461bcd60e51b81526004016108cd90612aba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110c8565b5060016110c8565b600082611f878584612414565b14949350505050565b6060601480546108f890612c58565b606081611fc35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fed5780611fd781612c93565b9150611fe69050600a83612ba3565b9150611fc7565b6000816001600160401b0381111561200757612007612d04565b6040519080825280601f01601f191660200182016040528015612031576020820181803683370190505b5090505b84156110c857612046600183612bfe565b9150612053600a86612cae565b61205e906030612b8b565b60f81b81838151811061207357612073612cee565b60200101906001600160f81b031916908160001a905350612095600a86612ba3565b9450612035565b60006001600160a01b03821661210e5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016108cd565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b03841661219d5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108cd565b6121a8816001541190565b156121f55760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108cd565b7f00000000000000000000000000000000000000000000000000000000000000008311156122705760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108cd565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122cc908790612b60565b6001600160801b031681526020018583602001516122ea9190612b60565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156124095760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123cd6000888488611e70565b6123e95760405162461bcd60e51b81526004016108cd90612aba565b816123f381612c93565b925050808061240190612c93565b915050612380565b506001819055611c44565b600081815b845181101561248057600085828151811061243657612436612cee565b6020026020010151905080831161245c576000838152602082905260409020925061246d565b600081815260208490526040902092505b508061247881612c93565b915050612419565b509392505050565b82805461249490612c58565b90600052602060002090601f0160209004810192826124b657600085556124fc565b82601f106124cf57805160ff19168380011785556124fc565b828001600101855582156124fc579182015b828111156124fc5782518255916020019190600101906124e1565b50610eb39291505b80821115610eb35760008155600101612504565b60006001600160401b0383111561253157612531612d04565b612544601f8401601f1916602001612b0d565b905082815283838301111561255857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461258657600080fd5b919050565b8035801515811461258657600080fd5b6000602082840312156125ad57600080fd5b61155b8261256f565b600080604083850312156125c957600080fd5b6125d28361256f565b91506125e06020840161256f565b90509250929050565b6000806000606084860312156125fe57600080fd5b6126078461256f565b92506126156020850161256f565b9150604084013590509250925092565b6000806000806080858703121561263b57600080fd5b6126448561256f565b93506126526020860161256f565b92506040850135915060608501356001600160401b0381111561267457600080fd5b8501601f8101871361268557600080fd5b61269487823560208401612518565b91505092959194509250565b600080604083850312156126b357600080fd5b6126bc8361256f565b91506125e06020840161258b565b600080604083850312156126dd57600080fd5b6126e68361256f565b946020939093013593505050565b6000806040838503121561270757600080fd5b82356001600160401b0381111561271d57600080fd5b8301601f8101851361272e57600080fd5b8035602061274361273e83612b3d565b612b0d565b80838252828201915082850189848660051b880101111561276357600080fd5b600095505b8486101561278d576127798161256f565b835260019590950194918301918301612768565b5098969091013596505050505050565b600080604083850312156127b057600080fd5b82356001600160401b038111156127c657600080fd5b8301601f810185136127d757600080fd5b803560206127e761273e83612b3d565b80838252828201915082850189848660051b880101111561280757600080fd5b600095505b8486101561278d57803583526001959095019491830191830161280c565b60006020828403121561283c57600080fd5b61155b8261258b565b60006020828403121561285757600080fd5b5035919050565b6000806000806080858703121561287457600080fd5b84359350602085013560ff8116811461288c57600080fd5b93969395505050506040820135916060013590565b6000602082840312156128b357600080fd5b813561155b81612d1a565b6000602082840312156128d057600080fd5b815161155b81612d1a565b6000602082840312156128ed57600080fd5b81356001600160401b0381111561290357600080fd5b8201601f8101841361291457600080fd5b6110c884823560208401612518565b6000815180845261293b816020860160208601612c15565b601f01601f19169290920160200192915050565b60008351612961818460208801612c15565b9190910191825250602001919050565b6000845160206129848285838a01612c15565b8551918401916129978184848a01612c15565b8554920191600090600181811c90808316806129b457607f831692505b8583108114156129d257634e487b7160e01b85526022600452602485fd5b8080156129e657600181146129f757612a24565b60ff19851688528388019550612a24565b60008b81526020902060005b85811015612a1c5781548a820152908401908801612a03565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a6890830184612923565b9695505050505050565b60208152600061155b6020830184612923565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612b3557612b35612d04565b604052919050565b60006001600160401b03821115612b5657612b56612d04565b5060051b60200190565b60006001600160801b03808316818516808303821115612b8257612b82612cc2565b01949350505050565b60008219821115612b9e57612b9e612cc2565b500190565b600082612bb257612bb2612cd8565b500490565b6000816000190483118215151615612bd157612bd1612cc2565b500290565b60006001600160801b0383811690831681811015612bf657612bf6612cc2565b039392505050565b600082821015612c1057612c10612cc2565b500390565b60005b83811015612c30578181015183820152602001612c18565b838111156115465750506000910152565b600081612c5057612c50612cc2565b506000190190565b600181811c90821680612c6c57607f821691505b60208210811415612c8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ca757612ca7612cc2565b5060010190565b600082612cbd57612cbd612cd8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ab57600080fdfea264697066735822122092cec90ad79ac8bc9fb917e06b85669b14089e66b080308eb59f119387e94f3364736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80635c975abb1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd14610799578063d7224ba0146107b9578063dc33e681146107cf578063e268e4d3146107ef578063e985e9c51461080f578063f2fde38b1461085857600080fd5b8063a22cb465146106cc578063aca8ffe7146106ec578063b88d4fde1461070c578063b8a20ed01461072c578063c204642c1461074c578063c31f7dcf1461076c57600080fd5b80638da5cb5b116101135780638da5cb5b146106095780639231ab2a1461062757806395d89b4114610674578063a035b1fe14610689578063a0712d681461069f578063a07c7ce4146106b257600080fd5b80635c975abb1461055a5780636352211e14610574578063659934c11461059457806370a08231146105b4578063715018a6146105d45780637cb64759146105e957600080fd5b80632eb4a7ab116101fe57806349590657116101b757806349590657146104c45780634f6ccce7146104d957806351d7ff93146104f95780635503a0e81461050f57806355234ec01461052457806355f804b31461053a57600080fd5b80632eb4a7ab1461041a5780632f745c591461043057806330f72cd4146104505780633ccfd60b1461046f57806342842e0e1461048457806342966c68146104a457600080fd5b80630e775209116102505780630e7752091461035e57806317bf72c61461038257806317e04a71146103af57806318160ddd146103c557806323b872dd146103da57806325dc45ce146103fa57600080fd5b806301ffc9a71461028d57806302329a29146102c257806306fdde03146102e4578063081812fc14610306578063095ea7b31461033e575b600080fd5b34801561029957600080fd5b506102ad6102a83660046128a1565b610878565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102e26102dd36600461282a565b6108a3565b005b3480156102f057600080fd5b506102f96108e9565b6040516102b99190612a72565b34801561031257600080fd5b50610326610321366004612845565b61097b565b6040516001600160a01b0390911681526020016102b9565b34801561034a57600080fd5b506102e26103593660046126ca565b610a06565b34801561036a57600080fd5b50610374600d5481565b6040519081526020016102b9565b34801561038e57600080fd5b5061037461039d366004612845565b60116020526000908152604090205481565b3480156103bb57600080fd5b50610374600e5481565b3480156103d157600080fd5b50610374610b1e565b3480156103e657600080fd5b506102e26103f53660046125e9565b610b33565b34801561040657600080fd5b506102e2610415366004612845565b610b3e565b34801561042657600080fd5b5061037460155481565b34801561043c57600080fd5b5061037461044b3660046126ca565b610b6d565b34801561045c57600080fd5b506013546102ad90610100900460ff1681565b34801561047b57600080fd5b506102e2610ce4565b34801561049057600080fd5b506102e261049f3660046125e9565b610dce565b3480156104b057600080fd5b506103746104bf366004612845565b610de9565b3480156104d057600080fd5b50601554610374565b3480156104e557600080fd5b506103746104f4366004612845565b610eb7565b34801561050557600080fd5b50610374600c5481565b34801561051b57600080fd5b506102f9610f1b565b34801561053057600080fd5b5061037460105481565b34801561054657600080fd5b506102e26105553660046128db565b610fa9565b34801561056657600080fd5b506013546102ad9060ff1681565b34801561058057600080fd5b5061032661058f366004612845565b610fea565b3480156105a057600080fd5b506103266105af36600461285e565b610ffc565b3480156105c057600080fd5b506103746105cf36600461259b565b6110d0565b3480156105e057600080fd5b506102e2611161565b3480156105f557600080fd5b506102e2610604366004612845565b611197565b34801561061557600080fd5b506000546001600160a01b0316610326565b34801561063357600080fd5b50610647610642366004612845565b6111c6565b6040805182516001600160a01b031681526020928301516001600160401b031692810192909252016102b9565b34801561068057600080fd5b506102f96111e3565b34801561069557600080fd5b50610374600f5481565b6102e26106ad366004612845565b6111f2565b3480156106be57600080fd5b50600a546102ad9060ff1681565b3480156106d857600080fd5b506102e26106e73660046126a0565b61141f565b3480156106f857600080fd5b506102e2610707366004612845565b6114e4565b34801561071857600080fd5b506102e2610727366004612625565b611513565b34801561073857600080fd5b506102ad61074736600461279d565b61154c565b34801561075857600080fd5b506103746107673660046126f4565b611562565b34801561077857600080fd5b50610374610787366004612845565b60126020526000908152604090205481565b3480156107a557600080fd5b506102f96107b4366004612845565b61165e565b3480156107c557600080fd5b5061037460085481565b3480156107db57600080fd5b506103746107ea36600461259b565b61172d565b3480156107fb57600080fd5b506102e261080a366004612845565b611738565b34801561081b57600080fd5b506102ad61082a3660046125b6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561086457600080fd5b506102e261087336600461259b565b611767565b600063152a902d60e11b6001600160e01b03198316148061089d575061089d826117ff565b92915050565b6000546001600160a01b031633146108d65760405162461bcd60e51b81526004016108cd90612a85565b60405180910390fd5b6013805460ff1916911515919091179055565b6060600280546108f890612c58565b80601f016020809104026020016040519081016040528092919081815260200182805461092490612c58565b80156109715780601f1061094657610100808354040283529160200191610971565b820191906000526020600020905b81548152906001019060200180831161095457829003601f168201915b5050505050905090565b6000610988826001541190565b6109ea5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016108cd565b506000908152600660205260409020546001600160a01b031690565b6000610a1182610fea565b9050806001600160a01b0316836001600160a01b03161415610a805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016108cd565b336001600160a01b0382161480610a9c5750610a9c813361082a565b610b0e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016108cd565b610b1983838361186a565b505050565b600060018054610b2e9190612bfe565b905090565b610b198383836118c6565b6000546001600160a01b03163314610b685760405162461bcd60e51b81526004016108cd90612a85565b600c55565b6000610b78836110d0565b8210610bd15760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016108cd565b6000610bdb610b1e565b905060008060005b83811015610c84576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215610c3557805192505b876001600160a01b0316836001600160a01b03161415610c715786841415610c635750935061089d92505050565b83610c6d81612c93565b9450505b5080610c7c81612c93565b915050610be3565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016108cd565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016108cd90612a85565b60026009541415610d615760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108cd565b6002600955600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610db3576040519150601f19603f3d011682016040523d82523d6000602084013e610db8565b606091505b5050905080610dc657600080fd5b506001600955565b610b1983838360405180602001604052806000815250611513565b600a5460009060ff16610e4a5760405162461bcd60e51b8152602060048201526024808201527f5468697320636f6e747261637420646f6573206e6f7420616c6c6f77206275726044820152636e696e6760e01b60648201526084016108cd565b610e5382610fea565b6001600160a01b0316336001600160a01b031614610eb35760405162461bcd60e51b815260206004820181905260248201527f4275726e6572206973206e6f7420746865206f776e6572206f6620746f6b656e60448201526064016108cd565b5090565b6000610ec1610b1e565b8210610eb35760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016108cd565b600b8054610f2890612c58565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5490612c58565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505081565b6000546001600160a01b03163314610fd35760405162461bcd60e51b81526004016108cd90612a85565b8051610fe6906014906020840190612488565b5050565b6000610ff582611c4c565b5192915050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818760405160200161104c92919061294f565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa1580156110b7573d6000803e3d6000fd5b5050604051601f1901519450505050505b949350505050565b60006001600160a01b03821661113c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016108cd565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b0316331461118b5760405162461bcd60e51b81526004016108cd90612a85565b6111956000611df5565b565b6000546001600160a01b031633146111c15760405162461bcd60e51b81526004016108cd90612a85565b601555565b604080518082019091526000808252602082015261089d82611c4c565b6060600380546108f890612c58565b60135460ff16156112365760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b60448201526064016108cd565b600d5481611242610b1e565b61124c9190612b8b565b111561128f5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b60448201526064016108cd565b600e548161129c3361172d565b6112a69190612b8b565b11156112f45760405162461bcd60e51b815260206004820152601960248201527f6c696d6974207065722077616c6c65742065786365656465640000000000000060448201526064016108cd565b600c5481111561133f5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b60448201526064016108cd565b3415801561134d5750806001145b156113ae57600161135d336110d0565b106113a15760405162461bcd60e51b8152602060048201526014602482015273416c7265616479206d696e74656420667265652160601b60448201526064016108cd565b6113ab3382611e45565b50565b60016113b9336110d0565b1061140c576113c781611e5f565b3410156113a15760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016108cd565b6113c761141a600183612bfe565b611e5f565b6001600160a01b0382163314156114785760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016108cd565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b0316331461150e5760405162461bcd60e51b81526004016108cd90612a85565b600d55565b61151e8484846118c6565b61152a84848484611e70565b6115465760405162461bcd60e51b81526004016108cd90612aba565b50505050565b600061155b8360155484611f7a565b9392505050565b600080546001600160a01b0316331461158d5760405162461bcd60e51b81526004016108cd90612a85565b600d5482845161159d9190612bb7565b6115a5610b1e565b6115af9190612b8b565b11156116165760405162461bcd60e51b815260206004820152603060248201527f54686973206578636565647320746865206d6178696d756d206e756d6265722060448201526f6f66204e465473206f6e2073616c652160801b60648201526084016108cd565b60005b83518110156116555761164584828151811061163757611637612cee565b602002602001015184611e45565b61164e81612c93565b9050611619565b5061155b610b1e565b606061166b826001541190565b6116cf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108cd565b60006116d9611f90565b905060008151116116f9576040518060200160405280600081525061155b565b8061170384611f9f565b600b60405160200161171793929190612971565b6040516020818303038152906040529392505050565b600061089d8261209c565b6000546001600160a01b031633146117625760405162461bcd60e51b81526004016108cd90612a85565b600e55565b6000546001600160a01b031633146117915760405162461bcd60e51b81526004016108cd90612a85565b6001600160a01b0381166117f65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6113ab81611df5565b60006001600160e01b031982166380ac58cd60e01b148061183057506001600160e01b03198216635b5e139f60e01b145b8061184b57506001600160e01b0319821663780e9d6360e01b145b8061089d57506301ffc9a760e01b6001600160e01b031983161461089d565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006118d182611c4c565b80519091506000906001600160a01b0316336001600160a01b031614806119085750336118fd8461097b565b6001600160a01b0316145b8061191a5750815161191a903361082a565b9050806119845760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016108cd565b846001600160a01b031682600001516001600160a01b0316146119f85760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016108cd565b6001600160a01b038416611a5c5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016108cd565b611a6c600084846000015161186a565b6001600160a01b0385166000908152600560205260408120805460019290611a9e9084906001600160801b0316612bd6565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611aea91859116612b60565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611b71846001612b8b565b6000818152600460205260409020549091506001600160a01b0316611c0257611b9b816001541190565b15611c025760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611c6b826001541190565b611cca5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016108cd565b60007f00000000000000000000000000000000000000000000000000000000000000c88310611d2b57611d1d7f00000000000000000000000000000000000000000000000000000000000000c884612bfe565b611d28906001612b8b565b90505b825b818110611d94576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b03169183019190915215611d8157949350505050565b5080611d8c81612c41565b915050611d2d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016108cd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610fe682826040518060200160405280600081525061213a565b60008082600f5461155b9190612bb7565b60006001600160a01b0384163b15611f7257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611eb4903390899088908890600401612a35565b602060405180830381600087803b158015611ece57600080fd5b505af1925050508015611efe575060408051601f3d908101601f19168201909252611efb918101906128be565b60015b611f58573d808015611f2c576040519150601f19603f3d011682016040523d82523d6000602084013e611f31565b606091505b508051611f505760405162461bcd60e51b81526004016108cd90612aba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110c8565b5060016110c8565b600082611f878584612414565b14949350505050565b6060601480546108f890612c58565b606081611fc35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fed5780611fd781612c93565b9150611fe69050600a83612ba3565b9150611fc7565b6000816001600160401b0381111561200757612007612d04565b6040519080825280601f01601f191660200182016040528015612031576020820181803683370190505b5090505b84156110c857612046600183612bfe565b9150612053600a86612cae565b61205e906030612b8b565b60f81b81838151811061207357612073612cee565b60200101906001600160f81b031916908160001a905350612095600a86612ba3565b9450612035565b60006001600160a01b03821661210e5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016108cd565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b03841661219d5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016108cd565b6121a8816001541190565b156121f55760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016108cd565b7f00000000000000000000000000000000000000000000000000000000000000c88311156122705760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b60648201526084016108cd565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906122cc908790612b60565b6001600160801b031681526020018583602001516122ea9190612b60565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156124095760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123cd6000888488611e70565b6123e95760405162461bcd60e51b81526004016108cd90612aba565b816123f381612c93565b925050808061240190612c93565b915050612380565b506001819055611c44565b600081815b845181101561248057600085828151811061243657612436612cee565b6020026020010151905080831161245c576000838152602082905260409020925061246d565b600081815260208490526040902092505b508061247881612c93565b915050612419565b509392505050565b82805461249490612c58565b90600052602060002090601f0160209004810192826124b657600085556124fc565b82601f106124cf57805160ff19168380011785556124fc565b828001600101855582156124fc579182015b828111156124fc5782518255916020019190600101906124e1565b50610eb39291505b80821115610eb35760008155600101612504565b60006001600160401b0383111561253157612531612d04565b612544601f8401601f1916602001612b0d565b905082815283838301111561255857600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461258657600080fd5b919050565b8035801515811461258657600080fd5b6000602082840312156125ad57600080fd5b61155b8261256f565b600080604083850312156125c957600080fd5b6125d28361256f565b91506125e06020840161256f565b90509250929050565b6000806000606084860312156125fe57600080fd5b6126078461256f565b92506126156020850161256f565b9150604084013590509250925092565b6000806000806080858703121561263b57600080fd5b6126448561256f565b93506126526020860161256f565b92506040850135915060608501356001600160401b0381111561267457600080fd5b8501601f8101871361268557600080fd5b61269487823560208401612518565b91505092959194509250565b600080604083850312156126b357600080fd5b6126bc8361256f565b91506125e06020840161258b565b600080604083850312156126dd57600080fd5b6126e68361256f565b946020939093013593505050565b6000806040838503121561270757600080fd5b82356001600160401b0381111561271d57600080fd5b8301601f8101851361272e57600080fd5b8035602061274361273e83612b3d565b612b0d565b80838252828201915082850189848660051b880101111561276357600080fd5b600095505b8486101561278d576127798161256f565b835260019590950194918301918301612768565b5098969091013596505050505050565b600080604083850312156127b057600080fd5b82356001600160401b038111156127c657600080fd5b8301601f810185136127d757600080fd5b803560206127e761273e83612b3d565b80838252828201915082850189848660051b880101111561280757600080fd5b600095505b8486101561278d57803583526001959095019491830191830161280c565b60006020828403121561283c57600080fd5b61155b8261258b565b60006020828403121561285757600080fd5b5035919050565b6000806000806080858703121561287457600080fd5b84359350602085013560ff8116811461288c57600080fd5b93969395505050506040820135916060013590565b6000602082840312156128b357600080fd5b813561155b81612d1a565b6000602082840312156128d057600080fd5b815161155b81612d1a565b6000602082840312156128ed57600080fd5b81356001600160401b0381111561290357600080fd5b8201601f8101841361291457600080fd5b6110c884823560208401612518565b6000815180845261293b816020860160208601612c15565b601f01601f19169290920160200192915050565b60008351612961818460208801612c15565b9190910191825250602001919050565b6000845160206129848285838a01612c15565b8551918401916129978184848a01612c15565b8554920191600090600181811c90808316806129b457607f831692505b8583108114156129d257634e487b7160e01b85526022600452602485fd5b8080156129e657600181146129f757612a24565b60ff19851688528388019550612a24565b60008b81526020902060005b85811015612a1c5781548a820152908401908801612a03565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612a6890830184612923565b9695505050505050565b60208152600061155b6020830184612923565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612b3557612b35612d04565b604052919050565b60006001600160401b03821115612b5657612b56612d04565b5060051b60200190565b60006001600160801b03808316818516808303821115612b8257612b82612cc2565b01949350505050565b60008219821115612b9e57612b9e612cc2565b500190565b600082612bb257612bb2612cd8565b500490565b6000816000190483118215151615612bd157612bd1612cc2565b500290565b60006001600160801b0383811690831681811015612bf657612bf6612cc2565b039392505050565b600082821015612c1057612c10612cc2565b500390565b60005b83811015612c30578181015183820152602001612c18565b838111156115465750506000910152565b600081612c5057612c50612cc2565b506000190190565b600181811c90821680612c6c57607f821691505b60208210811415612c8d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ca757612ca7612cc2565b5060010190565b600082612cbd57612cbd612cd8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ab57600080fdfea264697066735822122092cec90ad79ac8bc9fb917e06b85669b14089e66b080308eb59f119387e94f3364736f6c63430008070033

Deployed Bytecode Sourcemap

33241:6002:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34182:237;;;;;;;;;;-1:-1:-1;34182:237:0;;;;;:::i;:::-;;:::i;:::-;;;9944:14:1;;9937:22;9919:41;;9907:2;9892:18;34182:237:0;;;;;;;;39161:79;;;;;;;;;;-1:-1:-1;39161:79:0;;;;;:::i;:::-;;:::i;:::-;;24813:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26300:292::-;;;;;;;;;;-1:-1:-1;26300:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9242:32:1;;;9224:51;;9212:2;9197:18;26300:292:0;9078:203:1;25879:413:0;;;;;;;;;;-1:-1:-1;25879:413:0;;;;;:::i;:::-;;:::i;33536:42::-;;;;;;;;;;;;;;;;;;;10117:25:1;;;10105:2;10090:18;33536:42:0;9971:177:1;33822:40:0;;;;;;;;;;-1:-1:-1;33822:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;33609:33;;;;;;;;;;;;;;;;21801:104;;;;;;;;;;;;;:::i;27141:162::-;;;;;;;;;;-1:-1:-1;27141:162:0;;;;;:::i;:::-;;:::i;38831:102::-;;;;;;;;;;-1:-1:-1;38831:102:0;;;;;:::i;:::-;;:::i;34043:25::-;;;;;;;;;;;;;;;;22149:864;;;;;;;;;;-1:-1:-1;22149:864:0;;;;;:::i;:::-;;:::i;33958:35::-;;;;;;;;;;-1:-1:-1;33958:35:0;;;;;;;;;;;38663:160;;;;;;;;;;;;;:::i;27311:177::-;;;;;;;;;;-1:-1:-1;27311:177:0;;;;;:::i;:::-;;:::i;34971:310::-;;;;;;;;;;-1:-1:-1;34971:310:0;;;;;:::i;:::-;;:::i;34519:91::-;;;;;;;;;;-1:-1:-1;34592:10:0;;34519:91;;21913:228;;;;;;;;;;-1:-1:-1;21913:228:0;;;;;:::i;:::-;;:::i;33438:38::-;;;;;;;;;;;;;;;;33396:33;;;;;;;;;;;;;:::i;33789:24::-;;;;;;;;;;;;;;;;38137:101;;;;;;;;;;-1:-1:-1;38137:101:0;;;;;:::i;:::-;;:::i;33926:25::-;;;;;;;;;;-1:-1:-1;33926:25:0;;;;;;;;24681:124;;;;;;;;;;-1:-1:-1;24681:124:0;;;;;:::i;:::-;;:::i;35289:439::-;;;;;;;;;;-1:-1:-1;35289:439:0;;;;;:::i;:::-;;:::i;23451:258::-;;;;;;;;;;-1:-1:-1;23451:258:0;;;;;:::i;:::-;;:::i;13447:103::-;;;;;;;;;;;;;:::i;34427:84::-;;;;;;;;;;-1:-1:-1;34427:84:0;;;;;:::i;:::-;;:::i;13224:87::-;;;;;;;;;;-1:-1:-1;13270:7:0;13297:6;-1:-1:-1;;;;;13297:6:0;13224:87;;38488:167;;;;;;;;;;-1:-1:-1;38488:167:0;;;;;:::i;:::-;;:::i;:::-;;;;23123:13:1;;-1:-1:-1;;;;;23119:39:1;23101:58;;23219:4;23207:17;;;23201:24;-1:-1:-1;;;;;23197:49:1;23175:20;;;23168:79;;;;23074:18;38488:167:0;22891:362:1;24921:104:0;;;;;;;;;;;;;:::i;33667:35::-;;;;;;;;;;;;;;;;35736:996;;;;;;:::i;:::-;;:::i;33367:20::-;;;;;;;;;;-1:-1:-1;33367:20:0;;;;;;;;26600:311;;;;;;;;;;-1:-1:-1;26600:311:0;;;;;:::i;:::-;;:::i;38941:98::-;;;;;;;;;;-1:-1:-1;38941:98:0;;;;;:::i;:::-;;:::i;27496:355::-;;;;;;;;;;-1:-1:-1;27496:355:0;;;;;:::i;:::-;;:::i;36901:195::-;;;;;;;;;;-1:-1:-1;36901:195:0;;;;;:::i;:::-;;:::i;37631:498::-;;;;;;;;;;-1:-1:-1;37631:498:0;;;;;:::i;:::-;;:::i;33869:48::-;;;;;;;;;;-1:-1:-1;33869:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;37104:519;;;;;;;;;;-1:-1:-1;37104:519:0;;;;;:::i;:::-;;:::i;31011:43::-;;;;;;;;;;;;;;;;38367:113;;;;;;;;;;-1:-1:-1;38367:113:0;;;;;:::i;:::-;;:::i;39047:106::-;;;;;;;;;;-1:-1:-1;39047:106:0;;;;;:::i;:::-;;:::i;26919:214::-;;;;;;;;;;-1:-1:-1;26919:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;27090:25:0;;;27061:4;27090:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26919:214;13558:238;;;;;;;;;;-1:-1:-1;13558:238:0;;;;;:::i;:::-;;:::i;34182:237::-;34304:4;-1:-1:-1;;;;;;;;;34346:25:0;;;;:65;;;34375:36;34399:11;34375:23;:36::i;:::-;34326:85;34182:237;-1:-1:-1;;34182:237:0:o;39161:79::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;;;;;;;;;39217:6:::1;:15:::0;;-1:-1:-1;;39217:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39161:79::o;24813:100::-;24867:13;24900:5;24893:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24813:100;:::o;26300:292::-;26404:7;26451:16;26459:7;27950:12;;-1:-1:-1;27940:22:0;27859:111;26451:16;26429:111;;;;-1:-1:-1;;;26429:111:0;;21928:2:1;26429:111:0;;;21910:21:1;21967:2;21947:18;;;21940:30;22006:34;21986:18;;;21979:62;-1:-1:-1;;;22057:18:1;;;22050:43;22110:19;;26429:111:0;21726:409:1;26429:111:0;-1:-1:-1;26560:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26560:24:0;;26300:292::o;25879:413::-;25952:13;25968:24;25984:7;25968:15;:24::i;:::-;25952:40;;26017:5;-1:-1:-1;;;;;26011:11:0;:2;-1:-1:-1;;;;;26011:11:0;;;26003:58;;;;-1:-1:-1;;;26003:58:0;;17706:2:1;26003:58:0;;;17688:21:1;17745:2;17725:18;;;17718:30;17784:34;17764:18;;;17757:62;-1:-1:-1;;;17835:18:1;;;17828:32;17877:19;;26003:58:0;17504:398:1;26003:58:0;12825:10;-1:-1:-1;;;;;26096:21:0;;;;:62;;-1:-1:-1;26121:37:0;26138:5;12825:10;26919:214;:::i;26121:37::-;26074:169;;;;-1:-1:-1;;;26074:169:0;;13848:2:1;26074:169:0;;;13830:21:1;13887:2;13867:18;;;13860:30;13926:34;13906:18;;;13899:62;13997:27;13977:18;;;13970:55;14042:19;;26074:169:0;13646:421:1;26074:169:0;26256:28;26265:2;26269:7;26278:5;26256:8;:28::i;:::-;25941:351;25879:413;;:::o;21801:104::-;21854:7;21896:1;21881:12;;:16;;;;:::i;:::-;21874:23;;21801:104;:::o;27141:162::-;27267:28;27277:4;27283:2;27287:7;27267:9;:28::i;38831:102::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;38902:19:::1;:23:::0;38831:102::o;22149:864::-;22274:7;22315:16;22325:5;22315:9;:16::i;:::-;22307:5;:24;22299:71;;;;-1:-1:-1;;;22299:71:0;;10982:2:1;22299:71:0;;;10964:21:1;11021:2;11001:18;;;10994:30;11060:34;11040:18;;;11033:62;-1:-1:-1;;;11111:18:1;;;11104:32;11153:19;;22299:71:0;10780:398:1;22299:71:0;22381:22;22406:13;:11;:13::i;:::-;22381:38;;22430:19;22464:25;22518:9;22513:426;22537:14;22533:1;:18;22513:426;;;22573:31;22607:14;;;:11;:14;;;;;;;;;22573:48;;;;;;;;;-1:-1:-1;;;;;22573:48:0;;;;;-1:-1:-1;;;22573:48:0;;;-1:-1:-1;;;;;22573:48:0;;;;;;;;22640:28;22636:103;;22709:14;;;-1:-1:-1;22636:103:0;22778:5;-1:-1:-1;;;;;22757:26:0;:17;-1:-1:-1;;;;;22757:26:0;;22753:175;;;22823:5;22808:11;:20;22804:77;;;-1:-1:-1;22860:1:0;-1:-1:-1;22853:8:0;;-1:-1:-1;;;22853:8:0;22804:77;22899:13;;;;:::i;:::-;;;;22753:175;-1:-1:-1;22553:3:0;;;;:::i;:::-;;;;22513:426;;;-1:-1:-1;22949:56:0;;-1:-1:-1;;;22949:56:0;;20394:2:1;22949:56:0;;;20376:21:1;20433:2;20413:18;;;20406:30;20472:34;20452:18;;;20445:62;-1:-1:-1;;;20523:18:1;;;20516:44;20577:19;;22949:56:0;20192:410:1;38663:160:0;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;4081:1:::1;4229:7;;:19;;4221:63;;;::::0;-1:-1:-1;;;4221:63:0;;20809:2:1;4221:63:0::1;::::0;::::1;20791:21:1::0;20848:2;20828:18;;;20821:30;20887:33;20867:18;;;20860:61;20938:18;;4221:63:0::1;20607:355:1::0;4221:63:0::1;4081:1;4295:7;:18:::0;38725:7:::2;13297:6:::0;;38738:55:::2;::::0;-1:-1:-1;;;;;13297:6:0;;;;38767:21:::2;::::0;38725:7;38738:55;38725:7;38738:55;38767:21;13297:6;38738:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38724:69;;;38812:2;38804:11;;;::::0;::::2;;-1:-1:-1::0;4037:1:0::1;4338:7;:22:::0;38663:160::o;27311:177::-;27441:39;27458:4;27464:2;27468:7;27441:39;;;;;;;;;;;;:16;:39::i;34971:310::-;35048:8;;35020:7;;35048:8;;35040:57;;;;-1:-1:-1;;;35040:57:0;;19640:2:1;35040:57:0;;;19622:21:1;19679:2;19659:18;;;19652:30;19718:34;19698:18;;;19691:62;-1:-1:-1;;;19769:18:1;;;19762:34;19813:19;;35040:57:0;19438:400:1;35040:57:0;35144:16;35152:7;35144;:16::i;:::-;-1:-1:-1;;;;;35130:30:0;:10;-1:-1:-1;;;;;35130:30:0;;35108:112;;;;-1:-1:-1;;;35108:112:0;;14274:2:1;35108:112:0;;;14256:21:1;;;14293:18;;;14286:30;14352:34;14332:18;;;14325:62;14404:18;;35108:112:0;14072:356:1;35108:112:0;-1:-1:-1;35266:7:0;34971:310::o;21913:228::-;22016:7;22057:13;:11;:13::i;:::-;22049:5;:21;22041:69;;;;-1:-1:-1;;;22041:69:0;;12203:2:1;22041:69:0;;;12185:21:1;12242:2;12222:18;;;12215:30;12281:34;12261:18;;;12254:62;-1:-1:-1;;;12332:18:1;;;12325:33;12375:19;;22041:69:0;12001:399:1;33396:33:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38137:101::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;38208:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;38137:101:::0;:::o;24681:124::-;24745:7;24772:20;24784:7;24772:11;:20::i;:::-;:25;;24681:124;-1:-1:-1;;24681:124:0:o;35289:439::-;35434:7;35454:19;:56;;;;;;;;;;;;;;;;;;;35521:27;35592:6;35600:14;35575:40;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;35575:40:0;;;;;;;;;35551:75;;35575:40;35551:75;;;;35637:14;35654:42;;;;;;;;;10380:25:1;;;10453:4;10441:17;;10421:18;;;10414:45;;;;10475:18;;;10468:34;;;10518:18;;;10511:34;;;35551:75:0;;-1:-1:-1;35637:14:0;35654:42;;10352:19:1;;35654:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35654:42:0;;-1:-1:-1;;35654:42:0;;;-1:-1:-1;;;;;35289:439:0;;;;;;;:::o;23451:258::-;23515:7;-1:-1:-1;;;;;23557:19:0;;23535:112;;;;-1:-1:-1;;;23535:112:0;;14635:2:1;23535:112:0;;;14617:21:1;14674:2;14654:18;;;14647:30;14713:34;14693:18;;;14686:62;-1:-1:-1;;;14764:18:1;;;14757:41;14815:19;;23535:112:0;14433:407:1;23535:112:0;-1:-1:-1;;;;;;23673:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;23673:27:0;;23451:258::o;13447:103::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;13512:30:::1;13539:1;13512:18;:30::i;:::-;13447:103::o:0;34427:84::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;34489:10:::1;:14:::0;34427:84::o;38488:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;38627:20:0;38639:7;38627:11;:20::i;24921:104::-;24977:13;25010:7;25003:14;;;;;:::i;35736:996::-;35803:6;;;;35802:7;35794:34;;;;-1:-1:-1;;;35794:34:0;;21585:2:1;35794:34:0;;;21567:21:1;21624:2;21604:18;;;21597:30;-1:-1:-1;;;21643:18:1;;;21636:44;21697:18;;35794:34:0;21383:338:1;35794:34:0;35889:20;;35877:8;35861:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;35839:116;;;;-1:-1:-1;;;35839:116:0;;15047:2:1;35839:116:0;;;15029:21:1;15086:2;15066:18;;;15059:30;-1:-1:-1;;;15105:18:1;;;15098:48;15163:18;;35839:116:0;14845:342:1;35839:116:0;36027:14;;36015:8;35988:24;36001:10;35988:12;:24::i;:::-;:35;;;;:::i;:::-;:53;;35966:128;;;;-1:-1:-1;;;35966:128:0;;15394:2:1;35966:128:0;;;15376:21:1;15433:2;15413:18;;;15406:30;15472:27;15452:18;;;15445:55;15517:18;;35966:128:0;15192:349:1;35966:128:0;36125:19;;36113:8;:31;;36105:66;;;;-1:-1:-1;;;36105:66:0;;19289:2:1;36105:66:0;;;19271:21:1;19328:2;19308:18;;;19301:30;-1:-1:-1;;;19347:18:1;;;19340:52;19409:18;;36105:66:0;19087:346:1;36105:66:0;36188:9;:14;:31;;;;;36206:8;36218:1;36206:13;36188:31;36184:541;;;36268:1;36244:21;36254:10;36244:9;:21::i;:::-;:25;36236:58;;;;-1:-1:-1;;;36236:58:0;;20045:2:1;36236:58:0;;;20027:21:1;20084:2;20064:18;;;20057:30;-1:-1:-1;;;20103:18:1;;;20096:50;20163:18;;36236:58:0;19843:344:1;36236:58:0;36309:31;36319:10;36331:8;36309:9;:31::i;:::-;35736:996;:::o;36184:541::-;36387:1;36362:21;36372:10;36362:9;:21::i;:::-;:26;36358:367;;36426:20;36437:8;36426:10;:20::i;:::-;36413:9;:33;;36405:65;;;;-1:-1:-1;;;36405:65:0;;22745:2:1;36405:65:0;;;22727:21:1;22784:2;22764:18;;;22757:30;-1:-1:-1;;;22803:18:1;;;22796:49;22862:18;;36405:65:0;22543:343:1;36358:367:0;36588:24;36599:12;36610:1;36599:8;:12;:::i;:::-;36588:10;:24::i;26600:311::-;-1:-1:-1;;;;;26718:24:0;;12825:10;26718:24;;26710:63;;;;-1:-1:-1;;;26710:63:0;;16932:2:1;26710:63:0;;;16914:21:1;16971:2;16951:18;;;16944:30;17010:28;16990:18;;;16983:56;17056:18;;26710:63:0;16730:350:1;26710:63:0;12825:10;26786:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26786:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26786:53:0;;;;;;;;;;26855:48;;9919:41:1;;;26786:42:0;;12825:10;26855:48;;9892:18:1;26855:48:0;;;;;;;26600:311;;:::o;38941:98::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;39007:20:::1;:24:::0;38941:98::o;27496:355::-;27655:28;27665:4;27671:2;27675:7;27655:9;:28::i;:::-;27716:48;27739:4;27745:2;27749:7;27758:5;27716:22;:48::i;:::-;27694:149;;;;-1:-1:-1;;;27694:149:0;;;;;;;:::i;:::-;27496:355;;;;:::o;36901:195::-;37010:4;37039:49;37058:11;37071:10;;37083:4;37039:18;:49::i;:::-;37032:56;36901:195;-1:-1:-1;;;36901:195:0:o;37631:498::-;37750:7;13297:6;;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;37862:20:::1;;37831:10;37813:8;:15;:28;;;;:::i;:::-;37797:13;:11;:13::i;:::-;:44;;;;:::i;:::-;:85;;37775:183;;;::::0;-1:-1:-1;;;37775:183:0;;12607:2:1;37775:183:0::1;::::0;::::1;12589:21:1::0;12646:2;12626:18;;;12619:30;12685:34;12665:18;;;12658:62;-1:-1:-1;;;12736:18:1;;;12729:46;12792:19;;37775:183:0::1;12405:412:1::0;37775:183:0::1;37974:9;37969:122;37993:8;:15;37989:1;:19;37969:122;;;38027:34;38037:8;38046:1;38037:11;;;;;;;;:::i;:::-;;;;;;;38050:10;38027:9;:34::i;:::-;38076:3;::::0;::::1;:::i;:::-;;;37969:122;;;;38108:13;:11;:13::i;37104:519::-:0;37222:13;37275:16;37283:7;27950:12;;-1:-1:-1;27940:22:0;27859:111;37275:16;37253:113;;;;-1:-1:-1;;;37253:113:0;;16516:2:1;37253:113:0;;;16498:21:1;16555:2;16535:18;;;16528:30;16594:34;16574:18;;;16567:62;-1:-1:-1;;;16645:18:1;;;16638:45;16700:19;;37253:113:0;16314:411:1;37253:113:0;37379:21;37403:10;:8;:10::i;:::-;37379:34;;37468:1;37450:7;37444:21;:25;:171;;;;;;;;;;;;;;;;;37535:7;37544:18;:7;:16;:18::i;:::-;37564:9;37518:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37424:191;37104:519;-1:-1:-1;;;37104:519:0:o;38367:113::-;38425:7;38452:20;38466:5;38452:13;:20::i;39047:106::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;39119:14:::1;:26:::0;39047:106::o;13558:238::-;13270:7;13297:6;-1:-1:-1;;;;;13297:6:0;12825:10;13359:23;13351:68;;;;-1:-1:-1;;;13351:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13661:22:0;::::1;13639:110;;;::::0;-1:-1:-1;;;13639:110:0;;11385:2:1;13639:110:0::1;::::0;::::1;11367:21:1::0;11424:2;11404:18;;;11397:30;11463:34;11443:18;;;11436:62;-1:-1:-1;;;11514:18:1;;;11507:36;11560:19;;13639:110:0::1;11183:402:1::0;13639:110:0::1;13760:28;13779:8;13760:18;:28::i;23021:422::-:0;23168:4;-1:-1:-1;;;;;;23210:40:0;;-1:-1:-1;;;23210:40:0;;:105;;-1:-1:-1;;;;;;;23267:48:0;;-1:-1:-1;;;23267:48:0;23210:105;:172;;;-1:-1:-1;;;;;;;23332:50:0;;-1:-1:-1;;;23332:50:0;23210:172;:225;;;-1:-1:-1;;;;;;;;;;18521:40:0;;;23399:36;18362:207;30807:196;30922:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;30922:29:0;-1:-1:-1;;;;;30922:29:0;;;;;;;;;30967:28;;30922:24;;30967:28;;;;;;;30807:196;;;:::o;29373:1426::-;29488:35;29526:20;29538:7;29526:11;:20::i;:::-;29601:18;;29488:58;;-1:-1:-1;29559:22:0;;-1:-1:-1;;;;;29585:34:0;12825:10;-1:-1:-1;;;;;29585:34:0;;:87;;;-1:-1:-1;12825:10:0;29636:20;29648:7;29636:11;:20::i;:::-;-1:-1:-1;;;;;29636:36:0;;29585:87;:154;;;-1:-1:-1;29706:18:0;;29689:50;;12825:10;26919:214;:::i;29689:50::-;29559:181;;29775:17;29753:117;;;;-1:-1:-1;;;29753:117:0;;17287:2:1;29753:117:0;;;17269:21:1;17326:2;17306:18;;;17299:30;17365:34;17345:18;;;17338:62;-1:-1:-1;;;17416:18:1;;;17409:48;17474:19;;29753:117:0;17085:414:1;29753:117:0;29927:4;-1:-1:-1;;;;;29905:26:0;:13;:18;;;-1:-1:-1;;;;;29905:26:0;;29883:114;;;;-1:-1:-1;;;29883:114:0;;15748:2:1;29883:114:0;;;15730:21:1;15787:2;15767:18;;;15760:30;15826:34;15806:18;;;15799:62;-1:-1:-1;;;15877:18:1;;;15870:36;15923:19;;29883:114:0;15546:402:1;29883:114:0;-1:-1:-1;;;;;30016:16:0;;30008:66;;;;-1:-1:-1;;;30008:66:0;;13024:2:1;30008:66:0;;;13006:21:1;13063:2;13043:18;;;13036:30;13102:34;13082:18;;;13075:62;-1:-1:-1;;;13153:18:1;;;13146:35;13198:19;;30008:66:0;12822:401:1;30008:66:0;30141:49;30158:1;30162:7;30171:13;:18;;;30141:8;:49::i;:::-;-1:-1:-1;;;;;30203:18:0;;;;;;:12;:18;;;;;:31;;30233:1;;30203:18;:31;;30233:1;;-1:-1:-1;;;;;30203:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;30203:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30245:16:0;;-1:-1:-1;30245:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;30245:16:0;;:29;;-1:-1:-1;;30245:29:0;;:::i;:::-;;;-1:-1:-1;;;;;30245:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30308:43:0;;;;;;;;-1:-1:-1;;;;;30308:43:0;;;;;-1:-1:-1;;;;;30334:15:0;30308:43;;;;;;;;;-1:-1:-1;30285:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;30285:66:0;-1:-1:-1;;;;;;30285:66:0;;;;;;;;;;;30384:11;30297:7;-1:-1:-1;30384:11:0;:::i;:::-;30451:1;30410:24;;;:11;:24;;;;;:29;30362:33;;-1:-1:-1;;;;;;30410:29:0;30406:288;;30474:20;30482:11;27950:12;;-1:-1:-1;27940:22:0;27859:111;30474:20;30470:213;;;30542:125;;;;;;;;30579:18;;-1:-1:-1;;;;;30542:125:0;;;;;;30620:28;;;;-1:-1:-1;;;;;30542:125:0;;;;;;;;;-1:-1:-1;30515:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;30515:152:0;-1:-1:-1;;;;;;30515:152:0;;;;;;;;;;;;30470:213;30730:7;30726:2;-1:-1:-1;;;;;30711:27:0;30720:4;-1:-1:-1;;;;;30711:27:0;;;;;;;;;;;30749:42;29477:1322;;;29373:1426;;;:::o;23991:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;24126:16:0;24134:7;27950:12;;-1:-1:-1;27940:22:0;27859:111;24126:16;24118:71;;;;-1:-1:-1;;;24118:71:0;;11792:2:1;24118:71:0;;;11774:21:1;11831:2;11811:18;;;11804:30;11870:34;11850:18;;;11843:62;-1:-1:-1;;;11921:18:1;;;11914:40;11971:19;;24118:71:0;11590:406:1;24118:71:0;24202:26;24254:12;24243:7;:23;24239:103;;24304:22;24314:12;24304:7;:22;:::i;:::-;:26;;24329:1;24304:26;:::i;:::-;24283:47;;24239:103;24374:7;24354:242;24391:18;24383:4;:26;24354:242;;24434:31;24468:17;;;:11;:17;;;;;;;;;24434:51;;;;;;;;;-1:-1:-1;;;;;24434:51:0;;;;;-1:-1:-1;;;24434:51:0;;;-1:-1:-1;;;;;24434:51:0;;;;;;;;24504:28;24500:85;;24560:9;23991:682;-1:-1:-1;;;;23991:682:0:o;24500:85::-;-1:-1:-1;24411:6:0;;;;:::i;:::-;;;;24354:242;;;-1:-1:-1;24608:57:0;;-1:-1:-1;;;24608:57:0;;21169:2:1;24608:57:0;;;21151:21:1;21208:2;21188:18;;;21181:30;21247:34;21227:18;;;21220:62;-1:-1:-1;;;21298:18:1;;;21291:45;21353:19;;24608:57:0;20967:411:1;13804:191:0;13878:16;13897:6;;-1:-1:-1;;;;;13914:17:0;;;-1:-1:-1;;;;;;13914:17:0;;;;;;13947:40;;13897:6;;;;;;;13947:40;;13878:16;13947:40;13867:128;13804:191;:::o;27978:104::-;28047:27;28057:2;28061:8;28047:27;;;;;;;;;;;;:9;:27::i;36740:153::-;36801:7;36821:17;36849:9;36841:5;;:17;;;;:::i;31916:985::-;32071:4;-1:-1:-1;;;;;32092:13:0;;14157:20;14205:8;32088:806;;32145:175;;-1:-1:-1;;;32145:175:0;;-1:-1:-1;;;;;32145:36:0;;;;;:175;;12825:10;;32239:4;;32266:7;;32296:5;;32145:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32145:175:0;;;;;;;;-1:-1:-1;;32145:175:0;;;;;;;;;;;;:::i;:::-;;;32124:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32507:13:0;;32503:321;;32550:109;;-1:-1:-1;;;32550:109:0;;;;;;;:::i;32503:321::-;32774:6;32768:13;32759:6;32755:2;32751:15;32744:38;32124:715;-1:-1:-1;;;;;;32384:55:0;-1:-1:-1;;;32384:55:0;;-1:-1:-1;32377:62:0;;32088:806;-1:-1:-1;32878:4:0;32871:11;;2938:190;3063:4;3116;3087:25;3100:5;3107:4;3087:12;:25::i;:::-;:33;;2938:190;-1:-1:-1;;;;2938:190:0:o;38246:113::-;38306:13;38339:12;38332:19;;;;;:::i;11334:532::-;11390:13;11420:10;11416:53;;-1:-1:-1;;11447:10:0;;;;;;;;;;;;-1:-1:-1;;;11447:10:0;;;;;11334:532::o;11416:53::-;11494:5;11479:12;11535:78;11542:9;;11535:78;;11568:8;;;;:::i;:::-;;-1:-1:-1;11591:10:0;;-1:-1:-1;11599:2:0;11591:10;;:::i;:::-;;;11535:78;;;11623:19;11655:6;-1:-1:-1;;;;;11645:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11645:17:0;;11623:39;;11673:154;11680:10;;11673:154;;11707:11;11717:1;11707:11;;:::i;:::-;;-1:-1:-1;11776:10:0;11784:2;11776:5;:10;:::i;:::-;11763:24;;:2;:24;:::i;:::-;11750:39;;11733:6;11740;11733:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11733:56:0;;;;;;;;-1:-1:-1;11804:11:0;11813:2;11804:11;;:::i;:::-;;;11673:154;;23717:266;23778:7;-1:-1:-1;;;;;23820:19:0;;23798:118;;;;-1:-1:-1;;;23798:118:0;;13430:2:1;23798:118:0;;;13412:21:1;13469:2;13449:18;;;13442:30;13508:34;13488:18;;;13481:62;-1:-1:-1;;;13559:18:1;;;13552:47;13616:19;;23798:118:0;13228:413:1;23798:118:0;-1:-1:-1;;;;;;23942:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;23942:32:0;;-1:-1:-1;;;;;23942:32:0;;23717:266::o;28090:1275::-;28236:12;;-1:-1:-1;;;;;28267:16:0;;28259:62;;;;-1:-1:-1;;;28259:62:0;;18887:2:1;28259:62:0;;;18869:21:1;18926:2;18906:18;;;18899:30;18965:34;18945:18;;;18938:62;-1:-1:-1;;;19016:18:1;;;19009:31;19057:19;;28259:62:0;18685:397:1;28259:62:0;28341:21;28349:12;27950;;-1:-1:-1;27940:22:0;27859:111;28341:21;28340:22;28332:64;;;;-1:-1:-1;;;28332:64:0;;18529:2:1;28332:64:0;;;18511:21:1;18568:2;18548:18;;;18541:30;18607:31;18587:18;;;18580:59;18656:18;;28332:64:0;18327:353:1;28332:64:0;28427:12;28415:8;:24;;28407:71;;;;-1:-1:-1;;;28407:71:0;;22342:2:1;28407:71:0;;;22324:21:1;22381:2;22361:18;;;22354:30;22420:34;22400:18;;;22393:62;-1:-1:-1;;;22471:18:1;;;22464:32;22513:19;;28407:71:0;22140:398:1;28407:71:0;-1:-1:-1;;;;;28598:16:0;;28565:30;28598:16;;;:12;:16;;;;;;;;;28565:49;;;;;;;;;-1:-1:-1;;;;;28565:49:0;;;;;-1:-1:-1;;;28565:49:0;;;;;;;;;;;28644:135;;;;;;;;28670:19;;28565:49;;28644:135;;;28670:39;;28700:8;;28670:39;:::i;:::-;-1:-1:-1;;;;;28644:135:0;;;;;28759:8;28724:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;28644:135:0;;;;;;-1:-1:-1;;;;;28625:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;28625:154:0;;;;;;;;;;;;28818:43;;;;;;;;;;-1:-1:-1;;;;;28844:15:0;28818:43;;;;;;;;28790:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;28790:71:0;-1:-1:-1;;;;;;28790:71:0;;;;;;;;;;;;;;;;;;28802:12;;28922:325;28946:8;28942:1;:12;28922:325;;;28981:38;;29006:12;;-1:-1:-1;;;;;28981:38:0;;;28998:1;;28981:38;;28998:1;;28981:38;29060:59;29091:1;29095:2;29099:12;29113:5;29060:22;:59::i;:::-;29034:172;;;;-1:-1:-1;;;29034:172:0;;;;;;;:::i;:::-;29221:14;;;;:::i;:::-;;;;28956:3;;;;;:::i;:::-;;;;28922:325;;;-1:-1:-1;29259:12:0;:27;;;29297:60;27496:355;3136:549;3246:7;3294:4;3246:7;3309:339;3333:5;:12;3329:1;:16;3309:339;;;3367:20;3390:5;3396:1;3390:8;;;;;;;;:::i;:::-;;;;;;;3367:31;;3433:12;3417;:28;3413:224;;3788:13;3843:15;;;3879:4;3872:15;;;3926:4;3910:21;;3466:57;;3413:224;;;3788:13;3843:15;;;3879:4;3872:15;;;3926:4;3910:21;;3564:57;;3413:224;-1:-1:-1;3347:3:0;;;;:::i;:::-;;;;3309:339;;;-1:-1:-1;3665:12:0;3136:549;-1:-1:-1;;;3136:549:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;-1:-1:-1;;;;;1976:6:1;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:978::-;2839:6;2847;2900:2;2888:9;2879:7;2875:23;2871:32;2868:52;;;2916:1;2913;2906:12;2868:52;2956:9;2943:23;-1:-1:-1;;;;;2981:6:1;2978:30;2975:50;;;3021:1;3018;3011:12;2975:50;3044:22;;3097:4;3089:13;;3085:27;-1:-1:-1;3075:55:1;;3126:1;3123;3116:12;3075:55;3162:2;3149:16;3184:4;3208:60;3224:43;3264:2;3224:43;:::i;:::-;3208:60;:::i;:::-;3290:3;3314:2;3309:3;3302:15;3342:2;3337:3;3333:12;3326:19;;3373:2;3369;3365:11;3421:7;3416:2;3410;3407:1;3403:10;3399:2;3395:19;3391:28;3388:41;3385:61;;;3442:1;3439;3432:12;3385:61;3464:1;3455:10;;3474:169;3488:2;3485:1;3482:9;3474:169;;;3545:23;3564:3;3545:23;:::i;:::-;3533:36;;3506:1;3499:9;;;;;3589:12;;;;3621;;3474:169;;;-1:-1:-1;3662:5:1;3699:18;;;;3686:32;;-1:-1:-1;;;;;;2746:978:1:o;3729:972::-;3822:6;3830;3883:2;3871:9;3862:7;3858:23;3854:32;3851:52;;;3899:1;3896;3889:12;3851:52;3939:9;3926:23;-1:-1:-1;;;;;3964:6:1;3961:30;3958:50;;;4004:1;4001;3994:12;3958:50;4027:22;;4080:4;4072:13;;4068:27;-1:-1:-1;4058:55:1;;4109:1;4106;4099:12;4058:55;4145:2;4132:16;4167:4;4191:60;4207:43;4247:2;4207:43;:::i;4191:60::-;4273:3;4297:2;4292:3;4285:15;4325:2;4320:3;4316:12;4309:19;;4356:2;4352;4348:11;4404:7;4399:2;4393;4390:1;4386:10;4382:2;4378:19;4374:28;4371:41;4368:61;;;4425:1;4422;4415:12;4368:61;4447:1;4438:10;;4457:163;4471:2;4468:1;4465:9;4457:163;;;4528:17;;4516:30;;4489:1;4482:9;;;;;4566:12;;;;4598;;4457:163;;4706:180;4762:6;4815:2;4803:9;4794:7;4790:23;4786:32;4783:52;;;4831:1;4828;4821:12;4783:52;4854:26;4870:9;4854:26;:::i;4891:180::-;4950:6;5003:2;4991:9;4982:7;4978:23;4974:32;4971:52;;;5019:1;5016;5009:12;4971:52;-1:-1:-1;5042:23:1;;4891:180;-1:-1:-1;4891:180:1:o;5076:474::-;5160:6;5168;5176;5184;5237:3;5225:9;5216:7;5212:23;5208:33;5205:53;;;5254:1;5251;5244:12;5205:53;5290:9;5277:23;5267:33;;5350:2;5339:9;5335:18;5322:32;5394:4;5387:5;5383:16;5376:5;5373:27;5363:55;;5414:1;5411;5404:12;5363:55;5076:474;;5437:5;;-1:-1:-1;;;;5489:2:1;5474:18;;5461:32;;5540:2;5525:18;5512:32;;5076:474::o;5555:245::-;5613:6;5666:2;5654:9;5645:7;5641:23;5637:32;5634:52;;;5682:1;5679;5672:12;5634:52;5721:9;5708:23;5740:30;5764:5;5740:30;:::i;5805:249::-;5874:6;5927:2;5915:9;5906:7;5902:23;5898:32;5895:52;;;5943:1;5940;5933:12;5895:52;5975:9;5969:16;5994:30;6018:5;5994:30;:::i;6059:450::-;6128:6;6181:2;6169:9;6160:7;6156:23;6152:32;6149:52;;;6197:1;6194;6187:12;6149:52;6237:9;6224:23;-1:-1:-1;;;;;6262:6:1;6259:30;6256:50;;;6302:1;6299;6292:12;6256:50;6325:22;;6378:4;6370:13;;6366:27;-1:-1:-1;6356:55:1;;6407:1;6404;6397:12;6356:55;6430:73;6495:7;6490:2;6477:16;6472:2;6468;6464:11;6430:73;:::i;6699:257::-;6740:3;6778:5;6772:12;6805:6;6800:3;6793:19;6821:63;6877:6;6870:4;6865:3;6861:14;6854:4;6847:5;6843:16;6821:63;:::i;:::-;6938:2;6917:15;-1:-1:-1;;6913:29:1;6904:39;;;;6945:4;6900:50;;6699:257;-1:-1:-1;;6699:257:1:o;6961:370::-;7118:3;7156:6;7150:13;7172:53;7218:6;7213:3;7206:4;7198:6;7194:17;7172:53;:::i;:::-;7247:16;;;;7272:21;;;-1:-1:-1;7320:4:1;7309:16;;6961:370;-1:-1:-1;6961:370:1:o;7336:1527::-;7560:3;7598:6;7592:13;7624:4;7637:51;7681:6;7676:3;7671:2;7663:6;7659:15;7637:51;:::i;:::-;7751:13;;7710:16;;;;7773:55;7751:13;7710:16;7795:15;;;7773:55;:::i;:::-;7917:13;;7850:20;;;7890:1;;7977;7999:18;;;;8052;;;;8079:93;;8157:4;8147:8;8143:19;8131:31;;8079:93;8220:2;8210:8;8207:16;8187:18;8184:40;8181:167;;;-1:-1:-1;;;8247:33:1;;8303:4;8300:1;8293:15;8333:4;8254:3;8321:17;8181:167;8364:18;8391:110;;;;8515:1;8510:328;;;;8357:481;;8391:110;-1:-1:-1;;8426:24:1;;8412:39;;8471:20;;;;-1:-1:-1;8391:110:1;;8510:328;23981:1;23974:14;;;24018:4;24005:18;;8605:1;8619:169;8633:8;8630:1;8627:15;8619:169;;;8715:14;;8700:13;;;8693:37;8758:16;;;;8650:10;;8619:169;;;8623:3;;8819:8;8812:5;8808:20;8801:27;;8357:481;-1:-1:-1;8854:3:1;;7336:1527;-1:-1:-1;;;;;;;;;;;7336:1527:1:o;9286:488::-;-1:-1:-1;;;;;9555:15:1;;;9537:34;;9607:15;;9602:2;9587:18;;9580:43;9654:2;9639:18;;9632:34;;;9702:3;9697:2;9682:18;;9675:31;;;9480:4;;9723:45;;9748:19;;9740:6;9723:45;:::i;:::-;9715:53;9286:488;-1:-1:-1;;;;;;9286:488:1:o;10556:219::-;10705:2;10694:9;10687:21;10668:4;10725:44;10765:2;10754:9;10750:18;10742:6;10725:44;:::i;15953:356::-;16155:2;16137:21;;;16174:18;;;16167:30;16233:34;16228:2;16213:18;;16206:62;16300:2;16285:18;;15953:356::o;17907:415::-;18109:2;18091:21;;;18148:2;18128:18;;;18121:30;18187:34;18182:2;18167:18;;18160:62;-1:-1:-1;;;18253:2:1;18238:18;;18231:49;18312:3;18297:19;;17907:415::o;23440:275::-;23511:2;23505:9;23576:2;23557:13;;-1:-1:-1;;23553:27:1;23541:40;;-1:-1:-1;;;;;23596:34:1;;23632:22;;;23593:62;23590:88;;;23658:18;;:::i;:::-;23694:2;23687:22;23440:275;;-1:-1:-1;23440:275:1:o;23720:183::-;23780:4;-1:-1:-1;;;;;23805:6:1;23802:30;23799:56;;;23835:18;;:::i;:::-;-1:-1:-1;23880:1:1;23876:14;23892:4;23872:25;;23720:183::o;24034:253::-;24074:3;-1:-1:-1;;;;;24163:2:1;24160:1;24156:10;24193:2;24190:1;24186:10;24224:3;24220:2;24216:12;24211:3;24208:21;24205:47;;;24232:18;;:::i;:::-;24268:13;;24034:253;-1:-1:-1;;;;24034:253:1:o;24292:128::-;24332:3;24363:1;24359:6;24356:1;24353:13;24350:39;;;24369:18;;:::i;:::-;-1:-1:-1;24405:9:1;;24292:128::o;24425:120::-;24465:1;24491;24481:35;;24496:18;;:::i;:::-;-1:-1:-1;24530:9:1;;24425:120::o;24550:168::-;24590:7;24656:1;24652;24648:6;24644:14;24641:1;24638:21;24633:1;24626:9;24619:17;24615:45;24612:71;;;24663:18;;:::i;:::-;-1:-1:-1;24703:9:1;;24550:168::o;24723:246::-;24763:4;-1:-1:-1;;;;;24876:10:1;;;;24846;;24898:12;;;24895:38;;;24913:18;;:::i;:::-;24950:13;;24723:246;-1:-1:-1;;;24723:246:1:o;24974:125::-;25014:4;25042:1;25039;25036:8;25033:34;;;25047:18;;:::i;:::-;-1:-1:-1;25084:9:1;;24974:125::o;25104:258::-;25176:1;25186:113;25200:6;25197:1;25194:13;25186:113;;;25276:11;;;25270:18;25257:11;;;25250:39;25222:2;25215:10;25186:113;;;25317:6;25314:1;25311:13;25308:48;;;-1:-1:-1;;25352:1:1;25334:16;;25327:27;25104:258::o;25367:136::-;25406:3;25434:5;25424:39;;25443:18;;:::i;:::-;-1:-1:-1;;;25479:18:1;;25367:136::o;25508:380::-;25587:1;25583:12;;;;25630;;;25651:61;;25705:4;25697:6;25693:17;25683:27;;25651:61;25758:2;25750:6;25747:14;25727:18;25724:38;25721:161;;;25804:10;25799:3;25795:20;25792:1;25785:31;25839:4;25836:1;25829:15;25867:4;25864:1;25857:15;25721:161;;25508:380;;;:::o;25893:135::-;25932:3;-1:-1:-1;;25953:17:1;;25950:43;;;25973:18;;:::i;:::-;-1:-1:-1;26020:1:1;26009:13;;25893:135::o;26033:112::-;26065:1;26091;26081:35;;26096:18;;:::i;:::-;-1:-1:-1;26130:9:1;;26033:112::o;26150:127::-;26211:10;26206:3;26202:20;26199:1;26192:31;26242:4;26239:1;26232:15;26266:4;26263:1;26256:15;26282:127;26343:10;26338:3;26334:20;26331:1;26324:31;26374:4;26371:1;26364:15;26398:4;26395:1;26388:15;26414:127;26475:10;26470:3;26466:20;26463:1;26456:31;26506:4;26503:1;26496:15;26530:4;26527:1;26520:15;26546:127;26607:10;26602:3;26598:20;26595:1;26588:31;26638:4;26635:1;26628:15;26662:4;26659:1;26652:15;26678:131;-1:-1:-1;;;;;;26752:32:1;;26742:43;;26732:71;;26799:1;26796;26789:12

Swarm Source

ipfs://92cec90ad79ac8bc9fb917e06b85669b14089e66b080308eb59f119387e94f33
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.