ETH Price: $3,442.19 (-1.02%)
Gas: 5 Gwei

Token

Bad Girlfriend Project (BADGF)
 

Overview

Max Total Supply

6,000 BADGF

Holders

3,059

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BADGF
0xe482b0577461e415c02df545dbb61fc6cb6f1347
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

With your Bad Girlfriend, explore Hell together and earn $STYX! All Bad Girlfriends are hand-drawn and have unique personalities!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BADGF

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT LICENSE
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/TESTFROMHELL.sol



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

pragma solidity ^0.8.0;



/**

 * @dev Interface of the ERC165 standard, as defined in the

 * https://eips.ethereum.org/EIPS/eip-165[EIP].

 *

 * Implementers can declare support of contract interfaces, which can then be

 * queried by others ({ERC165Checker}).

 *

 * For an implementation, see {ERC165}.

 */

interface IERC165 {

    /**

     * @dev Returns true if this contract implements the interface defined by

     * `interfaceId`. See the corresponding

     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]

     * to learn more about how these ids are created.

     *

     * This function call must use less than 30 000 gas.

     */

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

}



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

pragma solidity ^0.8.0;



/**

 * @dev Required interface of an ERC721 compliant contract.

 */

interface IERC721 is IERC165 {

    /**

     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.

     */

    event Transfer(

        address indexed from,

        address indexed to,

        uint256 indexed tokenId

    );



    /**

     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.

     */

    event Approval(

        address indexed owner,

        address indexed approved,

        uint256 indexed tokenId

    );



    /**

     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.

     */

    event ApprovalForAll(

        address indexed owner,

        address indexed operator,

        bool approved

    );



    /**

     * @dev Returns the number of tokens in ``owner``'s account.

     */

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



    /**

     * @dev Returns the owner of the `tokenId` token.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     */

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



    /**

     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients

     * are aware of the ERC721 protocol to prevent tokens from being forever locked.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must exist and be owned by `from`.

     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId

    ) external;



    /**

     * @dev Transfers `tokenId` token from `from` to `to`.

     *

     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.

     *

     * Emits a {Transfer} event.

     */

    function transferFrom(

        address from,

        address to,

        uint256 tokenId

    ) external;



    /**

     * @dev Gives permission to `to` to transfer `tokenId` token to another account.

     * The approval is cleared when the token is transferred.

     *

     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.

     *

     * Requirements:

     *

     * - The caller must own the token or be an approved operator.

     * - `tokenId` must exist.

     *

     * Emits an {Approval} event.

     */

    function approve(address to, uint256 tokenId) external;



    /**

     * @dev Returns the account approved for `tokenId` token.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     */

    function getApproved(uint256 tokenId)

        external

        view

        returns (address operator);



    /**

     * @dev Approve or remove `operator` as an operator for the caller.

     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.

     *

     * Requirements:

     *

     * - The `operator` cannot be the caller.

     *

     * Emits an {ApprovalForAll} event.

     */

    function setApprovalForAll(address operator, bool _approved) external;



    /**

     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.

     *

     * See {setApprovalForAll}

     */

    function isApprovedForAll(address owner, address operator)

        external

        view

        returns (bool);



    /**

     * @dev Safely transfers `tokenId` token from `from` to `to`.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must exist and be owned by `from`.

     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId,

        bytes calldata data

    ) external;

}



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



pragma solidity ^0.8.0;



/**

 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension

 * @dev See https://eips.ethereum.org/EIPS/eip-721

 */

interface IERC721Enumerable is IERC721 {

    /**

     * @dev Returns the total amount of tokens stored by the contract.

     */

    function totalSupply() external view returns (uint256);



    /**

     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.

     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.

     */

    function tokenOfOwnerByIndex(address owner, uint256 index)

        external

        view

        returns (uint256 tokenId);



    /**

     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.

     * Use along with {totalSupply} to enumerate all tokens.

     */

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

}



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



pragma solidity ^0.8.0;



/**

 * @dev Implementation of the {IERC165} interface.

 *

 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check

 * for the additional interface id that will be supported. For example:

 *

 * ```solidity

 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);

 * }

 * ```

 *

 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.

 */

abstract contract ERC165 is IERC165 {

    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId)

        public

        view

        virtual

        override

        returns (bool)

    {

        return interfaceId == type(IERC165).interfaceId;

    }

}



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



pragma solidity ^0.8.0;



/**

 * @dev String operations.

 */

library Strings {

    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";



    /**

     * @dev Converts a `uint256` to its ASCII `string` decimal representation.

     */

    function toString(uint256 value) internal pure returns (string memory) {

        // Inspired by OraclizeAPI's implementation - MIT licence

        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol



        if (value == 0) {

            return "0";

        }

        uint256 temp = value;

        uint256 digits;

        while (temp != 0) {

            digits++;

            temp /= 10;

        }

        bytes memory buffer = new bytes(digits);

        while (value != 0) {

            digits -= 1;

            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));

            value /= 10;

        }

        return string(buffer);

    }



    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.

     */

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

    }



    /**

     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.

     */

    function toHexString(uint256 value, uint256 length)

        internal

        pure

        returns (string memory)

    {

        bytes memory buffer = new bytes(2 * length + 2);

        buffer[0] = "0";

        buffer[1] = "x";

        for (uint256 i = 2 * length + 1; i > 1; --i) {

            buffer[i] = _HEX_SYMBOLS[value & 0xf];

            value >>= 4;

        }

        require(value == 0, "Strings: hex length insufficient");

        return string(buffer);

    }

}



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



pragma solidity ^0.8.0;



/**

 * @dev Collection of functions related to the address type

 */

library Address {

    /**

     * @dev Returns true if `account` is a contract.

     *

     * [IMPORTANT]

     * ====

     * It is unsafe to assume that an address for which this function returns

     * false is an externally-owned account (EOA) and not a contract.

     *

     * Among others, `isContract` will return false for the following

     * types of addresses:

     *

     *  - an externally-owned account

     *  - a contract in construction

     *  - an address where a contract will be created

     *  - an address where a contract lived, but was destroyed

     * ====

     */

    function isContract(address account) internal view returns (bool) {

        // This method relies on extcodesize, which returns 0 for contracts in

        // construction, since the code is only stored at the end of the

        // constructor execution.



        uint256 size;

        assembly {

            size := extcodesize(account)

        }

        return size > 0;

    }



    /**

     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to

     * `recipient`, forwarding all available gas and reverting on errors.

     *

     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost

     * of certain opcodes, possibly making contracts go over the 2300 gas limit

     * imposed by `transfer`, making them unable to receive funds via

     * `transfer`. {sendValue} removes this limitation.

     *

     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].

     *

     * IMPORTANT: because control is transferred to `recipient`, care must be

     * taken to not create reentrancy vulnerabilities. Consider using

     * {ReentrancyGuard} or the

     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].

     */

    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"

        );

    }



    /**

     * @dev Performs a Solidity function call using a low level `call`. A

     * plain `call` is an unsafe replacement for a function call: use this

     * function instead.

     *

     * If `target` reverts with a revert reason, it is bubbled up by this

     * function (like regular Solidity function calls).

     *

     * Returns the raw returned data. To convert to the expected return value,

     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].

     *

     * Requirements:

     *

     * - `target` must be a contract.

     * - calling `target` with `data` must not revert.

     *

     * _Available since v3.1._

     */

    function functionCall(address target, bytes memory data)

        internal

        returns (bytes memory)

    {

        return functionCall(target, data, "Address: low-level call failed");

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with

     * `errorMessage` as a fallback revert reason when `target` reverts.

     *

     * _Available since v3.1._

     */

    function functionCall(

        address target,

        bytes memory data,

        string memory errorMessage

    ) internal returns (bytes memory) {

        return functionCallWithValue(target, data, 0, errorMessage);

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],

     * but also transferring `value` wei to `target`.

     *

     * Requirements:

     *

     * - the calling contract must have an ETH balance of at least `value`.

     * - the called Solidity function must be `payable`.

     *

     * _Available since v3.1._

     */

    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"

            );

    }



    /**

     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but

     * with `errorMessage` as a fallback revert reason when `target` reverts.

     *

     * _Available since v3.1._

     */

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

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],

     * but performing a static call.

     *

     * _Available since v3.3._

     */

    function functionStaticCall(address target, bytes memory data)

        internal

        view

        returns (bytes memory)

    {

        return

            functionStaticCall(

                target,

                data,

                "Address: low-level static call failed"

            );

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],

     * but performing a static call.

     *

     * _Available since v3.3._

     */

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

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],

     * but performing a delegate call.

     *

     * _Available since v3.4._

     */

    function functionDelegateCall(address target, bytes memory data)

        internal

        returns (bytes memory)

    {

        return

            functionDelegateCall(

                target,

                data,

                "Address: low-level delegate call failed"

            );

    }



    /**

     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],

     * but performing a delegate call.

     *

     * _Available since v3.4._

     */

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

    }



    /**

     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the

     * revert reason using the provided one.

     *

     * _Available since v4.3._

     */

    function verifyCallResult(

        bool success,

        bytes memory returndata,

        string memory errorMessage

    ) internal pure returns (bytes memory) {

        if (success) {

            return returndata;

        } else {

            // Look for revert reason and bubble it up if present

            if (returndata.length > 0) {

                // The easiest way to bubble the revert reason is using memory via assembly



                assembly {

                    let returndata_size := mload(returndata)

                    revert(add(32, returndata), returndata_size)

                }

            } else {

                revert(errorMessage);

            }

        }

    }

}



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



pragma solidity ^0.8.0;



/**

 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension

 * @dev See https://eips.ethereum.org/EIPS/eip-721

 */

interface IERC721Metadata is IERC721 {

    /**

     * @dev Returns the token collection name.

     */

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



    /**

     * @dev Returns the token collection symbol.

     */

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



    /**

     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.

     */

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

}



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



pragma solidity ^0.8.0;



/**

 * @title ERC721 token receiver interface

 * @dev Interface for any contract that wants to support safeTransfers

 * from ERC721 asset contracts.

 */

interface IERC721Receiver {

    /**

     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}

     * by `operator` from `from`, this function is called.

     *

     * It must return its Solidity selector to confirm the token transfer.

     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.

     *

     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.

     */

    function onERC721Received(

        address operator,

        address from,

        uint256 tokenId,

        bytes calldata data

    ) external returns (bytes4);

}



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

pragma solidity ^0.8.0;




/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension, but not including the Enumerable extension, which is available separately as

 * {ERC721Enumerable}.

 */

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;

    using Strings for uint256;



    // Token name

    string private _name;



    // Token symbol

    string private _symbol;



    // Mapping from token ID to owner address

    mapping(uint256 => address) private _owners;



    // Mapping owner address to token count

    mapping(address => uint256) private _balances;



    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;



    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;



    /**

     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.

     */

    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

    }



    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId)

        public

        view

        virtual

        override(ERC165, IERC165)

        returns (bool)

    {

        return

            interfaceId == type(IERC721).interfaceId ||

            interfaceId == type(IERC721Metadata).interfaceId ||

            super.supportsInterface(interfaceId);

    }



    /**

     * @dev See {IERC721-balanceOf}.

     */

    function balanceOf(address owner)

        public

        view

        virtual

        override

        returns (uint256)

    {

        require(

            owner != address(0),

            "ERC721: balance query for the zero address"

        );

        return _balances[owner];

    }



    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId)

        public

        view

        virtual

        override

        returns (address)

    {

        address owner = _owners[tokenId];

        require(

            owner != address(0),

            "ERC721: owner query for nonexistent token"

        );

        return owner;

    }



    /**

     * @dev See {IERC721Metadata-name}.

     */

    function name() public view virtual override returns (string memory) {

        return _name;

    }



    /**

     * @dev See {IERC721Metadata-symbol}.

     */

    function symbol() public view virtual override returns (string memory) {

        return _symbol;

    }



    /**

     * @dev See {IERC721Metadata-tokenURI}.

     */

    function tokenURI(uint256 tokenId)

        public

        view

        virtual

        override

        returns (string memory)

    {

        require(

            _exists(tokenId),

            "ERC721Metadata: URI query for nonexistent token"

        );



        string memory baseURI = _baseURI();

        return

            bytes(baseURI).length > 0

                ? string(abi.encodePacked(baseURI, tokenId.toString()))

                : "";

    }



    /**

     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each

     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty

     * by default, can be overriden in child contracts.

     */

    function _baseURI() internal view virtual returns (string memory) {

        return "";

    }



    /**

     * @dev See {IERC721-approve}.

     */

    function approve(address to, uint256 tokenId) public virtual override {

        address owner = ERC721.ownerOf(tokenId);

        require(to != owner, "ERC721: approval to current owner");



        require(

            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),

            "ERC721: approve caller is not owner nor approved for all"

        );



        _approve(to, tokenId);

    }



    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId)

        public

        view

        virtual

        override

        returns (address)

    {

        require(

            _exists(tokenId),

            "ERC721: approved query for nonexistent token"

        );



        return _tokenApprovals[tokenId];

    }



    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved)

        public

        virtual

        override

    {

        require(operator != _msgSender(), "ERC721: approve to caller");



        _operatorApprovals[_msgSender()][operator] = approved;

        emit ApprovalForAll(_msgSender(), operator, approved);

    }



    /**

     * @dev See {IERC721-isApprovedForAll}.

     */

    function isApprovedForAll(address owner, address operator)

        public

        view

        virtual

        override

        returns (bool)

    {

        return _operatorApprovals[owner][operator];

    }



    /**

     * @dev See {IERC721-transferFrom}.

     */

    function transferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        //solhint-disable-next-line max-line-length

        require(

            _isApprovedOrOwner(_msgSender(), tokenId),

            "ERC721: transfer caller is not owner nor approved"

        );



        _transfer(from, to, tokenId);

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        safeTransferFrom(from, to, tokenId, "");

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) public virtual override {

        require(

            _isApprovedOrOwner(_msgSender(), tokenId),

            "ERC721: transfer caller is not owner nor approved"

        );

        _safeTransfer(from, to, tokenId, _data);

    }



    /**

     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients

     * are aware of the ERC721 protocol to prevent tokens from being forever locked.

     *

     * `_data` is additional data, it has no specified format and it is sent in call to `to`.

     *

     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.

     * implement alternative mechanisms to perform token transfer, such as signature-based.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `tokenId` token must exist and be owned by `from`.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function _safeTransfer(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) internal virtual {

        _transfer(from, to, tokenId);

        require(

            _checkOnERC721Received(from, to, tokenId, _data),

            "ERC721: transfer to non ERC721Receiver implementer"

        );

    }



    /**

     * @dev Returns whether `tokenId` exists.

     *

     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.

     *

     * Tokens start existing when they are minted (`_mint`),

     * and stop existing when they are burned (`_burn`).

     */

    function _exists(uint256 tokenId) internal view virtual returns (bool) {

        return _owners[tokenId] != address(0);

    }



    /**

     * @dev Returns whether `spender` is allowed to manage `tokenId`.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     */

    function _isApprovedOrOwner(address spender, uint256 tokenId)

        internal

        view

        virtual

        returns (bool)

    {

        require(

            _exists(tokenId),

            "ERC721: operator query for nonexistent token"

        );

        address owner = ERC721.ownerOf(tokenId);

        return (spender == owner ||

            getApproved(tokenId) == spender ||

            isApprovedForAll(owner, spender));

    }



    /**

     * @dev Safely mints `tokenId` and transfers it to `to`.

     *

     * Requirements:

     *

     * - `tokenId` must not exist.

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.

     *

     * Emits a {Transfer} event.

     */

    function _safeMint(address to, uint256 tokenId) internal virtual {

        _safeMint(to, tokenId, "");

    }



    /**

     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is

     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.

     */

    function _safeMint(

        address to,

        uint256 tokenId,

        bytes memory _data

    ) internal virtual {

        _mint(to, tokenId);

        require(

            _checkOnERC721Received(address(0), to, tokenId, _data),

            "ERC721: transfer to non ERC721Receiver implementer"

        );

    }



    /**

     * @dev Mints `tokenId` and transfers it to `to`.

     *

     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible

     *

     * Requirements:

     *

     * - `tokenId` must not exist.

     * - `to` cannot be the zero address.

     *

     * Emits a {Transfer} event.

     */

    function _mint(address to, uint256 tokenId) internal virtual {

        require(to != address(0), "ERC721: mint to the zero address");

        require(!_exists(tokenId), "ERC721: token already minted");



        _beforeTokenTransfer(address(0), to, tokenId);



        _balances[to] += 1;

        _owners[tokenId] = to;



        emit Transfer(address(0), to, tokenId);

    }



    /**

     * @dev Destroys `tokenId`.

     * The approval is cleared when the token is burned.

     *

     * Requirements:

     *

     * - `tokenId` must exist.

     *

     * Emits a {Transfer} event.

     */

    function _burn(uint256 tokenId) internal virtual {

        address owner = ERC721.ownerOf(tokenId);



        _beforeTokenTransfer(owner, address(0), tokenId);



        // Clear approvals

        _approve(address(0), tokenId);



        _balances[owner] -= 1;

        delete _owners[tokenId];



        emit Transfer(owner, address(0), tokenId);

    }



    /**

     * @dev Transfers `tokenId` from `from` to `to`.

     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     *

     * Emits a {Transfer} event.

     */

    function _transfer(

        address from,

        address to,

        uint256 tokenId

    ) internal virtual {

        require(

            ERC721.ownerOf(tokenId) == from,

            "ERC721: transfer of token that is not own"

        );

        require(to != address(0), "ERC721: transfer to the zero address");



        _beforeTokenTransfer(from, to, tokenId);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId);



        _balances[from] -= 1;

        _balances[to] += 1;

        _owners[tokenId] = to;



        emit Transfer(from, to, tokenId);

    }



    /**

     * @dev Approve `to` to operate on `tokenId`

     *

     * Emits a {Approval} event.

     */

    function _approve(address to, uint256 tokenId) internal virtual {

        _tokenApprovals[tokenId] = to;

        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);

    }



    /**

     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.

     * The call is not executed if the target address is not a contract.

     *

     * @param from address representing the previous owner of the given token ID

     * @param to target address that will receive the tokens

     * @param tokenId uint256 ID of the token to be transferred

     * @param _data bytes optional data to send along with the call

     * @return bool whether the call correctly returned the expected magic value

     */

    function _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.onERC721Received.selector;

            } catch (bytes memory reason) {

                if (reason.length == 0) {

                    revert(

                        "ERC721: transfer to non ERC721Receiver implementer"

                    );

                } else {

                    assembly {

                        revert(add(32, reason), mload(reason))

                    }

                }

            }

        } else {

            return true;

        }

    }



    /**

     * @dev Hook that is called before any token transfer. This includes minting

     * and burning.

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, ``from``'s `tokenId` will be burned.

     * - `from` and `to` are never both zero.

     *

     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].

     */

    function _beforeTokenTransfer(

        address from,

        address to,

        uint256 tokenId

    ) internal virtual {}

}



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



pragma solidity ^0.8.0;



/**

 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds

 * enumerability of all the token ids in the contract as well as all token ids owned by each

 * account.

 */

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {

    // Mapping from owner to list of owned token IDs

    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;



    // Mapping from token ID to index of the owner tokens list

    mapping(uint256 => uint256) private _ownedTokensIndex;



    // Array with all token ids, used for enumeration

    uint256[] private _allTokens;



    // Mapping from token id to position in the allTokens array

    mapping(uint256 => uint256) private _allTokensIndex;



    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId)

        public

        view

        virtual

        override(IERC165, ERC721)

        returns (bool)

    {

        return

            interfaceId == type(IERC721Enumerable).interfaceId ||

            super.supportsInterface(interfaceId);

    }



    /**

     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.

     */

    function tokenOfOwnerByIndex(address owner, uint256 index)

        public

        view

        virtual

        override

        returns (uint256)

    {

        require(

            index < ERC721.balanceOf(owner),

            "ERC721Enumerable: owner index out of bounds"

        );

        return _ownedTokens[owner][index];

    }



    /**

     * @dev See {IERC721Enumerable-totalSupply}.

     */

    function totalSupply() public view virtual override returns (uint256) {

        return _allTokens.length;

    }



    /**

     * @dev See {IERC721Enumerable-tokenByIndex}.

     */

    function tokenByIndex(uint256 index)

        public

        view

        virtual

        override

        returns (uint256)

    {

        require(

            index < ERC721Enumerable.totalSupply(),

            "ERC721Enumerable: global index out of bounds"

        );

        return _allTokens[index];

    }



    /**

     * @dev Hook that is called before any token transfer. This includes minting

     * and burning.

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, ``from``'s `tokenId` will be burned.

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     *

     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].

     */

    function _beforeTokenTransfer(

        address from,

        address to,

        uint256 tokenId

    ) internal virtual override {

        super._beforeTokenTransfer(from, to, tokenId);



        if (from == address(0)) {

            _addTokenToAllTokensEnumeration(tokenId);

        } else if (from != to) {

            _removeTokenFromOwnerEnumeration(from, tokenId);

        }

        if (to == address(0)) {

            _removeTokenFromAllTokensEnumeration(tokenId);

        } else if (to != from) {

            _addTokenToOwnerEnumeration(to, tokenId);

        }

    }



    /**

     * @dev Private function to add a token to this extension's ownership-tracking data structures.

     * @param to address representing the new owner of the given token ID

     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address

     */

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {

        uint256 length = ERC721.balanceOf(to);

        _ownedTokens[to][length] = tokenId;

        _ownedTokensIndex[tokenId] = length;

    }



    /**

     * @dev Private function to add a token to this extension's token tracking data structures.

     * @param tokenId uint256 ID of the token to be added to the tokens list

     */

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {

        _allTokensIndex[tokenId] = _allTokens.length;

        _allTokens.push(tokenId);

    }



    /**

     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that

     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for

     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).

     * This has O(1) time complexity, but alters the order of the _ownedTokens array.

     * @param from address representing the previous owner of the given token ID

     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address

     */

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)

        private

    {

        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and

        // then delete the last slot (swap and pop).



        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;

        uint256 tokenIndex = _ownedTokensIndex[tokenId];



        // When the token to delete is the last token, the swap operation is unnecessary

        if (tokenIndex != lastTokenIndex) {

            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];



            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        }



        // This also deletes the contents at the last position of the array

        delete _ownedTokensIndex[tokenId];

        delete _ownedTokens[from][lastTokenIndex];

    }



    /**

     * @dev Private function to remove a token from this extension's token tracking data structures.

     * This has O(1) time complexity, but alters the order of the _allTokens array.

     * @param tokenId uint256 ID of the token to be removed from the tokens list

     */

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {

        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and

        // then delete the last slot (swap and pop).



        uint256 lastTokenIndex = _allTokens.length - 1;

        uint256 tokenIndex = _allTokensIndex[tokenId];



        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so

        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding

        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)

        uint256 lastTokenId = _allTokens[lastTokenIndex];



        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index



        // This also deletes the contents at the last position of the array

        delete _allTokensIndex[tokenId];

        _allTokens.pop();

    }

}

pragma solidity ^0.8.0;

contract BADGF is ERC721Enumerable, Ownable {

    struct TokenInfo {
        IERC20 coin;
        uint256 costvalue;
    }

    TokenInfo[] public AllowedCrypto;
    using Strings for uint256;
    string public baseURI;
    string public baseExtension = "";
    uint256 public cost = 0.025 ether;
    uint256 public maxSupplyRegular = 5150;
    uint256 public maxSupplyElite = 490;
    uint256 public maxSupplyTotal = 6000;
    uint256 public maxMintAmount = 7;
    uint256 public maxMintTotal = 20;
    uint256 public eliteT1total = 200;
    uint256 public eliteT2total = 200;
    uint256 public eliteT3total = 90;
    uint256 public eliteT1supply = 0;
    uint256 public eliteT2supply = 0;
    uint256 public eliteT3supply = 0;
    uint256 public eliteT1price = 140;
    uint256 public eliteT2price = 180;
    uint256 public eliteT3price = 220;
    bool public paused = true;
    bool public teamAllowedMint = true;
    bool public mintedLegendary = false;
    bool public eliteT1Enabled = false;
    bool public eliteT2Enabled = false;
    bool public eliteT3Enabled = false;
    mapping(address => uint256) private _mintedFreeAmount;

    constructor() ERC721("Bad Girlfriend Project", "BADGF") {}

    function addCurrency(IERC20 _coin, uint256 _costvalue)
        public onlyOwner {
        AllowedCrypto.push(
            TokenInfo({coin: _coin, costvalue: _costvalue})
        );
    }

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

    // public
    function freeMint() public {
        uint256 supply = totalSupply();
        require(!paused, "Public sale not active.");
        require(
            _mintedFreeAmount[msg.sender] < 1,
            "Max 1 free mint per address."
        );
        require(supply + 1 <= maxSupplyRegular, "Max supply reached.");
        _mintedFreeAmount[msg.sender] = 1;
        _safeMint(msg.sender, supply + 1);
    }

    function mint(uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused);
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount, "Max 7 NFTs per mint.");
        require(_mintAmount <= maxMintTotal, "Max 20 NFTs per wallet.");
        require(
            supply + _mintAmount <= maxSupplyRegular,
            "Max supply reached, Elite series next."
        );
        require(
            balanceOf(msg.sender) + _mintAmount <= maxMintTotal,
            "Max 20 NFTs per wallet."
        );

        if (msg.sender != owner()) {
            require(
                msg.value == cost * _mintAmount,
                "Pirce is 0.025 ether per NFT"
            );
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function mintLegendary() public onlyOwner {
        uint256 supply = totalSupply();
        require(!mintedLegendary, "Already minted.");
        for (uint256 i = 1; i <= 10; i++) {
            _safeMint(msg.sender, supply + i);
        }
        mintedLegendary = true;
    }

    function teamMint(uint256 _mintAmount) public onlyOwner {
        uint256 supply = totalSupply();
        require(teamAllowedMint, "Team mint not allowed.");
        require(
            supply + _mintAmount <= maxSupplyTotal,
            "Max supply would be reached."
        );
        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function mintEliteT1(uint256 _pid) public payable {
        TokenInfo storage tokens = AllowedCrypto[_pid];
        IERC20 coin;
        coin = tokens.coin;
        uint256 price;
        price = eliteT1price;
        uint256 supply = totalSupply();
        require(eliteT1Enabled, "Not allowed yet.");
        require(supply + 1 <= maxSupplyTotal, "Total supply would be reached.");
        require(eliteT1supply + 1 <= eliteT1total, "Elite T1 supply reached.");

        if (msg.sender != owner()) {
            require(msg.value == price, "Insufficient balance.");
        }

        coin.transferFrom(msg.sender, address(this), price);
        _safeMint(msg.sender, supply + 1);
        eliteT1supply++;

    }

    function mintEliteT2(uint256 _pid) public payable {
        TokenInfo storage tokens = AllowedCrypto[_pid];
        IERC20 coin;
        coin = tokens.coin;
        uint256 price;
        price = eliteT2price;
        uint256 supply = totalSupply();
        require(eliteT2Enabled, "Not allowed yet.");
        require(supply + 1 <= maxSupplyTotal, "Total supply would be reached.");
        require(eliteT2supply + 1 <= eliteT2total, "Elite T2 supply reached.");

        if (msg.sender != owner()) {
            require(msg.value == price, "Insufficient balance.");
        }

        coin.transferFrom(msg.sender, address(this), price);
        _safeMint(msg.sender, supply + 1);
        eliteT2supply++;
    }



    function mintEliteT3(uint256 _pid) public payable {
        TokenInfo storage tokens = AllowedCrypto[_pid];
        IERC20 coin;
        coin = tokens.coin;
        uint256 price;
        price = eliteT3price;
        uint256 supply = totalSupply();
        require(eliteT3Enabled, "Not allowed yet.");
        require(supply + 1 <= maxSupplyTotal, "Total supply would be reached.");
        require(eliteT3supply + 1 <= eliteT3total, "Elite T3 supply reached.");

        if (msg.sender != owner()) {
            require(msg.value == price, "Insufficient balance.");
        }

        coin.transferFrom(msg.sender, address(this), price);
        _safeMint(msg.sender, supply + 1);
        eliteT3supply++;

    }



    function walletOfOwner(address _owner) public view returns (uint256[] memory)  {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
        require(_exists(tokenId), "Token doesn't exist.");
        string memory currentBaseURI = _baseURI();
        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        tokenId.toString(),
                        baseExtension
                    )
                )
                : "";
    }

    // only owner
    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

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

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

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

    function toggleTeamMint(bool _state) public onlyOwner {
        teamAllowedMint = _state;
    }

    function toggleT1Elite(bool _state) public onlyOwner {
        eliteT1Enabled = _state;
    }

    function toggleT2Elite(bool _state) public onlyOwner {
        eliteT2Enabled = _state;
    }

    function toggleT3Elite(bool _state) public onlyOwner {
        eliteT3Enabled = _state;
    }

    function setEliteT1price(uint256 _price) public onlyOwner {
        eliteT1price = _price;
    }

    function setEliteT2price(uint256 _price) public onlyOwner {
        eliteT2price = _price;
    }

    function setEliteT3price(uint256 _price) public onlyOwner {
        eliteT3price = _price;
    }

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

    function withdrawSTYX() public onlyOwner {
        TokenInfo storage tokens = AllowedCrypto[0];
        IERC20 coin;
        coin = tokens.coin;
        uint amount = IERC20(coin).balanceOf(address(this));
        coin.transfer(msg.sender, amount);
    }

}

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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AllowedCrypto","outputs":[{"internalType":"contract IERC20","name":"coin","type":"address"},{"internalType":"uint256","name":"costvalue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_coin","type":"address"},{"internalType":"uint256","name":"_costvalue","type":"uint256"}],"name":"addCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT1Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT1price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT1supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT1total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT2Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT2price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT2supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT2total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT3Enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT3price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT3supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eliteT3total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyElite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyRegular","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mintEliteT1","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mintEliteT2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"mintEliteT3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintedLegendary","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEliteT1price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEliteT2price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setEliteT3price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAllowedMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleT1Elite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleT2Elite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleT3Elite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleTeamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawSTYX","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040819052600060808190526200001b91600d9162000194565b506658d15e17628000600e5561141e600f556101ea60105561177060115560076012556014601381905560c890819055601555605a601655600060178190556018819055601955608c601a5560b4601b5560dc601c55601d805465ffffffff00001961ff001960ff199092166001179190911661010017169055348015620000a257600080fd5b50604080518082018252601681527f426164204769726c667269656e642050726f6a656374000000000000000000006020808301918252835180850190945260058452642120a223a360d91b908401528151919291620001059160009162000194565b5080516200011b90600190602084019062000194565b50505062000138620001326200013e60201b60201c565b62000142565b62000277565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a2906200023a565b90600052602060002090601f016020900481019282620001c6576000855562000211565b82601f10620001e157805160ff191683800117855562000211565b8280016001018555821562000211579182015b8281111562000211578251825591602001919060010190620001f4565b506200021f92915062000223565b5090565b5b808211156200021f576000815560010162000224565b6002810460018216806200024f57607f821691505b602082108114156200027157634e487b7160e01b600052602260045260246000fd5b50919050565b6139ac80620002876000396000f3fe6080604052600436106103ce5760003560e01c80636352211e116101fd578063a7e6297f11610118578063d2e53698116100ab578063ed3601591161007a578063ed36015914610a2f578063efea200014610a44578063f1cd899b14610a59578063f2fde38b14610a79578063fe024c4414610a99576103ce565b8063d2e53698146109ba578063da3ef23f146109cf578063dae1d6d8146109ef578063e985e9c514610a0f576103ce565b8063c2b7b896116100e7578063c2b7b8961461095d578063c668286214610970578063c87b56dd14610985578063cac61911146109a5576103ce565b8063a7e6297f146108f3578063aa7e360114610913578063b57ab47514610928578063b88d4fde1461093d576103ce565b80638a03dd7a116101905780639bef2b301161015f5780639bef2b3014610896578063a0712d68146108ab578063a22cb465146108be578063a7c9d69e146108de576103ce565b80638a03dd7a146108425780638da5cb5b146108575780639363b41f1461086c57806395d89b4114610881576103ce565b806370a08231116101cc57806370a08231146107d8578063715018a6146107f857806373c9a9e61461080d5780637f00c7a614610822576103ce565b80636352211e14610763578063690e4fc3146107835780636bc78da3146107a35780636c0360eb146107c3576103ce565b80633399cdac116102ed578063553c3c1f116102805780635b70ea9f1161024f5780635b70ea9f1461070f5780635c975abb146107245780635f0f6c411461073957806362f0f80a1461074e576103ce565b8063553c3c1f1461069a57806355ad9d5e146106ba57806355f804b3146106da578063560dc361146106fa576103ce565b806342842e0e116102bc57806342842e0e1461061a578063438b63001461063a5780634f6ccce7146106675780635175617014610687576103ce565b80633399cdac146105c857806334ac8abd146105dd578063379a9dd7146105fd5780633ccfd60b14610612576103ce565b806318160ddd1161036557806326c91cad1161033457806326c91cad1461054557806327ccb168146105735780632f745c59146105885780632fbba115146105a8576103ce565b806318160ddd146104e65780631be61b93146104fb578063239c70ae1461051057806323b872dd14610525576103ce565b8063081812fc116103a1578063081812fc14610462578063095ea7b31461048f57806309b1d54d146104af57806313faede6146104c4576103ce565b806301ffc9a7146103d357806302329a291461040957806303bc4c961461042b57806306fdde0314610440575b600080fd5b3480156103df57600080fd5b506103f36103ee366004612d44565b610aac565b6040516104009190612fb2565b60405180910390f35b34801561041557600080fd5b50610429610424366004612d0c565b610ad9565b005b34801561043757600080fd5b506103f3610b34565b34801561044c57600080fd5b50610455610b45565b6040516104009190612fbd565b34801561046e57600080fd5b5061048261047d366004612dc2565b610bd7565b6040516104009190612ee0565b34801561049b57600080fd5b506104296104aa366004612ce1565b610c1a565b3480156104bb57600080fd5b506103f3610cb2565b3480156104d057600080fd5b506104d9610cc4565b60405161040091906137ee565b3480156104f257600080fd5b506104d9610cca565b34801561050757600080fd5b506103f3610cd0565b34801561051c57600080fd5b506104d9610ce0565b34801561053157600080fd5b50610429610540366004612bf7565b610ce6565b34801561055157600080fd5b50610565610560366004612dc2565b610d1e565b604051610400929190612f55565b34801561057f57600080fd5b506104d9610d56565b34801561059457600080fd5b506104d96105a3366004612ce1565b610d5c565b3480156105b457600080fd5b506104296105c3366004612dc2565b610dae565b3480156105d457600080fd5b506104d9610e7b565b3480156105e957600080fd5b506104296105f8366004612d0c565b610e81565b34801561060957600080fd5b506104d9610ee2565b610429610ee8565b34801561062657600080fd5b50610429610635366004612bf7565b610f4d565b34801561064657600080fd5b5061065a610655366004612ba3565b610f68565b6040516104009190612f6e565b34801561067357600080fd5b506104d9610682366004612dc2565b611026565b610429610695366004612dc2565b611081565b3480156106a657600080fd5b506104296106b5366004612dc2565b611243565b3480156106c657600080fd5b506104296106d5366004612dc2565b611287565b3480156106e657600080fd5b506104296106f5366004612d7c565b6112cb565b34801561070657600080fd5b506104d9611321565b34801561071b57600080fd5b50610429611327565b34801561073057600080fd5b506103f36113da565b34801561074557600080fd5b506104d96113e3565b34801561075a57600080fd5b506104d96113e9565b34801561076f57600080fd5b5061048261077e366004612dc2565b6113ef565b34801561078f57600080fd5b5061042961079e366004612ce1565b611424565b3480156107af57600080fd5b506104296107be366004612d0c565b6114f8565b3480156107cf57600080fd5b50610455611555565b3480156107e457600080fd5b506104d96107f3366004612ba3565b6115e3565b34801561080457600080fd5b50610429611627565b34801561081957600080fd5b506103f3611670565b34801561082e57600080fd5b5061042961083d366004612dc2565b61167f565b34801561084e57600080fd5b506104296116c3565b34801561086357600080fd5b50610482611778565b34801561087857600080fd5b506104d9611787565b34801561088d57600080fd5b5061045561178d565b3480156108a257600080fd5b506104d961179c565b6104296108b9366004612dc2565b6117a2565b3480156108ca57600080fd5b506104296108d9366004612cb4565b6118e6565b3480156108ea57600080fd5b506104d96119b4565b3480156108ff57600080fd5b5061042961090e366004612d0c565b6119ba565b34801561091f57600080fd5b506104d9611a19565b34801561093457600080fd5b506103f3611a1f565b34801561094957600080fd5b50610429610958366004612c37565b611a2d565b61042961096b366004612dc2565b611a6c565b34801561097c57600080fd5b50610455611c20565b34801561099157600080fd5b506104556109a0366004612dc2565b611c2d565b3480156109b157600080fd5b506104d9611cb3565b3480156109c657600080fd5b50610429611cb9565b3480156109db57600080fd5b506104296109ea366004612d7c565b611e31565b3480156109fb57600080fd5b50610429610a0a366004612dc2565b611e83565b348015610a1b57600080fd5b506103f3610a2a366004612bbf565b611ec7565b348015610a3b57600080fd5b506104d9611ef5565b348015610a5057600080fd5b506104d9611efb565b348015610a6557600080fd5b50610429610a74366004612d0c565b611f01565b348015610a8557600080fd5b50610429610a94366004612ba3565b611f5a565b610429610aa7366004612dc2565b611fc8565b60006001600160e01b0319821663780e9d6360e01b1480610ad15750610ad18261217d565b90505b919050565b610ae16121bd565b6001600160a01b0316610af2611778565b6001600160a01b031614610b215760405162461bcd60e51b8152600401610b1890613501565b60405180910390fd5b601d805460ff1916911515919091179055565b601d54640100000000900460ff1681565b606060008054610b5490613891565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090613891565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b5050505050905090565b6000610be2826121c1565b610bfe5760405162461bcd60e51b8152600401610b1890613438565b506000908152600460205260409020546001600160a01b031690565b6000610c25826113ef565b9050806001600160a01b0316836001600160a01b03161415610c595760405162461bcd60e51b8152600401610b1890613688565b806001600160a01b0316610c6b6121bd565b6001600160a01b03161480610c875750610c8781610a2a6121bd565b610ca35760405162461bcd60e51b8152600401610b189061327f565b610cad83836121de565b505050565b601d5465010000000000900460ff1681565b600e5481565b60085490565b601d546301000000900460ff1681565b60125481565b610cf7610cf16121bd565b8261224c565b610d135760405162461bcd60e51b8152600401610b1890613721565b610cad8383836122d1565b600b8181548110610d2e57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b60175481565b6000610d67836115e3565b8210610d855760405162461bcd60e51b8152600401610b1890613007565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610db66121bd565b6001600160a01b0316610dc7611778565b6001600160a01b031614610ded5760405162461bcd60e51b8152600401610b1890613501565b6000610df7610cca565b601d54909150610100900460ff16610e215760405162461bcd60e51b8152600401610b18906137be565b601154610e2e8383613803565b1115610e4c5760405162461bcd60e51b8152600401610b1890613121565b60015b828111610cad57610e6933610e648385613803565b6123fe565b80610e73816138cc565b915050610e4f565b60145481565b610e896121bd565b6001600160a01b0316610e9a611778565b6001600160a01b031614610ec05760405162461bcd60e51b8152600401610b1890613501565b601d8054911515650100000000000265ff000000000019909216919091179055565b601a5481565b610ef06121bd565b6001600160a01b0316610f01611778565b6001600160a01b031614610f275760405162461bcd60e51b8152600401610b1890613501565b60405133904780156108fc02916000818181858888f19350505050610f4b57600080fd5b565b610cad83838360405180602001604052806000815250611a2d565b60606000610f75836115e3565b905060008167ffffffffffffffff811115610fa057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc9578160200160208202803683370190505b50905060005b8281101561101e57610fe18582610d5c565b82828151811061100157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611016816138cc565b915050610fcf565b509392505050565b6000611030610cca565b821061104e5760405162461bcd60e51b8152600401610b1890613772565b6008828154811061106f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000600b82815481106110a457634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601c549193506001600160a01b0316916110cd610cca565b601d5490915065010000000000900460ff166110fb5760405162461bcd60e51b8152600401610b18906136f7565b601154611109826001613803565b11156111275760405162461bcd60e51b8152600401610b18906135b6565b601654601954611138906001613803565b11156111565760405162461bcd60e51b8152600401610b189061339e565b61115e611778565b6001600160a01b0316336001600160a01b031614611195578134146111955760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd906111c590339030908790600401612ef4565b602060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190612d28565b5061122733610e64836001613803565b60198054906000611237836138cc565b91905055505050505050565b61124b6121bd565b6001600160a01b031661125c611778565b6001600160a01b0316146112825760405162461bcd60e51b8152600401610b1890613501565b601a55565b61128f6121bd565b6001600160a01b03166112a0611778565b6001600160a01b0316146112c65760405162461bcd60e51b8152600401610b1890613501565b601b55565b6112d36121bd565b6001600160a01b03166112e4611778565b6001600160a01b03161461130a5760405162461bcd60e51b8152600401610b1890613501565b805161131d90600c906020840190612a9a565b5050565b60105481565b6000611331610cca565b601d5490915060ff16156113575760405162461bcd60e51b8152600401610b18906135ed565b336000908152601e60205260409020546001116113865760405162461bcd60e51b8152600401610b1890613624565b600f54611394826001613803565b11156113b25760405162461bcd60e51b8152600401610b189061365b565b336000818152601e602052604090206001908190556113d79190610e64908490613803565b50565b601d5460ff1681565b60195481565b600f5481565b6000818152600260205260408120546001600160a01b031680610ad15760405162461bcd60e51b8152600401610b1890613326565b61142c6121bd565b6001600160a01b031661143d611778565b6001600160a01b0316146114635760405162461bcd60e51b8152600401610b1890613501565b604080518082019091526001600160a01b03928316815260208101918252600b805460018101825560009190915290517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600290920291820180546001600160a01b0319169190941617909255517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba90910155565b6115006121bd565b6001600160a01b0316611511611778565b6001600160a01b0316146115375760405162461bcd60e51b8152600401610b1890613501565b601d805491151563010000000263ff00000019909216919091179055565b600c805461156290613891565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613891565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b505050505081565b60006001600160a01b03821661160b5760405162461bcd60e51b8152600401610b18906132dc565b506001600160a01b031660009081526003602052604090205490565b61162f6121bd565b6001600160a01b0316611640611778565b6001600160a01b0316146116665760405162461bcd60e51b8152600401610b1890613501565b610f4b6000612418565b601d5462010000900460ff1681565b6116876121bd565b6001600160a01b0316611698611778565b6001600160a01b0316146116be5760405162461bcd60e51b8152600401610b1890613501565b601255565b6116cb6121bd565b6001600160a01b03166116dc611778565b6001600160a01b0316146117025760405162461bcd60e51b8152600401610b1890613501565b600061170c610cca565b601d5490915062010000900460ff16156117385760405162461bcd60e51b8152600401610b189061320a565b60015b600a81116117635761175133610e648385613803565b8061175b816138cc565b91505061173b565b5050601d805462ff0000191662010000179055565b600a546001600160a01b031690565b601c5481565b606060018054610b5490613891565b60165481565b60006117ac610cca565b601d5490915060ff16156117bf57600080fd5b600082116117cc57600080fd5b6012548211156117ee5760405162461bcd60e51b8152600401610b189061340a565b6013548211156118105760405162461bcd60e51b8152600401610b1890613484565b600f5461181d8383613803565b111561183b5760405162461bcd60e51b8152600401610b18906134bb565b60135482611848336115e3565b6118529190613803565b11156118705760405162461bcd60e51b8152600401610b1890613484565b611878611778565b6001600160a01b0316336001600160a01b0316146118bc5781600e5461189e919061382f565b34146118bc5760405162461bcd60e51b8152600401610b1890613158565b60015b828111610cad576118d433610e648385613803565b806118de816138cc565b9150506118bf565b6118ee6121bd565b6001600160a01b0316826001600160a01b0316141561191f5760405162461bcd60e51b8152600401610b18906131d3565b806005600061192c6121bd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556119706121bd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a89190612fb2565b60405180910390a35050565b60115481565b6119c26121bd565b6001600160a01b03166119d3611778565b6001600160a01b0316146119f95760405162461bcd60e51b8152600401610b1890613501565b601d80549115156401000000000264ff0000000019909216919091179055565b601b5481565b601d54610100900460ff1681565b611a3e611a386121bd565b8361224c565b611a5a5760405162461bcd60e51b8152600401610b1890613721565b611a668484848461246a565b50505050565b6000600b8281548110611a8f57634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601a549193506001600160a01b031691611ab8610cca565b601d549091506301000000900460ff16611ae45760405162461bcd60e51b8152600401610b18906136f7565b601154611af2826001613803565b1115611b105760405162461bcd60e51b8152600401610b18906135b6565b601454601754611b21906001613803565b1115611b3f5760405162461bcd60e51b8152600401610b189061357f565b611b47611778565b6001600160a01b0316336001600160a01b031614611b7e57813414611b7e5760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611bae90339030908790600401612ef4565b602060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190612d28565b50611c1033610e64836001613803565b60178054906000611237836138cc565b600d805461156290613891565b6060611c38826121c1565b611c545760405162461bcd60e51b8152600401610b18906136c9565b6000611c5e61249d565b90506000815111611c7e5760405180602001604052806000815250611cac565b80611c88846124ac565b600d604051602001611c9c93929190612e1e565b6040516020818303038152906040525b9392505050565b60185481565b611cc16121bd565b6001600160a01b0316611cd2611778565b6001600160a01b031614611cf85760405162461bcd60e51b8152600401610b1890613501565b6000600b600081548110611d1c57634e487b7160e01b600052603260045260246000fd5b60009182526020822060029091020180546040516370a0823160e01b81529193506001600160a01b0316919082906370a0823190611d5e903090600401612ee0565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190612dda565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb90611ddf9033908590600401612f55565b602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a669190612d28565b611e396121bd565b6001600160a01b0316611e4a611778565b6001600160a01b031614611e705760405162461bcd60e51b8152600401610b1890613501565b805161131d90600d906020840190612a9a565b611e8b6121bd565b6001600160a01b0316611e9c611778565b6001600160a01b031614611ec25760405162461bcd60e51b8152600401610b1890613501565b601c55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60155481565b60135481565b611f096121bd565b6001600160a01b0316611f1a611778565b6001600160a01b031614611f405760405162461bcd60e51b8152600401610b1890613501565b601d80549115156101000261ff0019909216919091179055565b611f626121bd565b6001600160a01b0316611f73611778565b6001600160a01b031614611f995760405162461bcd60e51b8152600401610b1890613501565b6001600160a01b038116611fbf5760405162461bcd60e51b8152600401610b18906130a4565b6113d781612418565b6000600b8281548110611feb57634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601b549193506001600160a01b031691612014610cca565b601d54909150640100000000900460ff166120415760405162461bcd60e51b8152600401610b18906136f7565b60115461204f826001613803565b111561206d5760405162461bcd60e51b8152600401610b18906135b6565b60155460185461207e906001613803565b111561209c5760405162461bcd60e51b8152600401610b1890612fd0565b6120a4611778565b6001600160a01b0316336001600160a01b0316146120db578134146120db5760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061210b90339030908790600401612ef4565b602060405180830381600087803b15801561212557600080fd5b505af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190612d28565b5061216d33610e64836001613803565b60188054906000611237836138cc565b60006001600160e01b031982166380ac58cd60e01b14806121ae57506001600160e01b03198216635b5e139f60e01b145b80610ad15750610ad1826125c7565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612213826113ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612257826121c1565b6122735760405162461bcd60e51b8152600401610b1890613233565b600061227e836113ef565b9050806001600160a01b0316846001600160a01b031614806122b95750836001600160a01b03166122ae84610bd7565b6001600160a01b0316145b806122c957506122c98185611ec7565b949350505050565b826001600160a01b03166122e4826113ef565b6001600160a01b03161461230a5760405162461bcd60e51b8152600401610b1890613536565b6001600160a01b0382166123305760405162461bcd60e51b8152600401610b189061318f565b61233b8383836125e0565b6123466000826121de565b6001600160a01b038316600090815260036020526040812080546001929061236f90849061384e565b90915550506001600160a01b038216600090815260036020526040812080546001929061239d908490613803565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61131d828260405180602001604052806000815250612669565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124758484846122d1565b6124818484848461269c565b611a665760405162461bcd60e51b8152600401610b1890613052565b6060600c8054610b5490613891565b6060816124d157506040805180820190915260018152600360fc1b6020820152610ad4565b8160005b81156124fb57806124e5816138cc565b91506124f49050600a8361381b565b91506124d5565b60008167ffffffffffffffff81111561252457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561254e576020820181803683370190505b5090505b84156122c95761256360018361384e565b9150612570600a866138e7565b61257b906030613803565b60f81b81838151811061259e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506125c0600a8661381b565b9450612552565b6001600160e01b031981166301ffc9a760e01b14919050565b6125eb838383610cad565b6001600160a01b03831661260757612602816127b7565b61262a565b816001600160a01b0316836001600160a01b03161461262a5761262a83826127fb565b6001600160a01b0382166126465761264181612898565b610cad565b826001600160a01b0316826001600160a01b031614610cad57610cad8282612971565b61267383836129b5565b612680600084848461269c565b610cad5760405162461bcd60e51b8152600401610b1890613052565b60006126b0846001600160a01b0316612a94565b156127ac57836001600160a01b031663150b7a026126cc6121bd565b8786866040518563ffffffff1660e01b81526004016126ee9493929190612f18565b602060405180830381600087803b15801561270857600080fd5b505af1925050508015612738575060408051601f3d908101601f1916820190925261273591810190612d60565b60015b612792573d808015612766576040519150601f19603f3d011682016040523d82523d6000602084013e61276b565b606091505b50805161278a5760405162461bcd60e51b8152600401610b1890613052565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122c9565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612808846115e3565b612812919061384e565b600083815260076020526040902054909150808214612865576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128aa9060019061384e565b600083815260096020526040812054600880549394509092849081106128e057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061290f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061295557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061297c836115e3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166129db5760405162461bcd60e51b8152600401610b18906133d5565b6129e4816121c1565b15612a015760405162461bcd60e51b8152600401610b18906130ea565b612a0d600083836125e0565b6001600160a01b0382166000908152600360205260408120805460019290612a36908490613803565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612aa690613891565b90600052602060002090601f016020900481019282612ac85760008555612b0e565b82601f10612ae157805160ff1916838001178555612b0e565b82800160010185558215612b0e579182015b82811115612b0e578251825591602001919060010190612af3565b50612b1a929150612b1e565b5090565b5b80821115612b1a5760008155600101612b1f565b600067ffffffffffffffff80841115612b4e57612b4e613927565b604051601f8501601f191681016020018281118282101715612b7257612b72613927565b604052848152915081838501861015612b8a57600080fd5b8484602083013760006020868301015250509392505050565b600060208284031215612bb4578081fd5b8135611cac8161393d565b60008060408385031215612bd1578081fd5b8235612bdc8161393d565b91506020830135612bec8161393d565b809150509250929050565b600080600060608486031215612c0b578081fd5b8335612c168161393d565b92506020840135612c268161393d565b929592945050506040919091013590565b60008060008060808587031215612c4c578081fd5b8435612c578161393d565b93506020850135612c678161393d565b925060408501359150606085013567ffffffffffffffff811115612c89578182fd5b8501601f81018713612c99578182fd5b612ca887823560208401612b33565b91505092959194509250565b60008060408385031215612cc6578182fd5b8235612cd18161393d565b91506020830135612bec81613952565b60008060408385031215612cf3578182fd5b8235612cfe8161393d565b946020939093013593505050565b600060208284031215612d1d578081fd5b8135611cac81613952565b600060208284031215612d39578081fd5b8151611cac81613952565b600060208284031215612d55578081fd5b8135611cac81613960565b600060208284031215612d71578081fd5b8151611cac81613960565b600060208284031215612d8d578081fd5b813567ffffffffffffffff811115612da3578182fd5b8201601f81018413612db3578182fd5b6122c984823560208401612b33565b600060208284031215612dd3578081fd5b5035919050565b600060208284031215612deb578081fd5b5051919050565b60008151808452612e0a816020860160208601613865565b601f01601f19169290920160200192915050565b600084516020612e318285838a01613865565b855191840191612e448184848a01613865565b8554920191839060028104600180831680612e6057607f831692505b858310811415612e7e57634e487b7160e01b88526022600452602488fd5b808015612e925760018114612ea357612ecf565b60ff19851688528388019550612ecf565b612eac8b6137f7565b895b85811015612ec75781548a820152908401908801612eae565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4b90830184612df2565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612fa657835183529284019291840191600101612f8a565b50909695505050505050565b901515815260200190565b600060208252611cac6020830184612df2565b60208082526018908201527f456c69746520543220737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601c908201527f4d617820737570706c7920776f756c6420626520726561636865642e00000000604082015260600190565b6020808252601c908201527f506972636520697320302e30323520657468657220706572204e465400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252600f908201526e20b63932b0b23c9036b4b73a32b21760891b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526015908201527424b739bab33334b1b4b2b73a103130b630b731b29760591b604082015260600190565b60208082526018908201527f456c69746520543320737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526014908201527326b0bc101b9027232a39903832b91036b4b73a1760611b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4d6178203230204e465473207065722077616c6c65742e000000000000000000604082015260600190565b60208082526026908201527f4d617820737570706c7920726561636865642c20456c69746520736572696573604082015265103732bc3a1760d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526018908201527f456c69746520543120737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252601e908201527f546f74616c20737570706c7920776f756c6420626520726561636865642e0000604082015260600190565b60208082526017908201527f5075626c69632073616c65206e6f74206163746976652e000000000000000000604082015260600190565b6020808252601c908201527f4d617820312066726565206d696e742070657220616464726573732e00000000604082015260600190565b60208082526013908201527226b0bc1039bab838363c903932b0b1b432b21760691b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601490820152732a37b5b2b7103237b2b9b713ba1032bc34b9ba1760611b604082015260600190565b60208082526010908201526f2737ba1030b63637bbb2b2103cb2ba1760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601690820152752a32b0b69036b4b73a103737ba1030b63637bbb2b21760511b604082015260600190565b90815260200190565b60009081526020902090565b60008219821115613816576138166138fb565b500190565b60008261382a5761382a613911565b500490565b6000816000190483118215151615613849576138496138fb565b500290565b600082821015613860576138606138fb565b500390565b60005b83811015613880578181015183820152602001613868565b83811115611a665750506000910152565b6002810460018216806138a557607f821691505b602082108114156138c657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138e0576138e06138fb565b5060010190565b6000826138f6576138f6613911565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113d757600080fd5b80151581146113d757600080fd5b6001600160e01b0319811681146113d757600080fdfea26469706673582212204add31ddf361dcef8ed24ee66b7f6f3dc457f6f2495aaebbd7554326b6b8f04964736f6c63430008000033

Deployed Bytecode

0x6080604052600436106103ce5760003560e01c80636352211e116101fd578063a7e6297f11610118578063d2e53698116100ab578063ed3601591161007a578063ed36015914610a2f578063efea200014610a44578063f1cd899b14610a59578063f2fde38b14610a79578063fe024c4414610a99576103ce565b8063d2e53698146109ba578063da3ef23f146109cf578063dae1d6d8146109ef578063e985e9c514610a0f576103ce565b8063c2b7b896116100e7578063c2b7b8961461095d578063c668286214610970578063c87b56dd14610985578063cac61911146109a5576103ce565b8063a7e6297f146108f3578063aa7e360114610913578063b57ab47514610928578063b88d4fde1461093d576103ce565b80638a03dd7a116101905780639bef2b301161015f5780639bef2b3014610896578063a0712d68146108ab578063a22cb465146108be578063a7c9d69e146108de576103ce565b80638a03dd7a146108425780638da5cb5b146108575780639363b41f1461086c57806395d89b4114610881576103ce565b806370a08231116101cc57806370a08231146107d8578063715018a6146107f857806373c9a9e61461080d5780637f00c7a614610822576103ce565b80636352211e14610763578063690e4fc3146107835780636bc78da3146107a35780636c0360eb146107c3576103ce565b80633399cdac116102ed578063553c3c1f116102805780635b70ea9f1161024f5780635b70ea9f1461070f5780635c975abb146107245780635f0f6c411461073957806362f0f80a1461074e576103ce565b8063553c3c1f1461069a57806355ad9d5e146106ba57806355f804b3146106da578063560dc361146106fa576103ce565b806342842e0e116102bc57806342842e0e1461061a578063438b63001461063a5780634f6ccce7146106675780635175617014610687576103ce565b80633399cdac146105c857806334ac8abd146105dd578063379a9dd7146105fd5780633ccfd60b14610612576103ce565b806318160ddd1161036557806326c91cad1161033457806326c91cad1461054557806327ccb168146105735780632f745c59146105885780632fbba115146105a8576103ce565b806318160ddd146104e65780631be61b93146104fb578063239c70ae1461051057806323b872dd14610525576103ce565b8063081812fc116103a1578063081812fc14610462578063095ea7b31461048f57806309b1d54d146104af57806313faede6146104c4576103ce565b806301ffc9a7146103d357806302329a291461040957806303bc4c961461042b57806306fdde0314610440575b600080fd5b3480156103df57600080fd5b506103f36103ee366004612d44565b610aac565b6040516104009190612fb2565b60405180910390f35b34801561041557600080fd5b50610429610424366004612d0c565b610ad9565b005b34801561043757600080fd5b506103f3610b34565b34801561044c57600080fd5b50610455610b45565b6040516104009190612fbd565b34801561046e57600080fd5b5061048261047d366004612dc2565b610bd7565b6040516104009190612ee0565b34801561049b57600080fd5b506104296104aa366004612ce1565b610c1a565b3480156104bb57600080fd5b506103f3610cb2565b3480156104d057600080fd5b506104d9610cc4565b60405161040091906137ee565b3480156104f257600080fd5b506104d9610cca565b34801561050757600080fd5b506103f3610cd0565b34801561051c57600080fd5b506104d9610ce0565b34801561053157600080fd5b50610429610540366004612bf7565b610ce6565b34801561055157600080fd5b50610565610560366004612dc2565b610d1e565b604051610400929190612f55565b34801561057f57600080fd5b506104d9610d56565b34801561059457600080fd5b506104d96105a3366004612ce1565b610d5c565b3480156105b457600080fd5b506104296105c3366004612dc2565b610dae565b3480156105d457600080fd5b506104d9610e7b565b3480156105e957600080fd5b506104296105f8366004612d0c565b610e81565b34801561060957600080fd5b506104d9610ee2565b610429610ee8565b34801561062657600080fd5b50610429610635366004612bf7565b610f4d565b34801561064657600080fd5b5061065a610655366004612ba3565b610f68565b6040516104009190612f6e565b34801561067357600080fd5b506104d9610682366004612dc2565b611026565b610429610695366004612dc2565b611081565b3480156106a657600080fd5b506104296106b5366004612dc2565b611243565b3480156106c657600080fd5b506104296106d5366004612dc2565b611287565b3480156106e657600080fd5b506104296106f5366004612d7c565b6112cb565b34801561070657600080fd5b506104d9611321565b34801561071b57600080fd5b50610429611327565b34801561073057600080fd5b506103f36113da565b34801561074557600080fd5b506104d96113e3565b34801561075a57600080fd5b506104d96113e9565b34801561076f57600080fd5b5061048261077e366004612dc2565b6113ef565b34801561078f57600080fd5b5061042961079e366004612ce1565b611424565b3480156107af57600080fd5b506104296107be366004612d0c565b6114f8565b3480156107cf57600080fd5b50610455611555565b3480156107e457600080fd5b506104d96107f3366004612ba3565b6115e3565b34801561080457600080fd5b50610429611627565b34801561081957600080fd5b506103f3611670565b34801561082e57600080fd5b5061042961083d366004612dc2565b61167f565b34801561084e57600080fd5b506104296116c3565b34801561086357600080fd5b50610482611778565b34801561087857600080fd5b506104d9611787565b34801561088d57600080fd5b5061045561178d565b3480156108a257600080fd5b506104d961179c565b6104296108b9366004612dc2565b6117a2565b3480156108ca57600080fd5b506104296108d9366004612cb4565b6118e6565b3480156108ea57600080fd5b506104d96119b4565b3480156108ff57600080fd5b5061042961090e366004612d0c565b6119ba565b34801561091f57600080fd5b506104d9611a19565b34801561093457600080fd5b506103f3611a1f565b34801561094957600080fd5b50610429610958366004612c37565b611a2d565b61042961096b366004612dc2565b611a6c565b34801561097c57600080fd5b50610455611c20565b34801561099157600080fd5b506104556109a0366004612dc2565b611c2d565b3480156109b157600080fd5b506104d9611cb3565b3480156109c657600080fd5b50610429611cb9565b3480156109db57600080fd5b506104296109ea366004612d7c565b611e31565b3480156109fb57600080fd5b50610429610a0a366004612dc2565b611e83565b348015610a1b57600080fd5b506103f3610a2a366004612bbf565b611ec7565b348015610a3b57600080fd5b506104d9611ef5565b348015610a5057600080fd5b506104d9611efb565b348015610a6557600080fd5b50610429610a74366004612d0c565b611f01565b348015610a8557600080fd5b50610429610a94366004612ba3565b611f5a565b610429610aa7366004612dc2565b611fc8565b60006001600160e01b0319821663780e9d6360e01b1480610ad15750610ad18261217d565b90505b919050565b610ae16121bd565b6001600160a01b0316610af2611778565b6001600160a01b031614610b215760405162461bcd60e51b8152600401610b1890613501565b60405180910390fd5b601d805460ff1916911515919091179055565b601d54640100000000900460ff1681565b606060008054610b5490613891565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090613891565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b5050505050905090565b6000610be2826121c1565b610bfe5760405162461bcd60e51b8152600401610b1890613438565b506000908152600460205260409020546001600160a01b031690565b6000610c25826113ef565b9050806001600160a01b0316836001600160a01b03161415610c595760405162461bcd60e51b8152600401610b1890613688565b806001600160a01b0316610c6b6121bd565b6001600160a01b03161480610c875750610c8781610a2a6121bd565b610ca35760405162461bcd60e51b8152600401610b189061327f565b610cad83836121de565b505050565b601d5465010000000000900460ff1681565b600e5481565b60085490565b601d546301000000900460ff1681565b60125481565b610cf7610cf16121bd565b8261224c565b610d135760405162461bcd60e51b8152600401610b1890613721565b610cad8383836122d1565b600b8181548110610d2e57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b60175481565b6000610d67836115e3565b8210610d855760405162461bcd60e51b8152600401610b1890613007565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610db66121bd565b6001600160a01b0316610dc7611778565b6001600160a01b031614610ded5760405162461bcd60e51b8152600401610b1890613501565b6000610df7610cca565b601d54909150610100900460ff16610e215760405162461bcd60e51b8152600401610b18906137be565b601154610e2e8383613803565b1115610e4c5760405162461bcd60e51b8152600401610b1890613121565b60015b828111610cad57610e6933610e648385613803565b6123fe565b80610e73816138cc565b915050610e4f565b60145481565b610e896121bd565b6001600160a01b0316610e9a611778565b6001600160a01b031614610ec05760405162461bcd60e51b8152600401610b1890613501565b601d8054911515650100000000000265ff000000000019909216919091179055565b601a5481565b610ef06121bd565b6001600160a01b0316610f01611778565b6001600160a01b031614610f275760405162461bcd60e51b8152600401610b1890613501565b60405133904780156108fc02916000818181858888f19350505050610f4b57600080fd5b565b610cad83838360405180602001604052806000815250611a2d565b60606000610f75836115e3565b905060008167ffffffffffffffff811115610fa057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610fc9578160200160208202803683370190505b50905060005b8281101561101e57610fe18582610d5c565b82828151811061100157634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611016816138cc565b915050610fcf565b509392505050565b6000611030610cca565b821061104e5760405162461bcd60e51b8152600401610b1890613772565b6008828154811061106f57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000600b82815481106110a457634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601c549193506001600160a01b0316916110cd610cca565b601d5490915065010000000000900460ff166110fb5760405162461bcd60e51b8152600401610b18906136f7565b601154611109826001613803565b11156111275760405162461bcd60e51b8152600401610b18906135b6565b601654601954611138906001613803565b11156111565760405162461bcd60e51b8152600401610b189061339e565b61115e611778565b6001600160a01b0316336001600160a01b031614611195578134146111955760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd906111c590339030908790600401612ef4565b602060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190612d28565b5061122733610e64836001613803565b60198054906000611237836138cc565b91905055505050505050565b61124b6121bd565b6001600160a01b031661125c611778565b6001600160a01b0316146112825760405162461bcd60e51b8152600401610b1890613501565b601a55565b61128f6121bd565b6001600160a01b03166112a0611778565b6001600160a01b0316146112c65760405162461bcd60e51b8152600401610b1890613501565b601b55565b6112d36121bd565b6001600160a01b03166112e4611778565b6001600160a01b03161461130a5760405162461bcd60e51b8152600401610b1890613501565b805161131d90600c906020840190612a9a565b5050565b60105481565b6000611331610cca565b601d5490915060ff16156113575760405162461bcd60e51b8152600401610b18906135ed565b336000908152601e60205260409020546001116113865760405162461bcd60e51b8152600401610b1890613624565b600f54611394826001613803565b11156113b25760405162461bcd60e51b8152600401610b189061365b565b336000818152601e602052604090206001908190556113d79190610e64908490613803565b50565b601d5460ff1681565b60195481565b600f5481565b6000818152600260205260408120546001600160a01b031680610ad15760405162461bcd60e51b8152600401610b1890613326565b61142c6121bd565b6001600160a01b031661143d611778565b6001600160a01b0316146114635760405162461bcd60e51b8152600401610b1890613501565b604080518082019091526001600160a01b03928316815260208101918252600b805460018101825560009190915290517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600290920291820180546001600160a01b0319169190941617909255517f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01dba90910155565b6115006121bd565b6001600160a01b0316611511611778565b6001600160a01b0316146115375760405162461bcd60e51b8152600401610b1890613501565b601d805491151563010000000263ff00000019909216919091179055565b600c805461156290613891565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613891565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b505050505081565b60006001600160a01b03821661160b5760405162461bcd60e51b8152600401610b18906132dc565b506001600160a01b031660009081526003602052604090205490565b61162f6121bd565b6001600160a01b0316611640611778565b6001600160a01b0316146116665760405162461bcd60e51b8152600401610b1890613501565b610f4b6000612418565b601d5462010000900460ff1681565b6116876121bd565b6001600160a01b0316611698611778565b6001600160a01b0316146116be5760405162461bcd60e51b8152600401610b1890613501565b601255565b6116cb6121bd565b6001600160a01b03166116dc611778565b6001600160a01b0316146117025760405162461bcd60e51b8152600401610b1890613501565b600061170c610cca565b601d5490915062010000900460ff16156117385760405162461bcd60e51b8152600401610b189061320a565b60015b600a81116117635761175133610e648385613803565b8061175b816138cc565b91505061173b565b5050601d805462ff0000191662010000179055565b600a546001600160a01b031690565b601c5481565b606060018054610b5490613891565b60165481565b60006117ac610cca565b601d5490915060ff16156117bf57600080fd5b600082116117cc57600080fd5b6012548211156117ee5760405162461bcd60e51b8152600401610b189061340a565b6013548211156118105760405162461bcd60e51b8152600401610b1890613484565b600f5461181d8383613803565b111561183b5760405162461bcd60e51b8152600401610b18906134bb565b60135482611848336115e3565b6118529190613803565b11156118705760405162461bcd60e51b8152600401610b1890613484565b611878611778565b6001600160a01b0316336001600160a01b0316146118bc5781600e5461189e919061382f565b34146118bc5760405162461bcd60e51b8152600401610b1890613158565b60015b828111610cad576118d433610e648385613803565b806118de816138cc565b9150506118bf565b6118ee6121bd565b6001600160a01b0316826001600160a01b0316141561191f5760405162461bcd60e51b8152600401610b18906131d3565b806005600061192c6121bd565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556119706121bd565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a89190612fb2565b60405180910390a35050565b60115481565b6119c26121bd565b6001600160a01b03166119d3611778565b6001600160a01b0316146119f95760405162461bcd60e51b8152600401610b1890613501565b601d80549115156401000000000264ff0000000019909216919091179055565b601b5481565b601d54610100900460ff1681565b611a3e611a386121bd565b8361224c565b611a5a5760405162461bcd60e51b8152600401610b1890613721565b611a668484848461246a565b50505050565b6000600b8281548110611a8f57634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601a549193506001600160a01b031691611ab8610cca565b601d549091506301000000900460ff16611ae45760405162461bcd60e51b8152600401610b18906136f7565b601154611af2826001613803565b1115611b105760405162461bcd60e51b8152600401610b18906135b6565b601454601754611b21906001613803565b1115611b3f5760405162461bcd60e51b8152600401610b189061357f565b611b47611778565b6001600160a01b0316336001600160a01b031614611b7e57813414611b7e5760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd90611bae90339030908790600401612ef4565b602060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190612d28565b50611c1033610e64836001613803565b60178054906000611237836138cc565b600d805461156290613891565b6060611c38826121c1565b611c545760405162461bcd60e51b8152600401610b18906136c9565b6000611c5e61249d565b90506000815111611c7e5760405180602001604052806000815250611cac565b80611c88846124ac565b600d604051602001611c9c93929190612e1e565b6040516020818303038152906040525b9392505050565b60185481565b611cc16121bd565b6001600160a01b0316611cd2611778565b6001600160a01b031614611cf85760405162461bcd60e51b8152600401610b1890613501565b6000600b600081548110611d1c57634e487b7160e01b600052603260045260246000fd5b60009182526020822060029091020180546040516370a0823160e01b81529193506001600160a01b0316919082906370a0823190611d5e903090600401612ee0565b60206040518083038186803b158015611d7657600080fd5b505afa158015611d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dae9190612dda565b60405163a9059cbb60e01b81529091506001600160a01b0383169063a9059cbb90611ddf9033908590600401612f55565b602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a669190612d28565b611e396121bd565b6001600160a01b0316611e4a611778565b6001600160a01b031614611e705760405162461bcd60e51b8152600401610b1890613501565b805161131d90600d906020840190612a9a565b611e8b6121bd565b6001600160a01b0316611e9c611778565b6001600160a01b031614611ec25760405162461bcd60e51b8152600401610b1890613501565b601c55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b60155481565b60135481565b611f096121bd565b6001600160a01b0316611f1a611778565b6001600160a01b031614611f405760405162461bcd60e51b8152600401610b1890613501565b601d80549115156101000261ff0019909216919091179055565b611f626121bd565b6001600160a01b0316611f73611778565b6001600160a01b031614611f995760405162461bcd60e51b8152600401610b1890613501565b6001600160a01b038116611fbf5760405162461bcd60e51b8152600401610b18906130a4565b6113d781612418565b6000600b8281548110611feb57634e487b7160e01b600052603260045260246000fd5b6000918252602082206002909102018054601b549193506001600160a01b031691612014610cca565b601d54909150640100000000900460ff166120415760405162461bcd60e51b8152600401610b18906136f7565b60115461204f826001613803565b111561206d5760405162461bcd60e51b8152600401610b18906135b6565b60155460185461207e906001613803565b111561209c5760405162461bcd60e51b8152600401610b1890612fd0565b6120a4611778565b6001600160a01b0316336001600160a01b0316146120db578134146120db5760405162461bcd60e51b8152600401610b189061336f565b6040516323b872dd60e01b81526001600160a01b038416906323b872dd9061210b90339030908790600401612ef4565b602060405180830381600087803b15801561212557600080fd5b505af1158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190612d28565b5061216d33610e64836001613803565b60188054906000611237836138cc565b60006001600160e01b031982166380ac58cd60e01b14806121ae57506001600160e01b03198216635b5e139f60e01b145b80610ad15750610ad1826125c7565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612213826113ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612257826121c1565b6122735760405162461bcd60e51b8152600401610b1890613233565b600061227e836113ef565b9050806001600160a01b0316846001600160a01b031614806122b95750836001600160a01b03166122ae84610bd7565b6001600160a01b0316145b806122c957506122c98185611ec7565b949350505050565b826001600160a01b03166122e4826113ef565b6001600160a01b03161461230a5760405162461bcd60e51b8152600401610b1890613536565b6001600160a01b0382166123305760405162461bcd60e51b8152600401610b189061318f565b61233b8383836125e0565b6123466000826121de565b6001600160a01b038316600090815260036020526040812080546001929061236f90849061384e565b90915550506001600160a01b038216600090815260036020526040812080546001929061239d908490613803565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61131d828260405180602001604052806000815250612669565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124758484846122d1565b6124818484848461269c565b611a665760405162461bcd60e51b8152600401610b1890613052565b6060600c8054610b5490613891565b6060816124d157506040805180820190915260018152600360fc1b6020820152610ad4565b8160005b81156124fb57806124e5816138cc565b91506124f49050600a8361381b565b91506124d5565b60008167ffffffffffffffff81111561252457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561254e576020820181803683370190505b5090505b84156122c95761256360018361384e565b9150612570600a866138e7565b61257b906030613803565b60f81b81838151811061259e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506125c0600a8661381b565b9450612552565b6001600160e01b031981166301ffc9a760e01b14919050565b6125eb838383610cad565b6001600160a01b03831661260757612602816127b7565b61262a565b816001600160a01b0316836001600160a01b03161461262a5761262a83826127fb565b6001600160a01b0382166126465761264181612898565b610cad565b826001600160a01b0316826001600160a01b031614610cad57610cad8282612971565b61267383836129b5565b612680600084848461269c565b610cad5760405162461bcd60e51b8152600401610b1890613052565b60006126b0846001600160a01b0316612a94565b156127ac57836001600160a01b031663150b7a026126cc6121bd565b8786866040518563ffffffff1660e01b81526004016126ee9493929190612f18565b602060405180830381600087803b15801561270857600080fd5b505af1925050508015612738575060408051601f3d908101601f1916820190925261273591810190612d60565b60015b612792573d808015612766576040519150601f19603f3d011682016040523d82523d6000602084013e61276b565b606091505b50805161278a5760405162461bcd60e51b8152600401610b1890613052565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122c9565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001612808846115e3565b612812919061384e565b600083815260076020526040902054909150808214612865576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906128aa9060019061384e565b600083815260096020526040812054600880549394509092849081106128e057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061290f57634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061295557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061297c836115e3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166129db5760405162461bcd60e51b8152600401610b18906133d5565b6129e4816121c1565b15612a015760405162461bcd60e51b8152600401610b18906130ea565b612a0d600083836125e0565b6001600160a01b0382166000908152600360205260408120805460019290612a36908490613803565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054612aa690613891565b90600052602060002090601f016020900481019282612ac85760008555612b0e565b82601f10612ae157805160ff1916838001178555612b0e565b82800160010185558215612b0e579182015b82811115612b0e578251825591602001919060010190612af3565b50612b1a929150612b1e565b5090565b5b80821115612b1a5760008155600101612b1f565b600067ffffffffffffffff80841115612b4e57612b4e613927565b604051601f8501601f191681016020018281118282101715612b7257612b72613927565b604052848152915081838501861015612b8a57600080fd5b8484602083013760006020868301015250509392505050565b600060208284031215612bb4578081fd5b8135611cac8161393d565b60008060408385031215612bd1578081fd5b8235612bdc8161393d565b91506020830135612bec8161393d565b809150509250929050565b600080600060608486031215612c0b578081fd5b8335612c168161393d565b92506020840135612c268161393d565b929592945050506040919091013590565b60008060008060808587031215612c4c578081fd5b8435612c578161393d565b93506020850135612c678161393d565b925060408501359150606085013567ffffffffffffffff811115612c89578182fd5b8501601f81018713612c99578182fd5b612ca887823560208401612b33565b91505092959194509250565b60008060408385031215612cc6578182fd5b8235612cd18161393d565b91506020830135612bec81613952565b60008060408385031215612cf3578182fd5b8235612cfe8161393d565b946020939093013593505050565b600060208284031215612d1d578081fd5b8135611cac81613952565b600060208284031215612d39578081fd5b8151611cac81613952565b600060208284031215612d55578081fd5b8135611cac81613960565b600060208284031215612d71578081fd5b8151611cac81613960565b600060208284031215612d8d578081fd5b813567ffffffffffffffff811115612da3578182fd5b8201601f81018413612db3578182fd5b6122c984823560208401612b33565b600060208284031215612dd3578081fd5b5035919050565b600060208284031215612deb578081fd5b5051919050565b60008151808452612e0a816020860160208601613865565b601f01601f19169290920160200192915050565b600084516020612e318285838a01613865565b855191840191612e448184848a01613865565b8554920191839060028104600180831680612e6057607f831692505b858310811415612e7e57634e487b7160e01b88526022600452602488fd5b808015612e925760018114612ea357612ecf565b60ff19851688528388019550612ecf565b612eac8b6137f7565b895b85811015612ec75781548a820152908401908801612eae565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f4b90830184612df2565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015612fa657835183529284019291840191600101612f8a565b50909695505050505050565b901515815260200190565b600060208252611cac6020830184612df2565b60208082526018908201527f456c69746520543220737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601c908201527f4d617820737570706c7920776f756c6420626520726561636865642e00000000604082015260600190565b6020808252601c908201527f506972636520697320302e30323520657468657220706572204e465400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252600f908201526e20b63932b0b23c9036b4b73a32b21760891b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526015908201527424b739bab33334b1b4b2b73a103130b630b731b29760591b604082015260600190565b60208082526018908201527f456c69746520543320737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526014908201527326b0bc101b9027232a39903832b91036b4b73a1760611b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4d6178203230204e465473207065722077616c6c65742e000000000000000000604082015260600190565b60208082526026908201527f4d617820737570706c7920726561636865642c20456c69746520736572696573604082015265103732bc3a1760d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526018908201527f456c69746520543120737570706c7920726561636865642e0000000000000000604082015260600190565b6020808252601e908201527f546f74616c20737570706c7920776f756c6420626520726561636865642e0000604082015260600190565b60208082526017908201527f5075626c69632073616c65206e6f74206163746976652e000000000000000000604082015260600190565b6020808252601c908201527f4d617820312066726565206d696e742070657220616464726573732e00000000604082015260600190565b60208082526013908201527226b0bc1039bab838363c903932b0b1b432b21760691b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601490820152732a37b5b2b7103237b2b9b713ba1032bc34b9ba1760611b604082015260600190565b60208082526010908201526f2737ba1030b63637bbb2b2103cb2ba1760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252601690820152752a32b0b69036b4b73a103737ba1030b63637bbb2b21760511b604082015260600190565b90815260200190565b60009081526020902090565b60008219821115613816576138166138fb565b500190565b60008261382a5761382a613911565b500490565b6000816000190483118215151615613849576138496138fb565b500290565b600082821015613860576138606138fb565b500390565b60005b83811015613880578181015183820152602001613868565b83811115611a665750506000910152565b6002810460018216806138a557607f821691505b602082108114156138c657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156138e0576138e06138fb565b5060010190565b6000826138f6576138f6613911565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113d757600080fd5b80151581146113d757600080fd5b6001600160e01b0319811681146113d757600080fdfea26469706673582212204add31ddf361dcef8ed24ee66b7f6f3dc457f6f2495aaebbd7554326b6b8f04964736f6c63430008000033

Deployed Bytecode Sourcemap

50962:8347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44201:320;;;;;;;;;;-1:-1:-1;44201:320:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58096:79;;;;;;;;;;-1:-1:-1;58096:79:0;;;;;:::i;:::-;;:::i;:::-;;51996:34;;;;;;;;;;;;;:::i;30521:104::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32334:334::-;;;;;;;;;;-1:-1:-1;32334:334:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31827:431::-;;;;;;;;;;-1:-1:-1;31827:431:0;;;;;:::i;:::-;;:::i;52037:34::-;;;;;;;;;;;;;:::i;51236:33::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45068:117::-;;;;;;;;;;;;;:::i;51955:34::-;;;;;;;;;;;;;:::i;51406:32::-;;;;;;;;;;;;;:::i;33483:400::-;;;;;;;;;;-1:-1:-1;33483:400:0;;;;;:::i;:::-;;:::i;51098:32::-;;;;;;;;;;-1:-1:-1;51098:32:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;51603:::-;;;;;;;;;;;;;:::i;44615:367::-;;;;;;;;;;-1:-1:-1;44615:367:0;;;;;:::i;:::-;;:::i;54156:406::-;;;;;;;;;;-1:-1:-1;54156:406:0;;;;;:::i;:::-;;:::i;51484:33::-;;;;;;;;;;;;;:::i;58494:95::-;;;;;;;;;;-1:-1:-1;58494:95:0;;;;;:::i;:::-;;:::i;51720:33::-;;;;;;;;;;;;;:::i;58915:121::-;;;:::i;33964:197::-;;;;;;;;;;-1:-1:-1;33964:197:0;;;;;:::i;:::-;;:::i;56799:359::-;;;;;;;;;;-1:-1:-1;56799:359:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45272:344::-;;;;;;;;;;-1:-1:-1;45272:344:0;;;;;:::i;:::-;;:::i;56054:733::-;;;;;;:::i;:::-;;:::i;58597:98::-;;;;;;;;;;-1:-1:-1;58597:98:0;;;;;:::i;:::-;;:::i;58703:::-;;;;;;;;;;-1:-1:-1;58703:98:0;;;;;:::i;:::-;;:::i;57848:104::-;;;;;;;;;;-1:-1:-1;57848:104:0;;;;;:::i;:::-;;:::i;51321:35::-;;;;;;;;;;;;;:::i;52553:413::-;;;;;;;;;;;;;:::i;51840:25::-;;;;;;;;;;;;;:::i;51681:32::-;;;;;;;;;;;;;:::i;51276:38::-;;;;;;;;;;;;;:::i;30092:352::-;;;;;;;;;;-1:-1:-1;30092:352:0;;;;;:::i;:::-;;:::i;52206:191::-;;;;;;;;;;-1:-1:-1;52206:191:0;;;;;:::i;:::-;;:::i;58288:95::-;;;;;;;;;;-1:-1:-1;58288:95:0;;;;;:::i;:::-;;:::i;51169:21::-;;;;;;;;;;;;;:::i;29701:319::-;;;;;;;;;;-1:-1:-1;29701:319:0;;;;;:::i;:::-;;:::i;5597:103::-;;;;;;;;;;;;;:::i;51913:35::-;;;;;;;;;;;;;:::i;57718:122::-;;;;;;;;;;-1:-1:-1;57718:122:0;;;;;:::i;:::-;;:::i;53865:283::-;;;;;;;;;;;;;:::i;4946:87::-;;;;;;;;;;;;;:::i;51800:33::-;;;;;;;;;;;;;:::i;30704:108::-;;;;;;;;;;;;;:::i;51564:32::-;;;;;;;;;;;;;:::i;52974:883::-;;;;;;:::i;:::-;;:::i;32750:345::-;;;;;;;;;;-1:-1:-1;32750:345:0;;;;;:::i;:::-;;:::i;51363:36::-;;;;;;;;;;;;;:::i;58391:95::-;;;;;;;;;;-1:-1:-1;58391:95:0;;;;;:::i;:::-;;:::i;51760:33::-;;;;;;;;;;;;;:::i;51872:34::-;;;;;;;;;;;;;:::i;34242:387::-;;;;;;;;;;-1:-1:-1;34242:387:0;;;;;:::i;:::-;;:::i;54570:733::-;;;;;;:::i;:::-;;:::i;51197:32::-;;;;;;;;;;;;;:::i;57166:525::-;;;;;;;;;;-1:-1:-1;57166:525:0;;;;;:::i;:::-;;:::i;51642:32::-;;;;;;;;;;;;;:::i;59044:260::-;;;;;;;;;;;;;:::i;57960:128::-;;;;;;;;;;-1:-1:-1;57960:128:0;;;;;:::i;:::-;;:::i;58809:98::-;;;;;;;;;;-1:-1:-1;58809:98:0;;;;;:::i;:::-;;:::i;33176:230::-;;;;;;;;;;-1:-1:-1;33176:230:0;;;;;:::i;:::-;;:::i;51524:33::-;;;;;;;;;;;;;:::i;51445:32::-;;;;;;;;;;;;;:::i;58183:97::-;;;;;;;;;;-1:-1:-1;58183:97:0;;;;;:::i;:::-;;:::i;5855:201::-;;;;;;;;;;-1:-1:-1;5855:201:0;;;;;:::i;:::-;;:::i;55311:731::-;;;;;;:::i;:::-;;:::i;44201:320::-;44358:4;-1:-1:-1;;;;;;44406:50:0;;-1:-1:-1;;;44406:50:0;;:105;;;44475:36;44499:11;44475:23;:36::i;:::-;44384:127;;44201:320;;;;:::o;58096:79::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;;;;;;;;;58152:6:::1;:15:::0;;-1:-1:-1;;58152:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58096:79::o;51996:34::-;;;;;;;;;:::o;30521:104::-;30575:13;30610:5;30603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30521:104;:::o;32334:334::-;32465:7;32518:16;32526:7;32518;:16::i;:::-;32494:116;;;;-1:-1:-1;;;32494:116:0;;;;;;;:::i;:::-;-1:-1:-1;32634:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32634:24:0;;32334:334::o;31827:431::-;31910:13;31926:23;31941:7;31926:14;:23::i;:::-;31910:39;;31976:5;-1:-1:-1;;;;;31970:11:0;:2;-1:-1:-1;;;;;31970:11:0;;;31962:57;;;;-1:-1:-1;;;31962:57:0;;;;;;;:::i;:::-;32076:5;-1:-1:-1;;;;;32060:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;32060:21:0;;:62;;;;32085:37;32102:5;32109:12;:10;:12::i;32085:37::-;32036:174;;;;-1:-1:-1;;;32036:174:0;;;;;;;:::i;:::-;32227:21;32236:2;32240:7;32227:8;:21::i;:::-;31827:431;;;:::o;52037:34::-;;;;;;;;;:::o;51236:33::-;;;;:::o;45068:117::-;45158:10;:17;45068:117;:::o;51955:34::-;;;;;;;;;:::o;51406:32::-;;;;:::o;33483:400::-;33706:41;33725:12;:10;:12::i;:::-;33739:7;33706:18;:41::i;:::-;33682:146;;;;-1:-1:-1;;;33682:146:0;;;;;;;:::i;:::-;33845:28;33855:4;33861:2;33865:7;33845:9;:28::i;51098:32::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51098:32:0;;;;-1:-1:-1;51098:32:0;:::o;51603:::-;;;;:::o;44615:367::-;44767:7;44828:23;44845:5;44828:16;:23::i;:::-;44820:5;:31;44796:130;;;;-1:-1:-1;;;44796:130:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;44946:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44615:367::o;54156:406::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;54223:14:::1;54240:13;:11;:13::i;:::-;54272:15;::::0;54223:30;;-1:-1:-1;54272:15:0::1;::::0;::::1;;;54264:50;;;;-1:-1:-1::0;;;54264:50:0::1;;;;;;;:::i;:::-;54371:14;::::0;54347:20:::1;54356:11:::0;54347:6;:20:::1;:::i;:::-;:38;;54325:116;;;;-1:-1:-1::0;;;54325:116:0::1;;;;;;;:::i;:::-;54469:1;54452:103;54477:11;54472:1;:16;54452:103;;54510:33;54520:10;54532;54541:1:::0;54532:6;:10:::1;:::i;:::-;54510:9;:33::i;:::-;54490:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54452:103;;51484:33:::0;;;;:::o;58494:95::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58558:14:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;58558:23:0;;::::1;::::0;;;::::1;::::0;;58494:95::o;51720:33::-;;;;:::o;58915:121::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58980:47:::1;::::0;58988:10:::1;::::0;59005:21:::1;58980:47:::0;::::1;;;::::0;::::1;::::0;;;59005:21;58988:10;58980:47;::::1;;;;;;58972:56;;;::::0;::::1;;58915:121::o:0;33964:197::-;34112:39;34129:4;34135:2;34139:7;34112:39;;;;;;;;;;;;:16;:39::i;56799:359::-;56859:16;56889:23;56915:17;56925:6;56915:9;:17::i;:::-;56889:43;;56943:25;56985:15;56971:30;;;;;;-1:-1:-1;;;56971:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56971:30:0;;56943:58;;57017:9;57012:113;57032:15;57028:1;:19;57012:113;;;57083:30;57103:6;57111:1;57083:19;:30::i;:::-;57069:8;57078:1;57069:11;;;;;;-1:-1:-1;;;57069:11:0;;;;;;;;;;;;;;;;;;:44;57049:3;;;;:::i;:::-;;;;57012:113;;;-1:-1:-1;57142:8:0;56799:359;-1:-1:-1;;;56799:359:0:o;45272:344::-;45402:7;45463:30;:28;:30::i;:::-;45455:5;:38;45431:138;;;;-1:-1:-1;;;45431:138:0;;;;;;;:::i;:::-;45589:10;45600:5;45589:17;;;;;;-1:-1:-1;;;45589:17:0;;;;;;;;;;;;;;;;;45582:24;;45272:344;;;:::o;56054:733::-;56115:24;56142:13;56156:4;56142:19;;;;;;-1:-1:-1;;;56142:19:0;;;;;;;;;;;;;;;;;;;;;56201:11;;56255:12;;56142:19;;-1:-1:-1;;;;;;56201:11:0;;56295:13;:11;:13::i;:::-;56327:14;;56278:30;;-1:-1:-1;56327:14:0;;;;;56319:43;;;;-1:-1:-1;;;56319:43:0;;;;;;;:::i;:::-;56395:14;;56381:10;:6;56390:1;56381:10;:::i;:::-;:28;;56373:71;;;;-1:-1:-1;;;56373:71:0;;;;;;;:::i;:::-;56484:12;;56463:13;;:17;;56479:1;56463:17;:::i;:::-;:33;;56455:70;;;;-1:-1:-1;;;56455:70:0;;;;;;;:::i;:::-;56556:7;:5;:7::i;:::-;-1:-1:-1;;;;;56542:21:0;:10;-1:-1:-1;;;;;56542:21:0;;56538:106;;56601:5;56588:9;:18;56580:52;;;;-1:-1:-1;;;56580:52:0;;;;;;;:::i;:::-;56656:51;;-1:-1:-1;;;56656:51:0;;-1:-1:-1;;;;;56656:17:0;;;;;:51;;56674:10;;56694:4;;56701:5;;56656:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;56718:33:0;56728:10;56740;:6;56749:1;56740:10;:::i;56718:33::-;56762:13;:15;;;:13;:15;;;:::i;:::-;;;;;;56054:733;;;;;:::o;58597:98::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58666:12:::1;:21:::0;58597:98::o;58703:::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58772:12:::1;:21:::0;58703:98::o;57848:104::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;57923:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;57848:104:::0;:::o;51321:35::-;;;;:::o;52553:413::-;52591:14;52608:13;:11;:13::i;:::-;52641:6;;52591:30;;-1:-1:-1;52641:6:0;;52640:7;52632:43;;;;-1:-1:-1;;;52632:43:0;;;;;;;:::i;:::-;52726:10;52708:29;;;;:17;:29;;;;;;52740:1;-1:-1:-1;52686:111:0;;;;-1:-1:-1;;;52686:111:0;;;;;;;:::i;:::-;52830:16;;52816:10;:6;52825:1;52816:10;:::i;:::-;:30;;52808:62;;;;-1:-1:-1;;;52808:62:0;;;;;;;:::i;:::-;52899:10;52881:29;;;;:17;:29;;;;;52913:1;52881:33;;;;52925;;52899:10;52947;;:6;;:10;:::i;52925:33::-;52553:413;:::o;51840:25::-;;;;;;:::o;51681:32::-;;;;:::o;51276:38::-;;;;:::o;30092:352::-;30219:7;30264:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30264:16:0;30317:19;30293:116;;;;-1:-1:-1;;;30293:116:0;;;;;;;:::i;52206:191::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;52331:47:::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;52331:47:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;52298:13:::1;:91:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52298:91:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;52298:91:0::1;::::0;;;::::1;;::::0;;;;;;;;;52206:191::o;58288:95::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58352:14:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;58352:23:0;;::::1;::::0;;;::::1;::::0;;58288:95::o;51169:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29701:319::-;29828:7;-1:-1:-1;;;;;29881:19:0;;29857:117;;;;-1:-1:-1;;;29857:117:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29994:16:0;;;;;:9;:16;;;;;;;29701:319::o;5597:103::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;5662:30:::1;5689:1;5662:18;:30::i;51913:35::-:0;;;;;;;;;:::o;57718:122::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;57799:13:::1;:33:::0;57718:122::o;53865:283::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;53918:14:::1;53935:13;:11;:13::i;:::-;53968:15;::::0;53918:30;;-1:-1:-1;53968:15:0;;::::1;;;53967:16;53959:44;;;;-1:-1:-1::0;;;53959:44:0::1;;;;;;;:::i;:::-;54031:1;54014:94;54039:2;54034:1;:7;54014:94;;54063:33;54073:10;54085;54094:1:::0;54085:6;:10:::1;:::i;54063:33::-;54043:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54014:94;;;-1:-1:-1::0;;54118:15:0::1;:22:::0;;-1:-1:-1;;54118:22:0::1;::::0;::::1;::::0;;53865:283::o;4946:87::-;5019:6;;-1:-1:-1;;;;;5019:6:0;4946:87;:::o;51800:33::-;;;;:::o;30704:108::-;30760:13;30795:7;30788:14;;;;;:::i;51564:32::-;;;;:::o;52974:883::-;53035:14;53052:13;:11;:13::i;:::-;53085:6;;53035:30;;-1:-1:-1;53085:6:0;;53084:7;53076:16;;;;;;53125:1;53111:11;:15;53103:24;;;;;;53161:13;;53146:11;:28;;53138:61;;;;-1:-1:-1;;;53138:61:0;;;;;;;:::i;:::-;53233:12;;53218:11;:27;;53210:63;;;;-1:-1:-1;;;53210:63:0;;;;;;;:::i;:::-;53330:16;;53306:20;53315:11;53306:6;:20;:::i;:::-;:40;;53284:128;;;;-1:-1:-1;;;53284:128:0;;;;;;;:::i;:::-;53484:12;;53469:11;53445:21;53455:10;53445:9;:21::i;:::-;:35;;;;:::i;:::-;:51;;53423:124;;;;-1:-1:-1;;;53423:124:0;;;;;;;:::i;:::-;53578:7;:5;:7::i;:::-;-1:-1:-1;;;;;53564:21:0;:10;-1:-1:-1;;;;;53564:21:0;;53560:175;;53648:11;53641:4;;:18;;;;:::i;:::-;53628:9;:31;53602:121;;;;-1:-1:-1;;;53602:121:0;;;;;;;:::i;:::-;53764:1;53747:103;53772:11;53767:1;:16;53747:103;;53805:33;53815:10;53827;53836:1;53827:6;:10;:::i;53805:33::-;53785:3;;;;:::i;:::-;;;;53747:103;;32750:345;32907:12;:10;:12::i;:::-;-1:-1:-1;;;;;32895:24:0;:8;-1:-1:-1;;;;;32895:24:0;;;32887:62;;;;-1:-1:-1;;;32887:62:0;;;;;;;:::i;:::-;33011:8;32966:18;:32;32985:12;:10;:12::i;:::-;-1:-1:-1;;;;;32966:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;32966:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;32966:53:0;;;;;;;;;;;33052:12;:10;:12::i;:::-;-1:-1:-1;;;;;33037:48:0;;33076:8;33037:48;;;;;;:::i;:::-;;;;;;;;32750:345;;:::o;51363:36::-;;;;:::o;58391:95::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58455:14:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;58455:23:0;;::::1;::::0;;;::::1;::::0;;58391:95::o;51760:33::-;;;;:::o;51872:34::-;;;;;;;;;:::o;34242:387::-;34445:41;34464:12;:10;:12::i;:::-;34478:7;34445:18;:41::i;:::-;34421:146;;;;-1:-1:-1;;;34421:146:0;;;;;;;:::i;:::-;34580:39;34594:4;34600:2;34604:7;34613:5;34580:13;:39::i;:::-;34242:387;;;;:::o;54570:733::-;54631:24;54658:13;54672:4;54658:19;;;;;;-1:-1:-1;;;54658:19:0;;;;;;;;;;;;;;;;;;;;;54717:11;;54771:12;;54658:19;;-1:-1:-1;;;;;;54717:11:0;;54811:13;:11;:13::i;:::-;54843:14;;54794:30;;-1:-1:-1;54843:14:0;;;;;54835:43;;;;-1:-1:-1;;;54835:43:0;;;;;;;:::i;:::-;54911:14;;54897:10;:6;54906:1;54897:10;:::i;:::-;:28;;54889:71;;;;-1:-1:-1;;;54889:71:0;;;;;;;:::i;:::-;55000:12;;54979:13;;:17;;54995:1;54979:17;:::i;:::-;:33;;54971:70;;;;-1:-1:-1;;;54971:70:0;;;;;;;:::i;:::-;55072:7;:5;:7::i;:::-;-1:-1:-1;;;;;55058:21:0;:10;-1:-1:-1;;;;;55058:21:0;;55054:106;;55117:5;55104:9;:18;55096:52;;;;-1:-1:-1;;;55096:52:0;;;;;;;:::i;:::-;55172:51;;-1:-1:-1;;;55172:51:0;;-1:-1:-1;;;;;55172:17:0;;;;;:51;;55190:10;;55210:4;;55217:5;;55172:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55234:33:0;55244:10;55256;:6;55265:1;55256:10;:::i;55234:33::-;55278:13;:15;;;:13;:15;;;:::i;51197:32::-;;;;;;;:::i;57166:525::-;57239:13;57272:16;57280:7;57272;:16::i;:::-;57264:49;;;;-1:-1:-1;;;57264:49:0;;;;;;;:::i;:::-;57324:28;57355:10;:8;:10::i;:::-;57324:41;;57427:1;57402:14;57396:28;:32;:287;;;;;;;;;;;;;;;;;57520:14;57561:18;:7;:16;:18::i;:::-;57606:13;57477:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57396:287;57376:307;57166:525;-1:-1:-1;;;57166:525:0:o;51642:32::-;;;;:::o;59044:260::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;59096:24:::1;59123:13;59137:1;59123:16;;;;;;-1:-1:-1::0;;;59123:16:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;59179:11:::0;;59215:37:::1;::::0;-1:-1:-1;;;59215:37:0;;59123:16;;-1:-1:-1;;;;;;59179:11:0::1;::::0;59123:16;59179:11;;59215:22:::1;::::0;:37:::1;::::0;59246:4:::1;::::0;59215:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59263:33;::::0;-1:-1:-1;;;59263:33:0;;59201:51;;-1:-1:-1;;;;;;59263:13:0;::::1;::::0;::::1;::::0;:33:::1;::::0;59277:10:::1;::::0;59201:51;;59263:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57960:128::-:0;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58047:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;58809:98::-:0;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58878:12:::1;:21:::0;58809:98::o;33176:230::-;-1:-1:-1;;;;;33361:25:0;;;33328:4;33361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33176:230::o;51524:33::-;;;;:::o;51445:32::-;;;;:::o;58183:97::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;58248:15:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;58248:24:0;;::::1;::::0;;;::::1;::::0;;58183:97::o;5855:201::-;5177:12;:10;:12::i;:::-;-1:-1:-1;;;;;5166:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5166:23:0;;5158:68;;;;-1:-1:-1;;;5158:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5944:22:0;::::1;5936:73;;;;-1:-1:-1::0;;;5936:73:0::1;;;;;;;:::i;:::-;6020:28;6039:8;6020:18;:28::i;55311:731::-:0;55372:24;55399:13;55413:4;55399:19;;;;;;-1:-1:-1;;;55399:19:0;;;;;;;;;;;;;;;;;;;;;55458:11;;55512:12;;55399:19;;-1:-1:-1;;;;;;55458:11:0;;55552:13;:11;:13::i;:::-;55584:14;;55535:30;;-1:-1:-1;55584:14:0;;;;;55576:43;;;;-1:-1:-1;;;55576:43:0;;;;;;;:::i;:::-;55652:14;;55638:10;:6;55647:1;55638:10;:::i;:::-;:28;;55630:71;;;;-1:-1:-1;;;55630:71:0;;;;;;;:::i;:::-;55741:12;;55720:13;;:17;;55736:1;55720:17;:::i;:::-;:33;;55712:70;;;;-1:-1:-1;;;55712:70:0;;;;;;;:::i;:::-;55813:7;:5;:7::i;:::-;-1:-1:-1;;;;;55799:21:0;:10;-1:-1:-1;;;;;55799:21:0;;55795:106;;55858:5;55845:9;:18;55837:52;;;;-1:-1:-1;;;55837:52:0;;;;;;;:::i;:::-;55913:51;;-1:-1:-1;;;55913:51:0;;-1:-1:-1;;;;;55913:17:0;;;;;:51;;55931:10;;55951:4;;55958:5;;55913:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;55975:33:0;55985:10;55997;:6;56006:1;55997:10;:::i;55975:33::-;56019:13;:15;;;:13;:15;;;:::i;29250:377::-;29407:4;-1:-1:-1;;;;;;29455:40:0;;-1:-1:-1;;;29455:40:0;;:107;;-1:-1:-1;;;;;;;29514:48:0;;-1:-1:-1;;;29514:48:0;29455:107;:162;;;;29581:36;29605:11;29581:23;:36::i;3670:98::-;3750:10;3670:98;:::o;36258:131::-;36323:4;36349:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36349:16:0;:30;;;36258:131::o;40669:180::-;40746:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40746:29:0;-1:-1:-1;;;;;40746:29:0;;;;;;;;:24;;40802:23;40746:24;40802:14;:23::i;:::-;-1:-1:-1;;;;;40793:46:0;;;;;;;;;;;40669:180;;:::o;36574:480::-;36711:4;36761:16;36769:7;36761;:16::i;:::-;36737:116;;;;-1:-1:-1;;;36737:116:0;;;;;;;:::i;:::-;36866:13;36882:23;36897:7;36882:14;:23::i;:::-;36866:39;;36937:5;-1:-1:-1;;;;;36926:16:0;:7;-1:-1:-1;;;;;36926:16:0;;:66;;;;36985:7;-1:-1:-1;;;;;36961:31:0;:20;36973:7;36961:11;:20::i;:::-;-1:-1:-1;;;;;36961:31:0;;36926:66;:117;;;;37011:32;37028:5;37035:7;37011:16;:32::i;:::-;36918:126;36574:480;-1:-1:-1;;;;36574:480:0:o;39880:657::-;40065:4;-1:-1:-1;;;;;40038:31:0;:23;40053:7;40038:14;:23::i;:::-;-1:-1:-1;;;;;40038:31:0;;40014:128;;;;-1:-1:-1;;;40014:128:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40163:16:0;;40155:65;;;;-1:-1:-1;;;40155:65:0;;;;;;;:::i;:::-;40237:39;40258:4;40264:2;40268:7;40237:20;:39::i;:::-;40347:29;40364:1;40368:7;40347:8;:29::i;:::-;-1:-1:-1;;;;;40393:15:0;;;;;;:9;:15;;;;;:20;;40412:1;;40393:15;:20;;40412:1;;40393:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40426:13:0;;;;;;:9;:13;;;;;:18;;40443:1;;40426:13;:18;;40443:1;;40426:18;:::i;:::-;;;;-1:-1:-1;;40457:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40457:21:0;-1:-1:-1;;;;;40457:21:0;;;;;;;;;40500:27;;40457:16;;40500:27;;;;;;;39880:657;;;:::o;37420:114::-;37498:26;37508:2;37512:7;37498:26;;;;;;;;;;;;:9;:26::i;6216:191::-;6309:6;;;-1:-1:-1;;;;;6326:17:0;;;-1:-1:-1;;;;;;6326:17:0;;;;;;;6359:40;;6309:6;;;6326:17;6309:6;;6359:40;;6290:16;;6359:40;6216:191;;:::o;35551:374::-;35720:28;35730:4;35736:2;35740:7;35720:9;:28::i;:::-;35785:48;35808:4;35814:2;35818:7;35827:5;35785:22;:48::i;:::-;35761:154;;;;-1:-1:-1;;;35761:154:0;;;;;;;:::i;52422:108::-;52482:13;52515:7;52508:14;;;;;:::i;15090:763::-;15146:13;15375:10;15371:57;;-1:-1:-1;15404:10:0;;;;;;;;;;;;-1:-1:-1;;;15404:10:0;;;;;;15371:57;15455:5;15440:12;15500:84;15507:9;;15500:84;;15535:8;;;;:::i;:::-;;-1:-1:-1;15560:10:0;;-1:-1:-1;15568:2:0;15560:10;;:::i;:::-;;;15500:84;;;15596:19;15628:6;15618:17;;;;;;-1:-1:-1;;;15618:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15618:17:0;;15596:39;;15648:162;15655:10;;15648:162;;15684:11;15694:1;15684:11;;:::i;:::-;;-1:-1:-1;15755:10:0;15763:2;15755:5;:10;:::i;:::-;15742:24;;:2;:24;:::i;:::-;15729:39;;15712:6;15719;15712:14;;;;;;-1:-1:-1;;;15712:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;15712:56:0;;;;;;;;-1:-1:-1;15785:11:0;15794:2;15785:11;;:::i;:::-;;;15648:162;;14521:223;-1:-1:-1;;;;;;14694:40:0;;-1:-1:-1;;;14694:40:0;14521:223;;;:::o;46263:623::-;46417:45;46444:4;46450:2;46454:7;46417:26;:45::i;:::-;-1:-1:-1;;;;;46483:18:0;;46479:195;;46520:40;46552:7;46520:31;:40::i;:::-;46479:195;;;46592:2;-1:-1:-1;;;;;46584:10:0;:4;-1:-1:-1;;;;;46584:10:0;;46580:94;;46613:47;46646:4;46652:7;46613:32;:47::i;:::-;-1:-1:-1;;;;;46690:16:0;;46686:191;;46725:45;46762:7;46725:36;:45::i;:::-;46686:191;;;46800:4;-1:-1:-1;;;;;46794:10:0;:2;-1:-1:-1;;;;;46794:10:0;;46790:87;;46823:40;46851:2;46855:7;46823:27;:40::i;37773:341::-;37913:18;37919:2;37923:7;37913:5;:18::i;:::-;37968:54;37999:1;38003:2;38007:7;38016:5;37968:22;:54::i;:::-;37944:160;;;;-1:-1:-1;;;37944:160:0;;;;;;;:::i;41438:1040::-;41603:4;41626:15;:2;-1:-1:-1;;;;;41626:13:0;;:15::i;:::-;41622:847;;;41699:2;-1:-1:-1;;;;;41683:36:0;;41744:12;:10;:12::i;:::-;41781:4;41810:7;41842:5;41683:185;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41683:185:0;;;;;;;;-1:-1:-1;;41683:185:0;;;;;;;;;;;;:::i;:::-;;;41660:748;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42059:13:0;;42055:336;;42104:112;;-1:-1:-1;;;42104:112:0;;;;;;;:::i;42055:336::-;42337:6;42331:13;42322:6;42318:2;42314:15;42307:38;41660:748;-1:-1:-1;;;;;;41936:51:0;-1:-1:-1;;;41936:51:0;;-1:-1:-1;41929:58:0;;41622:847;-1:-1:-1;42451:4:0;41438:1040;;;;;;:::o;47643:170::-;47749:10;:17;;47722:24;;;;:15;:24;;;;;:44;;;47779:24;;;;;;;;;;;;47643:170::o;48460:1042::-;48752:22;48802:1;48777:22;48794:4;48777:16;:22::i;:::-;:26;;;;:::i;:::-;48816:18;48837:26;;;:17;:26;;;;;;48752:51;;-1:-1:-1;48976:28:0;;;48972:338;;-1:-1:-1;;;;;49045:18:0;;49023:19;49045:18;;;:12;:18;;;;;;;;:34;;;;;;;;;49100:30;;;;;;:44;;;49219:30;;:17;:30;;;;;:43;;;48972:338;-1:-1:-1;49412:26:0;;;;:17;:26;;;;;;;;49405:33;;;-1:-1:-1;;;;;49458:18:0;;;;;:12;:18;;;;;:34;;;;;;;49451:41;48460:1042::o;49811:1115::-;50097:10;:17;50072:22;;50097:21;;50117:1;;50097:21;:::i;:::-;50131:18;50152:24;;;:15;:24;;;;;;50535:10;:26;;50072:46;;-1:-1:-1;50152:24:0;;50072:46;;50535:26;;;;-1:-1:-1;;;50535:26:0;;;;;;;;;;;;;;;;;50513:48;;50603:11;50578:10;50589;50578:22;;;;;;-1:-1:-1;;;50578:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;50685:28;;;:15;:28;;;;;;;:41;;;50863:24;;;;;50856:31;50900:10;:16;;;;;-1:-1:-1;;;50900:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;49811:1115;;;;:::o;47201:229::-;47288:14;47305:20;47322:2;47305:16;:20::i;:::-;-1:-1:-1;;;;;47338:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47385:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;47201:229:0:o;38478:402::-;-1:-1:-1;;;;;38560:16:0;;38552:61;;;;-1:-1:-1;;;38552:61:0;;;;;;;:::i;:::-;38635:16;38643:7;38635;:16::i;:::-;38634:17;38626:58;;;;-1:-1:-1;;;38626:58:0;;;;;;;:::i;:::-;38701:45;38730:1;38734:2;38738:7;38701:20;:45::i;:::-;-1:-1:-1;;;;;38763:13:0;;;;;;:9;:13;;;;;:18;;38780:1;;38763:13;:18;;38780:1;;38763:18;:::i;:::-;;;;-1:-1:-1;;38794:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38794:21:0;-1:-1:-1;;;;;38794:21:0;;;;;;;;38837:33;;38794:16;;;38837:33;;38794:16;;38837:33;38478:402;;:::o;17809:407::-;18146:20;18198:8;;;17809:407::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:259::-;;738:2;726:9;717:7;713:23;709:32;706:2;;;759:6;751;744:22;706:2;803:9;790:23;822:33;849:5;822:33;:::i;890:402::-;;;1019:2;1007:9;998:7;994:23;990:32;987:2;;;1040:6;1032;1025:22;987:2;1084:9;1071:23;1103:33;1130:5;1103:33;:::i;:::-;1155:5;-1:-1:-1;1212:2:1;1197:18;;1184:32;1225:35;1184:32;1225:35;:::i;:::-;1279:7;1269:17;;;977:315;;;;;:::o;1297:470::-;;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;1464:6;1456;1449:22;1411:2;1508:9;1495:23;1527:33;1554:5;1527:33;:::i;:::-;1579:5;-1:-1:-1;1636:2:1;1621:18;;1608:32;1649:35;1608:32;1649:35;:::i;:::-;1401:366;;1703:7;;-1:-1:-1;;;1757:2:1;1742:18;;;;1729:32;;1401:366::o;1772:830::-;;;;;1944:3;1932:9;1923:7;1919:23;1915:33;1912:2;;;1966:6;1958;1951:22;1912:2;2010:9;1997:23;2029:33;2056:5;2029:33;:::i;:::-;2081:5;-1:-1:-1;2138:2:1;2123:18;;2110:32;2151:35;2110:32;2151:35;:::i;:::-;2205:7;-1:-1:-1;2259:2:1;2244:18;;2231:32;;-1:-1:-1;2314:2:1;2299:18;;2286:32;2341:18;2330:30;;2327:2;;;2378:6;2370;2363:22;2327:2;2406:22;;2459:4;2451:13;;2447:27;-1:-1:-1;2437:2:1;;2493:6;2485;2478:22;2437:2;2521:75;2588:7;2583:2;2570:16;2565:2;2561;2557:11;2521:75;:::i;:::-;2511:85;;;1902:700;;;;;;;:::o;2607:396::-;;;2733:2;2721:9;2712:7;2708:23;2704:32;2701:2;;;2754:6;2746;2739:22;2701:2;2798:9;2785:23;2817:33;2844:5;2817:33;:::i;:::-;2869:5;-1:-1:-1;2926:2:1;2911:18;;2898:32;2939;2898;2939;:::i;3008:327::-;;;3137:2;3125:9;3116:7;3112:23;3108:32;3105:2;;;3158:6;3150;3143:22;3105:2;3202:9;3189:23;3221:33;3248:5;3221:33;:::i;:::-;3273:5;3325:2;3310:18;;;;3297:32;;-1:-1:-1;;;3095:240:1:o;3340:253::-;;3449:2;3437:9;3428:7;3424:23;3420:32;3417:2;;;3470:6;3462;3455:22;3417:2;3514:9;3501:23;3533:30;3557:5;3533:30;:::i;3598:257::-;;3718:2;3706:9;3697:7;3693:23;3689:32;3686:2;;;3739:6;3731;3724:22;3686:2;3776:9;3770:16;3795:30;3819:5;3795:30;:::i;3860:257::-;;3971:2;3959:9;3950:7;3946:23;3942:32;3939:2;;;3992:6;3984;3977:22;3939:2;4036:9;4023:23;4055:32;4081:5;4055:32;:::i;4122:261::-;;4244:2;4232:9;4223:7;4219:23;4215:32;4212:2;;;4265:6;4257;4250:22;4212:2;4302:9;4296:16;4321:32;4347:5;4321:32;:::i;4733:482::-;;4855:2;4843:9;4834:7;4830:23;4826:32;4823:2;;;4876:6;4868;4861:22;4823:2;4921:9;4908:23;4954:18;4946:6;4943:30;4940:2;;;4991:6;4983;4976:22;4940:2;5019:22;;5072:4;5064:13;;5060:27;-1:-1:-1;5050:2:1;;5106:6;5098;5091:22;5050:2;5134:75;5201:7;5196:2;5183:16;5178:2;5174;5170:11;5134:75;:::i;5220:190::-;;5332:2;5320:9;5311:7;5307:23;5303:32;5300:2;;;5353:6;5345;5338:22;5300:2;-1:-1:-1;5381:23:1;;5290:120;-1:-1:-1;5290:120:1:o;5415:194::-;;5538:2;5526:9;5517:7;5513:23;5509:32;5506:2;;;5559:6;5551;5544:22;5506:2;-1:-1:-1;5587:16:1;;5496:113;-1:-1:-1;5496:113:1:o;5614:259::-;;5695:5;5689:12;5722:6;5717:3;5710:19;5738:63;5794:6;5787:4;5782:3;5778:14;5771:4;5764:5;5760:16;5738:63;:::i;:::-;5855:2;5834:15;-1:-1:-1;;5830:29:1;5821:39;;;;5862:4;5817:50;;5665:208;-1:-1:-1;;5665:208:1:o;5878:1532::-;;6140:6;6134:13;6166:4;6179:51;6223:6;6218:3;6213:2;6205:6;6201:15;6179:51;:::i;:::-;6293:13;;6252:16;;;;6315:55;6293:13;6252:16;6337:15;;;6315:55;:::i;:::-;6461:13;;6392:20;;;6432:3;;6538:1;6523:17;;6559:1;6595:18;;;;6622:2;;6700:4;6690:8;6686:19;6674:31;;6622:2;6763;6753:8;6750:16;6730:18;6727:40;6724:2;;;-1:-1:-1;;;6790:33:1;;6846:4;6843:1;6836:15;6876:4;6797:3;6864:17;6724:2;6907:18;6934:110;;;;7058:1;7053:332;;;;6900:485;;6934:110;-1:-1:-1;;6969:24:1;;6955:39;;7014:20;;;;-1:-1:-1;6934:110:1;;7053:332;7089:39;7121:6;7089:39;:::i;:::-;7150:3;7166:169;7180:8;7177:1;7174:15;7166:169;;;7262:14;;7247:13;;;7240:37;7305:16;;;;7197:10;;7166:169;;;7170:3;;7366:8;7359:5;7355:20;7348:27;;6900:485;-1:-1:-1;7401:3:1;;6110:1300;-1:-1:-1;;;;;;;;;;;6110:1300:1:o;7415:203::-;-1:-1:-1;;;;;7579:32:1;;;;7561:51;;7549:2;7534:18;;7516:102::o;7623:375::-;-1:-1:-1;;;;;7881:15:1;;;7863:34;;7933:15;;;;7928:2;7913:18;;7906:43;7980:2;7965:18;;7958:34;;;;7813:2;7798:18;;7780:218::o;8003:490::-;-1:-1:-1;;;;;8272:15:1;;;8254:34;;8324:15;;8319:2;8304:18;;8297:43;8371:2;8356:18;;8349:34;;;8419:3;8414:2;8399:18;;8392:31;;;8003:490;;8440:47;;8467:19;;8459:6;8440:47;:::i;:::-;8432:55;8206:287;-1:-1:-1;;;;;;8206:287:1:o;8498:274::-;-1:-1:-1;;;;;8690:32:1;;;;8672:51;;8754:2;8739:18;;8732:34;8660:2;8645:18;;8627:145::o;8777:635::-;8948:2;9000:21;;;9070:13;;8973:18;;;9092:22;;;8777:635;;8948:2;9171:15;;;;9145:2;9130:18;;;8777:635;9217:169;9231:6;9228:1;9225:13;9217:169;;;9292:13;;9280:26;;9361:15;;;;9326:12;;;;9253:1;9246:9;9217:169;;;-1:-1:-1;9403:3:1;;8928:484;-1:-1:-1;;;;;;8928:484:1:o;9417:187::-;9582:14;;9575:22;9557:41;;9545:2;9530:18;;9512:92::o;9901:221::-;;10050:2;10039:9;10032:21;10070:46;10112:2;10101:9;10097:18;10089:6;10070:46;:::i;10127:348::-;10329:2;10311:21;;;10368:2;10348:18;;;10341:30;10407:26;10402:2;10387:18;;10380:54;10466:2;10451:18;;10301:174::o;10480:407::-;10682:2;10664:21;;;10721:2;10701:18;;;10694:30;10760:34;10755:2;10740:18;;10733:62;-1:-1:-1;;;10826:2:1;10811:18;;10804:41;10877:3;10862:19;;10654:233::o;10892:414::-;11094:2;11076:21;;;11133:2;11113:18;;;11106:30;11172:34;11167:2;11152:18;;11145:62;-1:-1:-1;;;11238:2:1;11223:18;;11216:48;11296:3;11281:19;;11066:240::o;11311:402::-;11513:2;11495:21;;;11552:2;11532:18;;;11525:30;11591:34;11586:2;11571:18;;11564:62;-1:-1:-1;;;11657:2:1;11642:18;;11635:36;11703:3;11688:19;;11485:228::o;11718:352::-;11920:2;11902:21;;;11959:2;11939:18;;;11932:30;11998;11993:2;11978:18;;11971:58;12061:2;12046:18;;11892:178::o;12075:352::-;12277:2;12259:21;;;12316:2;12296:18;;;12289:30;12355;12350:2;12335:18;;12328:58;12418:2;12403:18;;12249:178::o;12432:352::-;12634:2;12616:21;;;12673:2;12653:18;;;12646:30;12712;12707:2;12692:18;;12685:58;12775:2;12760:18;;12606:178::o;12789:400::-;12991:2;12973:21;;;13030:2;13010:18;;;13003:30;13069:34;13064:2;13049:18;;13042:62;-1:-1:-1;;;13135:2:1;13120:18;;13113:34;13179:3;13164:19;;12963:226::o;13194:349::-;13396:2;13378:21;;;13435:2;13415:18;;;13408:30;13474:27;13469:2;13454:18;;13447:55;13534:2;13519:18;;13368:175::o;13548:339::-;13750:2;13732:21;;;13789:2;13769:18;;;13762:30;-1:-1:-1;;;13823:2:1;13808:18;;13801:45;13878:2;13863:18;;13722:165::o;13892:408::-;14094:2;14076:21;;;14133:2;14113:18;;;14106:30;14172:34;14167:2;14152:18;;14145:62;-1:-1:-1;;;14238:2:1;14223:18;;14216:42;14290:3;14275:19;;14066:234::o;14305:420::-;14507:2;14489:21;;;14546:2;14526:18;;;14519:30;14585:34;14580:2;14565:18;;14558:62;14656:26;14651:2;14636:18;;14629:54;14715:3;14700:19;;14479:246::o;14730:406::-;14932:2;14914:21;;;14971:2;14951:18;;;14944:30;15010:34;15005:2;14990:18;;14983:62;-1:-1:-1;;;15076:2:1;15061:18;;15054:40;15126:3;15111:19;;14904:232::o;15141:405::-;15343:2;15325:21;;;15382:2;15362:18;;;15355:30;15421:34;15416:2;15401:18;;15394:62;-1:-1:-1;;;15487:2:1;15472:18;;15465:39;15536:3;15521:19;;15315:231::o;15551:345::-;15753:2;15735:21;;;15792:2;15772:18;;;15765:30;-1:-1:-1;;;15826:2:1;15811:18;;15804:51;15887:2;15872:18;;15725:171::o;15901:348::-;16103:2;16085:21;;;16142:2;16122:18;;;16115:30;16181:26;16176:2;16161:18;;16154:54;16240:2;16225:18;;16075:174::o;16254:356::-;16456:2;16438:21;;;16475:18;;;16468:30;16534:34;16529:2;16514:18;;16507:62;16601:2;16586:18;;16428:182::o;16615:344::-;16817:2;16799:21;;;16856:2;16836:18;;;16829:30;-1:-1:-1;;;16890:2:1;16875:18;;16868:50;16950:2;16935:18;;16789:170::o;16964:408::-;17166:2;17148:21;;;17205:2;17185:18;;;17178:30;17244:34;17239:2;17224:18;;17217:62;-1:-1:-1;;;17310:2:1;17295:18;;17288:42;17362:3;17347:19;;17138:234::o;17377:347::-;17579:2;17561:21;;;17618:2;17598:18;;;17591:30;17657:25;17652:2;17637:18;;17630:53;17715:2;17700:18;;17551:173::o;17729:402::-;17931:2;17913:21;;;17970:2;17950:18;;;17943:30;18009:34;18004:2;17989:18;;17982:62;-1:-1:-1;;;18075:2:1;18060:18;;18053:36;18121:3;18106:19;;17903:228::o;18136:356::-;18338:2;18320:21;;;18357:18;;;18350:30;18416:34;18411:2;18396:18;;18389:62;18483:2;18468:18;;18310:182::o;18497:405::-;18699:2;18681:21;;;18738:2;18718:18;;;18711:30;18777:34;18772:2;18757:18;;18750:62;-1:-1:-1;;;18843:2:1;18828:18;;18821:39;18892:3;18877:19;;18671:231::o;18907:348::-;19109:2;19091:21;;;19148:2;19128:18;;;19121:30;19187:26;19182:2;19167:18;;19160:54;19246:2;19231:18;;19081:174::o;19260:354::-;19462:2;19444:21;;;19501:2;19481:18;;;19474:30;19540:32;19535:2;19520:18;;19513:60;19605:2;19590:18;;19434:180::o;19619:347::-;19821:2;19803:21;;;19860:2;19840:18;;;19833:30;19899:25;19894:2;19879:18;;19872:53;19957:2;19942:18;;19793:173::o;19971:352::-;20173:2;20155:21;;;20212:2;20192:18;;;20185:30;20251;20246:2;20231:18;;20224:58;20314:2;20299:18;;20145:178::o;20328:343::-;20530:2;20512:21;;;20569:2;20549:18;;;20542:30;-1:-1:-1;;;20603:2:1;20588:18;;20581:49;20662:2;20647:18;;20502:169::o;20676:397::-;20878:2;20860:21;;;20917:2;20897:18;;;20890:30;20956:34;20951:2;20936:18;;20929:62;-1:-1:-1;;;21022:2:1;21007:18;;21000:31;21063:3;21048:19;;20850:223::o;21078:344::-;21280:2;21262:21;;;21319:2;21299:18;;;21292:30;-1:-1:-1;;;21353:2:1;21338:18;;21331:50;21413:2;21398:18;;21252:170::o;21427:340::-;21629:2;21611:21;;;21668:2;21648:18;;;21641:30;-1:-1:-1;;;21702:2:1;21687:18;;21680:46;21758:2;21743:18;;21601:166::o;21772:413::-;21974:2;21956:21;;;22013:2;21993:18;;;21986:30;22052:34;22047:2;22032:18;;22025:62;-1:-1:-1;;;22118:2:1;22103:18;;22096:47;22175:3;22160:19;;21946:239::o;22190:408::-;22392:2;22374:21;;;22431:2;22411:18;;;22404:30;22470:34;22465:2;22450:18;;22443:62;-1:-1:-1;;;22536:2:1;22521:18;;22514:42;22588:3;22573:19;;22364:234::o;22603:346::-;22805:2;22787:21;;;22844:2;22824:18;;;22817:30;-1:-1:-1;;;22878:2:1;22863:18;;22856:52;22940:2;22925:18;;22777:172::o;22954:177::-;23100:25;;;23088:2;23073:18;;23055:76::o;23136:129::-;;23204:17;;;23254:4;23238:21;;;23194:71::o;23270:128::-;;23341:1;23337:6;23334:1;23331:13;23328:2;;;23347:18;;:::i;:::-;-1:-1:-1;23383:9:1;;23318:80::o;23403:120::-;;23469:1;23459:2;;23474:18;;:::i;:::-;-1:-1:-1;23508:9:1;;23449:74::o;23528:168::-;;23634:1;23630;23626:6;23622:14;23619:1;23616:21;23611:1;23604:9;23597:17;23593:45;23590:2;;;23641:18;;:::i;:::-;-1:-1:-1;23681:9:1;;23580:116::o;23701:125::-;;23769:1;23766;23763:8;23760:2;;;23774:18;;:::i;:::-;-1:-1:-1;23811:9:1;;23750:76::o;23831:258::-;23903:1;23913:113;23927:6;23924:1;23921:13;23913:113;;;24003:11;;;23997:18;23984:11;;;23977:39;23949:2;23942:10;23913:113;;;24044:6;24041:1;24038:13;24035:2;;;-1:-1:-1;;24079:1:1;24061:16;;24054:27;23884:205::o;24094:380::-;24179:1;24169:12;;24226:1;24216:12;;;24237:2;;24291:4;24283:6;24279:17;24269:27;;24237:2;24344;24336:6;24333:14;24313:18;24310:38;24307:2;;;24390:10;24385:3;24381:20;24378:1;24371:31;24425:4;24422:1;24415:15;24453:4;24450:1;24443:15;24307:2;;24149:325;;;:::o;24479:135::-;;-1:-1:-1;;24539:17:1;;24536:2;;;24559:18;;:::i;:::-;-1:-1:-1;24606:1:1;24595:13;;24526:88::o;24619:112::-;;24677:1;24667:2;;24682:18;;:::i;:::-;-1:-1:-1;24716:9:1;;24657:74::o;24736:127::-;24797:10;24792:3;24788:20;24785:1;24778:31;24828:4;24825:1;24818:15;24852:4;24849:1;24842:15;24868:127;24929:10;24924:3;24920:20;24917:1;24910:31;24960:4;24957:1;24950:15;24984:4;24981:1;24974:15;25000:127;25061:10;25056:3;25052:20;25049:1;25042:31;25092:4;25089:1;25082:15;25116:4;25113:1;25106:15;25132:133;-1:-1:-1;;;;;25209:31:1;;25199:42;;25189:2;;25255:1;25252;25245:12;25270:120;25358:5;25351:13;25344:21;25337:5;25334:32;25324:2;;25380:1;25377;25370:12;25395:133;-1:-1:-1;;;;;;25471:32:1;;25461:43;;25451:2;;25518:1;25515;25508:12

Swarm Source

ipfs://4add31ddf361dcef8ed24ee66b7f6f3dc457f6f2495aaebbd7554326b6b8f049
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.