ETH Price: $2,536.43 (+0.19%)

Token

ugly.af (UGLY)
 

Overview

Max Total Supply

136 UGLY

Holders

32

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
vegetassj.eth
Balance
1 UGLY
0x938402d50e18c603bbf7cc9ec00482f20452adaf
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UGLYAF

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (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/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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/UGLYAF.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;







contract UGLYAF is Ownable, ERC721A {
    uint256 constant public maxSupply = 10000;
    uint256 public teamMaxMint = 100;
    uint256 public publicPrice = 0.005 ether;
    uint256 public maxFreeMint = 1;
    uint256 constant public limitAmountPerTx = 5;
    uint256 constant public limitAmountPerWallet = 10;

    uint256 public totalTeamSupply;

    string public revealedURI = "ipfs://QmTMVhNxp6EGsGShgEc5aM3CmYrqLjxvBX2T4LNGkVrdRH/";

    bool public paused = true;

    bool public freeSale = true;
    bool public publicSale = true;

    address constant internal uglyAddy = 0xA69a42d4aA01C8df2B4edaDA942C296B79490331;
    address public teamWallet = 0xA69a42d4aA01C8df2B4edaDA942C296B79490331;

    mapping(address => bool) public userMintedFree;
    mapping(address => uint256) public mintedWallets;

    constructor(
    string memory revealedURI
    ) ERC721A("ugly.af", "UGLY") { }

    
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    function teamMint(uint256 quantity) public payable mintCompliance(quantity) {
        require(msg.sender == teamWallet, "Team minting only");
        require(totalTeamSupply + quantity <= teamMaxMint, "No team mints left");

        totalTeamSupply += quantity;

        _safeMint(msg.sender, quantity);
    }
    
    function freeMint(uint256 quantity) external payable mintCompliance(quantity) {
        require(freeSale, "Free sale inactive");
        require(msg.value == 0, "This phase is free");
        require(quantity == 1, "Only 1 free cunt");
        require(mintedWallets[msg.sender] < 1, "you already free minted cunt");
        require(!userMintedFree[msg.sender], "User max free limit");
        require(maxSupply > totalSupply(), "you cant become ugly anymore");

        mintedWallets[msg.sender]++;

        _safeMint(msg.sender, quantity);
    }

    function mintMore(uint256 quantity) external payable mintCompliance(quantity) {
        require(publicSale, "Public sale inactive");
        require(msg.value == quantity * publicPrice, "give me more money");
        require(quantity <= limitAmountPerTx, "max mint 5 per transaction");

        uint256 currMints = mintedWallets[msg.sender];
                
        require(currMints + quantity <= limitAmountPerWallet, "u minted all ugly.af you can");

        mintedWallets[msg.sender] = (currMints + quantity);

        _safeMint(msg.sender, quantity);
    }


    function walletOfOwner(address _owner) public view returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            address currentTokenOwner = ownerOf(currentTokenId);

            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;

                ownedTokenIndex++;
            }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

      string private _baseTokenUri;

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

    function setBaseUri(string memory _baseUri) external onlyOwner {
        _baseTokenUri = _baseUri;
    }


    function contractURI() public view returns (string memory) {
        return revealedURI;
    }


    function setTeamMintMax(uint256 _teamMintMax) public onlyOwner {
        teamMaxMint = _teamMintMax;
    }

    function setPublicPrice(uint256 _publicPrice) public onlyOwner {
        publicPrice = _publicPrice;
    }

    function setBaseURI(string memory _baseUri) public onlyOwner {
        revealedURI = _baseUri;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        revealedURI = _contractURI;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {

        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        return string(abi.encodePacked(revealedURI, Strings.toString(_tokenId), ".json"));
    }

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

    function setPublicEnabled(bool _state) public onlyOwner {
        publicSale = _state;
        freeSale = !_state;
    }
    function setFreeEnabled(bool _state) public onlyOwner {
        freeSale = _state;
        publicSale = !_state;
    }

    function setTeamWalletAddress(address _teamWallet) public onlyOwner {
        teamWallet = _teamWallet;
    }

    function mintToUser(uint256 quantity, address receiver) public onlyOwner mintCompliance(quantity) {
        _safeMint(receiver, quantity);
    }

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

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

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



    modifier mintCompliance(uint256 quantity) {
        require(!paused, "Contract is paused");
        require(totalSupply() + quantity <= maxSupply, "you cant become ugly anymore");
        require(tx.origin == msg.sender, "No contract minting");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"revealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintMore","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWallets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setFreeEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_teamMintMax","type":"uint256"}],"name":"setTeamMintMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamWallet","type":"address"}],"name":"setTeamWalletAddress","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":"teamMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"totalTeamSupply","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":"","type":"address"}],"name":"userMintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"nonpayable","type":"function"}]

608060405260646009556611c37937e08000600a556001600b5560405180606001604052806036815260200162004de660369139600d90805190602001906200004a929190620002d6565b506001600e60006101000a81548160ff0219169083151502179055506001600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff02191690831515021790555073a69a42d4aa01c8df2b4edada942c296b79490331600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000fe57600080fd5b5060405162004e1c38038062004e1c8339818101604052810190620001249190620003f8565b6040518060400160405280600781526020017f75676c792e6166000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f55474c5900000000000000000000000000000000000000000000000000000000815250620001b0620001a46200020160201b60201c565b6200020960201b60201c565b8160039080519060200190620001c8929190620002d6565b508060049080519060200190620001e1929190620002d6565b50620001f2620002cd60201b60201c565b600181905550505050620005ad565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b828054620002e490620004d2565b90600052602060002090601f01602090048101928262000308576000855562000354565b82601f106200032357805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035357825182559160200191906001019062000336565b5b50905062000363919062000367565b5090565b5b808211156200038257600081600090555060010162000368565b5090565b60006200039d620003978462000466565b6200043d565b905082815260208101848484011115620003b657600080fd5b620003c38482856200049c565b509392505050565b600082601f830112620003dd57600080fd5b8151620003ef84826020860162000386565b91505092915050565b6000602082840312156200040b57600080fd5b600082015167ffffffffffffffff8111156200042657600080fd5b6200043484828501620003cb565b91505092915050565b6000620004496200045c565b905062000457828262000508565b919050565b6000604051905090565b600067ffffffffffffffff8211156200048457620004836200056d565b5b6200048f826200059c565b9050602081019050919050565b60005b83811015620004bc5780820151818401526020810190506200049f565b83811115620004cc576000848401525b50505050565b60006002820490506001821680620004eb57607f821691505b602082108114156200050257620005016200053e565b5b50919050565b62000513826200059c565b810181811067ffffffffffffffff821117156200053557620005346200056d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61482980620005bd6000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063a591252d116100c1578063c87b56dd1161007a578063c87b56dd1461097b578063d5abeb01146109b8578063e8a3d485146109e3578063e985e9c514610a0e578063f2fde38b14610a4b578063f7e8d6ea14610a7457610288565b8063a591252d1461086b578063a945bf8014610896578063abc025d1146108c1578063ada7c4ed146108ec578063b88d4fde14610929578063c62752551461095257610288565b80639007bd72116101135780639007bd7214610771578063938e3d7b1461079a57806395d89b41146107c3578063a0bcfc7f146107ee578063a22cb46514610817578063a4b41a151461084057610288565b8063715018a6146106965780637af3a1af146106ad5780637c928fe9146106d657806388dedc14146106f25780638942bbff1461071b5780638da5cb5b1461074657610288565b80632fbba115116101fe57806359927044116101b7578063599270441461056d5780635c975abb146105985780636352211e146105c357806364f64076146106005780636f8aba4c1461063d57806370a082311461065957610288565b80632fbba1151461048057806333bc1c5c1461049c5780633ccfd60b146104c757806342842e0e146104de578063438b63001461050757806355f804b31461054457610288565b806316c38b3c1161025057806316c38b3c14610384578063170594c6146103ad57806318160ddd146103d857806323b872dd1461040357806325db2af11461042c5780632c4b23341461045757610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630f15ad8d1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af919061376a565b610a9f565b6040516102c19190613d64565b60405180910390f35b3480156102d657600080fd5b506102df610b31565b6040516102ec9190613d7f565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906137fd565b610bc3565b6040516103299190613cdb565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613705565b610c3f565b005b34801561036757600080fd5b50610382600480360381019061037d91906137fd565b610de6565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613741565b610e6c565b005b3480156103b957600080fd5b506103c2610f05565b6040516103cf9190613fc1565b60405180910390f35b3480156103e457600080fd5b506103ed610f0b565b6040516103fa9190613fc1565b60405180910390f35b34801561040f57600080fd5b5061042a600480360381019061042591906135ff565b610f22565b005b34801561043857600080fd5b50610441610f32565b60405161044e9190613fc1565b60405180910390f35b34801561046357600080fd5b5061047e6004803603810190610479919061359a565b610f38565b005b61049a600480360381019061049591906137fd565b610ff8565b005b3480156104a857600080fd5b506104b1611217565b6040516104be9190613d64565b60405180910390f35b3480156104d357600080fd5b506104dc61122a565b005b3480156104ea57600080fd5b50610505600480360381019061050091906135ff565b6112ef565b005b34801561051357600080fd5b5061052e6004803603810190610529919061359a565b61130f565b60405161053b9190613d42565b60405180910390f35b34801561055057600080fd5b5061056b600480360381019061056691906137bc565b611466565b005b34801561057957600080fd5b506105826114fc565b60405161058f9190613cdb565b60405180910390f35b3480156105a457600080fd5b506105ad611522565b6040516105ba9190613d64565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e591906137fd565b611535565b6040516105f79190613cdb565b60405180910390f35b34801561060c57600080fd5b506106276004803603810190610622919061359a565b611547565b6040516106349190613d64565b60405180910390f35b610657600480360381019061065291906137fd565b611567565b005b34801561066557600080fd5b50610680600480360381019061067b919061359a565b611850565b60405161068d9190613fc1565b60405180910390f35b3480156106a257600080fd5b506106ab611909565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613741565b611991565b005b6106f060048036038101906106eb91906137fd565b611a45565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613741565b611ded565b005b34801561072757600080fd5b50610730611ea1565b60405161073d9190613fc1565b60405180910390f35b34801561075257600080fd5b5061075b611ea6565b6040516107689190613cdb565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613826565b611ecf565b005b3480156107a657600080fd5b506107c160048036038101906107bc91906137bc565b612070565b005b3480156107cf57600080fd5b506107d8612106565b6040516107e59190613d7f565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906137bc565b612198565b005b34801561082357600080fd5b5061083e600480360381019061083991906136c9565b61222e565b005b34801561084c57600080fd5b506108556123a6565b6040516108629190613d64565b60405180910390f35b34801561087757600080fd5b506108806123b9565b60405161088d9190613fc1565b60405180910390f35b3480156108a257600080fd5b506108ab6123bf565b6040516108b89190613fc1565b60405180910390f35b3480156108cd57600080fd5b506108d66123c5565b6040516108e39190613fc1565b60405180910390f35b3480156108f857600080fd5b50610913600480360381019061090e919061359a565b6123ca565b6040516109209190613fc1565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061364e565b6123e2565b005b34801561095e57600080fd5b50610979600480360381019061097491906137fd565b612455565b005b34801561098757600080fd5b506109a2600480360381019061099d91906137fd565b6124db565b6040516109af9190613d7f565b60405180910390f35b3480156109c457600080fd5b506109cd612557565b6040516109da9190613fc1565b60405180910390f35b3480156109ef57600080fd5b506109f861255d565b604051610a059190613d7f565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a3091906135c3565b6125ef565b604051610a429190613d64565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d919061359a565b612683565b005b348015610a8057600080fd5b50610a8961277b565b604051610a969190613d7f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b40906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c906142bf565b8015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce82612809565b610c04576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4a82612868565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd1612936565b73ffffffffffffffffffffffffffffffffffffffff1614610d3457610cfd81610cf8612936565b6125ef565b610d33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610dee61293e565b73ffffffffffffffffffffffffffffffffffffffff16610e0c611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613e61565b60405180910390fd5b8060098190555050565b610e7461293e565b73ffffffffffffffffffffffffffffffffffffffff16610e92611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613e61565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600c5481565b6000610f15612946565b6002546001540303905090565b610f2d83838361294f565b505050565b60095481565b610f4061293e565b73ffffffffffffffffffffffffffffffffffffffff16610f5e611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90613e61565b60405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600e60009054906101000a900460ff1615611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090613f81565b60405180910390fd5b61271081611055610f0b565b61105f91906140f4565b11156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613e01565b60405180910390fd5b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613de1565b60405180910390fd5b60095482600c546111af91906140f4565b11156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613ec1565b60405180910390fd5b81600c600082825461120291906140f4565b925050819055506112133383612cf9565b5050565b600e60029054906101000a900460ff1681565b61123261293e565b73ffffffffffffffffffffffffffffffffffffffff16611250611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613e61565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112ec573d6000803e3d6000fd5b50565b61130a838383604051806020016040528060008152506123e2565b505050565b6060600061131c83611850565b905060008167ffffffffffffffff811115611360577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561138e5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113ab57506127108211155b1561145a5760006113bb83611535565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611446578284838151811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050818061144290614322565b9250505b828061145190614322565b9350505061139a565b82945050505050919050565b61146e61293e565b73ffffffffffffffffffffffffffffffffffffffff1661148c611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613e61565b60405180910390fd5b80600d90805190602001906114f89291906133be565b5050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b600061154082612868565b9050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b80600e60009054906101000a900460ff16156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f81565b60405180910390fd5b612710816115c4610f0b565b6115ce91906140f4565b111561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490613e01565b60405180910390fd5b600e60029054906101000a900460ff166116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613f01565b60405180910390fd5b600a54826116da919061417b565b341461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613f41565b60405180910390fd5b600582111561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613f61565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a83826117b191906140f4565b11156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990613fa1565b60405180910390fd5b82816117fe91906140f4565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061184b3384612cf9565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61191161293e565b73ffffffffffffffffffffffffffffffffffffffff1661192f611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90613e61565b60405180910390fd5b61198f6000612d17565b565b61199961293e565b73ffffffffffffffffffffffffffffffffffffffff166119b7611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0490613e61565b60405180910390fd5b80600e60026101000a81548160ff0219169083151502179055508015600e60016101000a81548160ff02191690831515021790555050565b80600e60009054906101000a900460ff1615611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613f81565b60405180910390fd5b61271081611aa2610f0b565b611aac91906140f4565b1115611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613e01565b60405180910390fd5b600e60019054906101000a900460ff16611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613e41565b60405180910390fd5b60003414611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613ee1565b60405180910390fd5b60018214611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613f21565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613e21565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613e81565b60405180910390fd5b611d47610f0b565b61271011611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8190613da1565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611dda90614322565b9190505550611de93383612cf9565b5050565b611df561293e565b73ffffffffffffffffffffffffffffffffffffffff16611e13611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613e61565b60405180910390fd5b80600e60016101000a81548160ff0219169083151502179055508015600e60026101000a81548160ff02191690831515021790555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ed761293e565b73ffffffffffffffffffffffffffffffffffffffff16611ef5611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613e61565b60405180910390fd5b81600e60009054906101000a900460ff1615611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390613f81565b60405180910390fd5b61271081611fa8610f0b565b611fb291906140f4565b1115611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890613e01565b60405180910390fd5b61206b8284612cf9565b505050565b61207861293e565b73ffffffffffffffffffffffffffffffffffffffff16612096611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e390613e61565b60405180910390fd5b80600d90805190602001906121029291906133be565b5050565b606060048054612115906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612141906142bf565b801561218e5780601f106121635761010080835404028352916020019161218e565b820191906000526020600020905b81548152906001019060200180831161217157829003601f168201915b5050505050905090565b6121a061293e565b73ffffffffffffffffffffffffffffffffffffffff166121be611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90613e61565b60405180910390fd5b806011908051906020019061222a9291906133be565b5050565b612236612936565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006122a8612936565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612355612936565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161239a9190613d64565b60405180910390a35050565b600e60019054906101000a900460ff1681565b600b5481565b600a5481565b600a81565b60106020528060005260406000206000915090505481565b6123ed84848461294f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461244f5761241884848484612ddb565b61244e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61245d61293e565b73ffffffffffffffffffffffffffffffffffffffff1661247b611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c890613e61565b60405180910390fd5b80600a8190555050565b60606124e682612809565b612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c90613ea1565b60405180910390fd5b600d61253083612f3b565b604051602001612541929190613cac565b6040516020818303038152906040529050919050565b61271081565b6060600d805461256c906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612598906142bf565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61268b61293e565b73ffffffffffffffffffffffffffffffffffffffff166126a9611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146126ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f690613e61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690613dc1565b60405180910390fd5b61277881612d17565b50565b600d8054612788906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546127b4906142bf565b80156128015780601f106127d657610100808354040283529160200191612801565b820191906000526020600020905b8154815290600101906020018083116127e457829003601f168201915b505050505081565b600081612814612946565b11158015612823575060015482105b8015612861575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080612877612946565b116128ff576001548110156128fe5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128fc575b60008114156128f25760056000836001900393508381526020019081526020016000205490506128c7565b8092505050612931565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061295a82612868565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129c1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129e2612936565b73ffffffffffffffffffffffffffffffffffffffff161480612a115750612a1085612a0b612936565b6125ef565b5b80612a565750612a1f612936565b73ffffffffffffffffffffffffffffffffffffffff16612a3e84610bc3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a8f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612af6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0385858560016130e8565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c00866130ee565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612c8a576000600184019050600060056000838152602001908152602001600020541415612c88576001548114612c87578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf285858560016130f8565b5050505050565b612d138282604051806020016040528060008152506130fe565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e01612936565b8786866040518563ffffffff1660e01b8152600401612e239493929190613cf6565b602060405180830381600087803b158015612e3d57600080fd5b505af1925050508015612e6e57506040513d601f19601f82011682018060405250810190612e6b9190613793565b60015b612ee8573d8060008114612e9e576040519150601f19603f3d011682016040523d82523d6000602084013e612ea3565b606091505b50600081511415612ee0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612f83576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e3565b600082905060005b60008214612fb5578080612f9e90614322565b915050600a82612fae919061414a565b9150612f8b565b60008167ffffffffffffffff811115612ff7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130295781602001600182028036833780820191505090505b5090505b600085146130dc5760018261304291906141d5565b9150600a85613051919061436b565b603061305d91906140f4565b60f81b818381518110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130d5919061414a565b945061302d565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156131a7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131b460008583866130e8565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1613219600185146133b4565b901b60a042901b613229866130ee565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461332d575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132dd6000878480600101955087612ddb565b613313576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061326e57826001541461332857600080fd5b613398565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061332e575b8160018190555050506133ae60008583866130f8565b50505050565b6000819050919050565b8280546133ca906142bf565b90600052602060002090601f0160209004810192826133ec5760008555613433565b82601f1061340557805160ff1916838001178555613433565b82800160010185558215613433579182015b82811115613432578251825591602001919060010190613417565b5b5090506134409190613444565b5090565b5b8082111561345d576000816000905550600101613445565b5090565b600061347461346f84614001565b613fdc565b90508281526020810184848401111561348c57600080fd5b61349784828561427d565b509392505050565b60006134b26134ad84614032565b613fdc565b9050828152602081018484840111156134ca57600080fd5b6134d584828561427d565b509392505050565b6000813590506134ec81614797565b92915050565b600081359050613501816147ae565b92915050565b600081359050613516816147c5565b92915050565b60008151905061352b816147c5565b92915050565b600082601f83011261354257600080fd5b8135613552848260208601613461565b91505092915050565b600082601f83011261356c57600080fd5b813561357c84826020860161349f565b91505092915050565b600081359050613594816147dc565b92915050565b6000602082840312156135ac57600080fd5b60006135ba848285016134dd565b91505092915050565b600080604083850312156135d657600080fd5b60006135e4858286016134dd565b92505060206135f5858286016134dd565b9150509250929050565b60008060006060848603121561361457600080fd5b6000613622868287016134dd565b9350506020613633868287016134dd565b925050604061364486828701613585565b9150509250925092565b6000806000806080858703121561366457600080fd5b6000613672878288016134dd565b9450506020613683878288016134dd565b935050604061369487828801613585565b925050606085013567ffffffffffffffff8111156136b157600080fd5b6136bd87828801613531565b91505092959194509250565b600080604083850312156136dc57600080fd5b60006136ea858286016134dd565b92505060206136fb858286016134f2565b9150509250929050565b6000806040838503121561371857600080fd5b6000613726858286016134dd565b925050602061373785828601613585565b9150509250929050565b60006020828403121561375357600080fd5b6000613761848285016134f2565b91505092915050565b60006020828403121561377c57600080fd5b600061378a84828501613507565b91505092915050565b6000602082840312156137a557600080fd5b60006137b38482850161351c565b91505092915050565b6000602082840312156137ce57600080fd5b600082013567ffffffffffffffff8111156137e857600080fd5b6137f48482850161355b565b91505092915050565b60006020828403121561380f57600080fd5b600061381d84828501613585565b91505092915050565b6000806040838503121561383957600080fd5b600061384785828601613585565b9250506020613858858286016134dd565b9150509250929050565b600061386e8383613c8e565b60208301905092915050565b61388381614209565b82525050565b600061389482614088565b61389e81856140b6565b93506138a983614063565b8060005b838110156138da5781516138c18882613862565b97506138cc836140a9565b9250506001810190506138ad565b5085935050505092915050565b6138f08161421b565b82525050565b600061390182614093565b61390b81856140c7565b935061391b81856020860161428c565b61392481614458565b840191505092915050565b600061393a8261409e565b61394481856140d8565b935061395481856020860161428c565b61395d81614458565b840191505092915050565b60006139738261409e565b61397d81856140e9565b935061398d81856020860161428c565b80840191505092915050565b600081546139a6816142bf565b6139b081866140e9565b945060018216600081146139cb57600181146139dc57613a0f565b60ff19831686528186019350613a0f565b6139e585614073565b60005b83811015613a07578154818901526001820191506020810190506139e8565b838801955050505b50505092915050565b6000613a25601c836140d8565b9150613a3082614469565b602082019050919050565b6000613a486026836140d8565b9150613a5382614492565b604082019050919050565b6000613a6b6011836140d8565b9150613a76826144e1565b602082019050919050565b6000613a8e6013836140d8565b9150613a998261450a565b602082019050919050565b6000613ab1601c836140d8565b9150613abc82614533565b602082019050919050565b6000613ad46012836140d8565b9150613adf8261455c565b602082019050919050565b6000613af76005836140e9565b9150613b0282614585565b600582019050919050565b6000613b1a6020836140d8565b9150613b25826145ae565b602082019050919050565b6000613b3d6013836140d8565b9150613b48826145d7565b602082019050919050565b6000613b60602f836140d8565b9150613b6b82614600565b604082019050919050565b6000613b836012836140d8565b9150613b8e8261464f565b602082019050919050565b6000613ba66012836140d8565b9150613bb182614678565b602082019050919050565b6000613bc96014836140d8565b9150613bd4826146a1565b602082019050919050565b6000613bec6010836140d8565b9150613bf7826146ca565b602082019050919050565b6000613c0f6012836140d8565b9150613c1a826146f3565b602082019050919050565b6000613c32601a836140d8565b9150613c3d8261471c565b602082019050919050565b6000613c556012836140d8565b9150613c6082614745565b602082019050919050565b6000613c78601c836140d8565b9150613c838261476e565b602082019050919050565b613c9781614273565b82525050565b613ca681614273565b82525050565b6000613cb88285613999565b9150613cc48284613968565b9150613ccf82613aea565b91508190509392505050565b6000602082019050613cf0600083018461387a565b92915050565b6000608082019050613d0b600083018761387a565b613d18602083018661387a565b613d256040830185613c9d565b8181036060830152613d3781846138f6565b905095945050505050565b60006020820190508181036000830152613d5c8184613889565b905092915050565b6000602082019050613d7960008301846138e7565b92915050565b60006020820190508181036000830152613d99818461392f565b905092915050565b60006020820190508181036000830152613dba81613a18565b9050919050565b60006020820190508181036000830152613dda81613a3b565b9050919050565b60006020820190508181036000830152613dfa81613a5e565b9050919050565b60006020820190508181036000830152613e1a81613a81565b9050919050565b60006020820190508181036000830152613e3a81613aa4565b9050919050565b60006020820190508181036000830152613e5a81613ac7565b9050919050565b60006020820190508181036000830152613e7a81613b0d565b9050919050565b60006020820190508181036000830152613e9a81613b30565b9050919050565b60006020820190508181036000830152613eba81613b53565b9050919050565b60006020820190508181036000830152613eda81613b76565b9050919050565b60006020820190508181036000830152613efa81613b99565b9050919050565b60006020820190508181036000830152613f1a81613bbc565b9050919050565b60006020820190508181036000830152613f3a81613bdf565b9050919050565b60006020820190508181036000830152613f5a81613c02565b9050919050565b60006020820190508181036000830152613f7a81613c25565b9050919050565b60006020820190508181036000830152613f9a81613c48565b9050919050565b60006020820190508181036000830152613fba81613c6b565b9050919050565b6000602082019050613fd66000830184613c9d565b92915050565b6000613fe6613ff7565b9050613ff282826142f1565b919050565b6000604051905090565b600067ffffffffffffffff82111561401c5761401b614429565b5b61402582614458565b9050602081019050919050565b600067ffffffffffffffff82111561404d5761404c614429565b5b61405682614458565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140ff82614273565b915061410a83614273565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413f5761413e61439c565b5b828201905092915050565b600061415582614273565b915061416083614273565b9250826141705761416f6143cb565b5b828204905092915050565b600061418682614273565b915061419183614273565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ca576141c961439c565b5b828202905092915050565b60006141e082614273565b91506141eb83614273565b9250828210156141fe576141fd61439c565b5b828203905092915050565b600061421482614253565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142aa57808201518184015260208101905061428f565b838111156142b9576000848401525b50505050565b600060028204905060018216806142d757607f821691505b602082108114156142eb576142ea6143fa565b5b50919050565b6142fa82614458565b810181811067ffffffffffffffff8211171561431957614318614429565b5b80604052505050565b600061432d82614273565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143605761435f61439c565b5b600182019050919050565b600061437682614273565b915061438183614273565b925082614391576143906143cb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f796f752063616e74206265636f6d652075676c7920616e796d6f726500000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5465616d206d696e74696e67206f6e6c79000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f796f7520616c72656164792066726565206d696e7465642063756e7400000000600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f207465616d206d696e7473206c6566740000000000000000000000000000600082015250565b7f5468697320706861736520697320667265650000000000000000000000000000600082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f4f6e6c79203120667265652063756e7400000000000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65790000000000000000000000000000600082015250565b7f6d6178206d696e74203520706572207472616e73616374696f6e000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f75206d696e74656420616c6c2075676c792e616620796f752063616e00000000600082015250565b6147a081614209565b81146147ab57600080fd5b50565b6147b78161421b565b81146147c257600080fd5b50565b6147ce81614227565b81146147d957600080fd5b50565b6147e581614273565b81146147f057600080fd5b5056fea26469706673582212204f6b4165001e8eee1c38ec6d6b417ea7bd764ed710627e2628ad4dd67674b88264736f6c63430008040033697066733a2f2f516d544d56684e78703645477347536867456335614d33436d5972714c6a787642583254344c4e476b56726452482f00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d56684e78703645477347536867456335614d33436d5972714c6a787642583254344c4e476b56726452482f00000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063a591252d116100c1578063c87b56dd1161007a578063c87b56dd1461097b578063d5abeb01146109b8578063e8a3d485146109e3578063e985e9c514610a0e578063f2fde38b14610a4b578063f7e8d6ea14610a7457610288565b8063a591252d1461086b578063a945bf8014610896578063abc025d1146108c1578063ada7c4ed146108ec578063b88d4fde14610929578063c62752551461095257610288565b80639007bd72116101135780639007bd7214610771578063938e3d7b1461079a57806395d89b41146107c3578063a0bcfc7f146107ee578063a22cb46514610817578063a4b41a151461084057610288565b8063715018a6146106965780637af3a1af146106ad5780637c928fe9146106d657806388dedc14146106f25780638942bbff1461071b5780638da5cb5b1461074657610288565b80632fbba115116101fe57806359927044116101b7578063599270441461056d5780635c975abb146105985780636352211e146105c357806364f64076146106005780636f8aba4c1461063d57806370a082311461065957610288565b80632fbba1151461048057806333bc1c5c1461049c5780633ccfd60b146104c757806342842e0e146104de578063438b63001461050757806355f804b31461054457610288565b806316c38b3c1161025057806316c38b3c14610384578063170594c6146103ad57806318160ddd146103d857806323b872dd1461040357806325db2af11461042c5780632c4b23341461045757610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b3146103325780630f15ad8d1461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af919061376a565b610a9f565b6040516102c19190613d64565b60405180910390f35b3480156102d657600080fd5b506102df610b31565b6040516102ec9190613d7f565b60405180910390f35b34801561030157600080fd5b5061031c600480360381019061031791906137fd565b610bc3565b6040516103299190613cdb565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613705565b610c3f565b005b34801561036757600080fd5b50610382600480360381019061037d91906137fd565b610de6565b005b34801561039057600080fd5b506103ab60048036038101906103a69190613741565b610e6c565b005b3480156103b957600080fd5b506103c2610f05565b6040516103cf9190613fc1565b60405180910390f35b3480156103e457600080fd5b506103ed610f0b565b6040516103fa9190613fc1565b60405180910390f35b34801561040f57600080fd5b5061042a600480360381019061042591906135ff565b610f22565b005b34801561043857600080fd5b50610441610f32565b60405161044e9190613fc1565b60405180910390f35b34801561046357600080fd5b5061047e6004803603810190610479919061359a565b610f38565b005b61049a600480360381019061049591906137fd565b610ff8565b005b3480156104a857600080fd5b506104b1611217565b6040516104be9190613d64565b60405180910390f35b3480156104d357600080fd5b506104dc61122a565b005b3480156104ea57600080fd5b50610505600480360381019061050091906135ff565b6112ef565b005b34801561051357600080fd5b5061052e6004803603810190610529919061359a565b61130f565b60405161053b9190613d42565b60405180910390f35b34801561055057600080fd5b5061056b600480360381019061056691906137bc565b611466565b005b34801561057957600080fd5b506105826114fc565b60405161058f9190613cdb565b60405180910390f35b3480156105a457600080fd5b506105ad611522565b6040516105ba9190613d64565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e591906137fd565b611535565b6040516105f79190613cdb565b60405180910390f35b34801561060c57600080fd5b506106276004803603810190610622919061359a565b611547565b6040516106349190613d64565b60405180910390f35b610657600480360381019061065291906137fd565b611567565b005b34801561066557600080fd5b50610680600480360381019061067b919061359a565b611850565b60405161068d9190613fc1565b60405180910390f35b3480156106a257600080fd5b506106ab611909565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613741565b611991565b005b6106f060048036038101906106eb91906137fd565b611a45565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613741565b611ded565b005b34801561072757600080fd5b50610730611ea1565b60405161073d9190613fc1565b60405180910390f35b34801561075257600080fd5b5061075b611ea6565b6040516107689190613cdb565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190613826565b611ecf565b005b3480156107a657600080fd5b506107c160048036038101906107bc91906137bc565b612070565b005b3480156107cf57600080fd5b506107d8612106565b6040516107e59190613d7f565b60405180910390f35b3480156107fa57600080fd5b50610815600480360381019061081091906137bc565b612198565b005b34801561082357600080fd5b5061083e600480360381019061083991906136c9565b61222e565b005b34801561084c57600080fd5b506108556123a6565b6040516108629190613d64565b60405180910390f35b34801561087757600080fd5b506108806123b9565b60405161088d9190613fc1565b60405180910390f35b3480156108a257600080fd5b506108ab6123bf565b6040516108b89190613fc1565b60405180910390f35b3480156108cd57600080fd5b506108d66123c5565b6040516108e39190613fc1565b60405180910390f35b3480156108f857600080fd5b50610913600480360381019061090e919061359a565b6123ca565b6040516109209190613fc1565b60405180910390f35b34801561093557600080fd5b50610950600480360381019061094b919061364e565b6123e2565b005b34801561095e57600080fd5b50610979600480360381019061097491906137fd565b612455565b005b34801561098757600080fd5b506109a2600480360381019061099d91906137fd565b6124db565b6040516109af9190613d7f565b60405180910390f35b3480156109c457600080fd5b506109cd612557565b6040516109da9190613fc1565b60405180910390f35b3480156109ef57600080fd5b506109f861255d565b604051610a059190613d7f565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a3091906135c3565b6125ef565b604051610a429190613d64565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d919061359a565b612683565b005b348015610a8057600080fd5b50610a8961277b565b604051610a969190613d7f565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610afa57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b2a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610b40906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6c906142bf565b8015610bb95780601f10610b8e57610100808354040283529160200191610bb9565b820191906000526020600020905b815481529060010190602001808311610b9c57829003601f168201915b5050505050905090565b6000610bce82612809565b610c04576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4a82612868565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd1612936565b73ffffffffffffffffffffffffffffffffffffffff1614610d3457610cfd81610cf8612936565b6125ef565b610d33576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610dee61293e565b73ffffffffffffffffffffffffffffffffffffffff16610e0c611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613e61565b60405180910390fd5b8060098190555050565b610e7461293e565b73ffffffffffffffffffffffffffffffffffffffff16610e92611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610ee8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edf90613e61565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b600c5481565b6000610f15612946565b6002546001540303905090565b610f2d83838361294f565b505050565b60095481565b610f4061293e565b73ffffffffffffffffffffffffffffffffffffffff16610f5e611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90613e61565b60405180910390fd5b80600e60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b80600e60009054906101000a900460ff1615611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090613f81565b60405180910390fd5b61271081611055610f0b565b61105f91906140f4565b11156110a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109790613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613e01565b60405180910390fd5b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613de1565b60405180910390fd5b60095482600c546111af91906140f4565b11156111f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e790613ec1565b60405180910390fd5b81600c600082825461120291906140f4565b925050819055506112133383612cf9565b5050565b600e60029054906101000a900460ff1681565b61123261293e565b73ffffffffffffffffffffffffffffffffffffffff16611250611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613e61565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156112ec573d6000803e3d6000fd5b50565b61130a838383604051806020016040528060008152506123e2565b505050565b6060600061131c83611850565b905060008167ffffffffffffffff811115611360577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561138e5781602001602082028036833780820191505090505b50905060006001905060005b83811080156113ab57506127108211155b1561145a5760006113bb83611535565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611446578284838151811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050818061144290614322565b9250505b828061145190614322565b9350505061139a565b82945050505050919050565b61146e61293e565b73ffffffffffffffffffffffffffffffffffffffff1661148c611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990613e61565b60405180910390fd5b80600d90805190602001906114f89291906133be565b5050565b600e60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900460ff1681565b600061154082612868565b9050919050565b600f6020528060005260406000206000915054906101000a900460ff1681565b80600e60009054906101000a900460ff16156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f81565b60405180910390fd5b612710816115c4610f0b565b6115ce91906140f4565b111561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160690613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490613e01565b60405180910390fd5b600e60029054906101000a900460ff166116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613f01565b60405180910390fd5b600a54826116da919061417b565b341461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290613f41565b60405180910390fd5b600582111561175f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175690613f61565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600a83826117b191906140f4565b11156117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e990613fa1565b60405180910390fd5b82816117fe91906140f4565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061184b3384612cf9565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118b8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61191161293e565b73ffffffffffffffffffffffffffffffffffffffff1661192f611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90613e61565b60405180910390fd5b61198f6000612d17565b565b61199961293e565b73ffffffffffffffffffffffffffffffffffffffff166119b7611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0490613e61565b60405180910390fd5b80600e60026101000a81548160ff0219169083151502179055508015600e60016101000a81548160ff02191690831515021790555050565b80600e60009054906101000a900460ff1615611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613f81565b60405180910390fd5b61271081611aa2610f0b565b611aac91906140f4565b1115611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5290613e01565b60405180910390fd5b600e60019054906101000a900460ff16611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613e41565b60405180910390fd5b60003414611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490613ee1565b60405180910390fd5b60018214611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613f21565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613e21565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613e81565b60405180910390fd5b611d47610f0b565b61271011611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8190613da1565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611dda90614322565b9190505550611de93383612cf9565b5050565b611df561293e565b73ffffffffffffffffffffffffffffffffffffffff16611e13611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613e61565b60405180910390fd5b80600e60016101000a81548160ff0219169083151502179055508015600e60026101000a81548160ff02191690831515021790555050565b600581565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ed761293e565b73ffffffffffffffffffffffffffffffffffffffff16611ef5611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613e61565b60405180910390fd5b81600e60009054906101000a900460ff1615611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390613f81565b60405180910390fd5b61271081611fa8610f0b565b611fb291906140f4565b1115611ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fea90613da1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890613e01565b60405180910390fd5b61206b8284612cf9565b505050565b61207861293e565b73ffffffffffffffffffffffffffffffffffffffff16612096611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e390613e61565b60405180910390fd5b80600d90805190602001906121029291906133be565b5050565b606060048054612115906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612141906142bf565b801561218e5780601f106121635761010080835404028352916020019161218e565b820191906000526020600020905b81548152906001019060200180831161217157829003601f168201915b5050505050905090565b6121a061293e565b73ffffffffffffffffffffffffffffffffffffffff166121be611ea6565b73ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90613e61565b60405180910390fd5b806011908051906020019061222a9291906133be565b5050565b612236612936565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006122a8612936565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612355612936565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161239a9190613d64565b60405180910390a35050565b600e60019054906101000a900460ff1681565b600b5481565b600a5481565b600a81565b60106020528060005260406000206000915090505481565b6123ed84848461294f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461244f5761241884848484612ddb565b61244e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61245d61293e565b73ffffffffffffffffffffffffffffffffffffffff1661247b611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146124d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c890613e61565b60405180910390fd5b80600a8190555050565b60606124e682612809565b612525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251c90613ea1565b60405180910390fd5b600d61253083612f3b565b604051602001612541929190613cac565b6040516020818303038152906040529050919050565b61271081565b6060600d805461256c906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612598906142bf565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61268b61293e565b73ffffffffffffffffffffffffffffffffffffffff166126a9611ea6565b73ffffffffffffffffffffffffffffffffffffffff16146126ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f690613e61565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276690613dc1565b60405180910390fd5b61277881612d17565b50565b600d8054612788906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546127b4906142bf565b80156128015780601f106127d657610100808354040283529160200191612801565b820191906000526020600020905b8154815290600101906020018083116127e457829003601f168201915b505050505081565b600081612814612946565b11158015612823575060015482105b8015612861575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60008082905080612877612946565b116128ff576001548110156128fe5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156128fc575b60008114156128f25760056000836001900393508381526020019081526020016000205490506128c7565b8092505050612931565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b600061295a82612868565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146129c1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166129e2612936565b73ffffffffffffffffffffffffffffffffffffffff161480612a115750612a1085612a0b612936565b6125ef565b5b80612a565750612a1f612936565b73ffffffffffffffffffffffffffffffffffffffff16612a3e84610bc3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a8f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612af6576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b0385858560016130e8565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612c00866130ee565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612c8a576000600184019050600060056000838152602001908152602001600020541415612c88576001548114612c87578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf285858560016130f8565b5050505050565b612d138282604051806020016040528060008152506130fe565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e01612936565b8786866040518563ffffffff1660e01b8152600401612e239493929190613cf6565b602060405180830381600087803b158015612e3d57600080fd5b505af1925050508015612e6e57506040513d601f19601f82011682018060405250810190612e6b9190613793565b60015b612ee8573d8060008114612e9e576040519150601f19603f3d011682016040523d82523d6000602084013e612ea3565b606091505b50600081511415612ee0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612f83576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130e3565b600082905060005b60008214612fb5578080612f9e90614322565b915050600a82612fae919061414a565b9150612f8b565b60008167ffffffffffffffff811115612ff7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130295781602001600182028036833780820191505090505b5090505b600085146130dc5760018261304291906141d5565b9150600a85613051919061436b565b603061305d91906140f4565b60f81b818381518110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130d5919061414a565b945061302d565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156131a7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131b460008583866130e8565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1613219600185146133b4565b901b60a042901b613229866130ee565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461332d575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46132dd6000878480600101955087612ddb565b613313576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061326e57826001541461332857600080fd5b613398565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061332e575b8160018190555050506133ae60008583866130f8565b50505050565b6000819050919050565b8280546133ca906142bf565b90600052602060002090601f0160209004810192826133ec5760008555613433565b82601f1061340557805160ff1916838001178555613433565b82800160010185558215613433579182015b82811115613432578251825591602001919060010190613417565b5b5090506134409190613444565b5090565b5b8082111561345d576000816000905550600101613445565b5090565b600061347461346f84614001565b613fdc565b90508281526020810184848401111561348c57600080fd5b61349784828561427d565b509392505050565b60006134b26134ad84614032565b613fdc565b9050828152602081018484840111156134ca57600080fd5b6134d584828561427d565b509392505050565b6000813590506134ec81614797565b92915050565b600081359050613501816147ae565b92915050565b600081359050613516816147c5565b92915050565b60008151905061352b816147c5565b92915050565b600082601f83011261354257600080fd5b8135613552848260208601613461565b91505092915050565b600082601f83011261356c57600080fd5b813561357c84826020860161349f565b91505092915050565b600081359050613594816147dc565b92915050565b6000602082840312156135ac57600080fd5b60006135ba848285016134dd565b91505092915050565b600080604083850312156135d657600080fd5b60006135e4858286016134dd565b92505060206135f5858286016134dd565b9150509250929050565b60008060006060848603121561361457600080fd5b6000613622868287016134dd565b9350506020613633868287016134dd565b925050604061364486828701613585565b9150509250925092565b6000806000806080858703121561366457600080fd5b6000613672878288016134dd565b9450506020613683878288016134dd565b935050604061369487828801613585565b925050606085013567ffffffffffffffff8111156136b157600080fd5b6136bd87828801613531565b91505092959194509250565b600080604083850312156136dc57600080fd5b60006136ea858286016134dd565b92505060206136fb858286016134f2565b9150509250929050565b6000806040838503121561371857600080fd5b6000613726858286016134dd565b925050602061373785828601613585565b9150509250929050565b60006020828403121561375357600080fd5b6000613761848285016134f2565b91505092915050565b60006020828403121561377c57600080fd5b600061378a84828501613507565b91505092915050565b6000602082840312156137a557600080fd5b60006137b38482850161351c565b91505092915050565b6000602082840312156137ce57600080fd5b600082013567ffffffffffffffff8111156137e857600080fd5b6137f48482850161355b565b91505092915050565b60006020828403121561380f57600080fd5b600061381d84828501613585565b91505092915050565b6000806040838503121561383957600080fd5b600061384785828601613585565b9250506020613858858286016134dd565b9150509250929050565b600061386e8383613c8e565b60208301905092915050565b61388381614209565b82525050565b600061389482614088565b61389e81856140b6565b93506138a983614063565b8060005b838110156138da5781516138c18882613862565b97506138cc836140a9565b9250506001810190506138ad565b5085935050505092915050565b6138f08161421b565b82525050565b600061390182614093565b61390b81856140c7565b935061391b81856020860161428c565b61392481614458565b840191505092915050565b600061393a8261409e565b61394481856140d8565b935061395481856020860161428c565b61395d81614458565b840191505092915050565b60006139738261409e565b61397d81856140e9565b935061398d81856020860161428c565b80840191505092915050565b600081546139a6816142bf565b6139b081866140e9565b945060018216600081146139cb57600181146139dc57613a0f565b60ff19831686528186019350613a0f565b6139e585614073565b60005b83811015613a07578154818901526001820191506020810190506139e8565b838801955050505b50505092915050565b6000613a25601c836140d8565b9150613a3082614469565b602082019050919050565b6000613a486026836140d8565b9150613a5382614492565b604082019050919050565b6000613a6b6011836140d8565b9150613a76826144e1565b602082019050919050565b6000613a8e6013836140d8565b9150613a998261450a565b602082019050919050565b6000613ab1601c836140d8565b9150613abc82614533565b602082019050919050565b6000613ad46012836140d8565b9150613adf8261455c565b602082019050919050565b6000613af76005836140e9565b9150613b0282614585565b600582019050919050565b6000613b1a6020836140d8565b9150613b25826145ae565b602082019050919050565b6000613b3d6013836140d8565b9150613b48826145d7565b602082019050919050565b6000613b60602f836140d8565b9150613b6b82614600565b604082019050919050565b6000613b836012836140d8565b9150613b8e8261464f565b602082019050919050565b6000613ba66012836140d8565b9150613bb182614678565b602082019050919050565b6000613bc96014836140d8565b9150613bd4826146a1565b602082019050919050565b6000613bec6010836140d8565b9150613bf7826146ca565b602082019050919050565b6000613c0f6012836140d8565b9150613c1a826146f3565b602082019050919050565b6000613c32601a836140d8565b9150613c3d8261471c565b602082019050919050565b6000613c556012836140d8565b9150613c6082614745565b602082019050919050565b6000613c78601c836140d8565b9150613c838261476e565b602082019050919050565b613c9781614273565b82525050565b613ca681614273565b82525050565b6000613cb88285613999565b9150613cc48284613968565b9150613ccf82613aea565b91508190509392505050565b6000602082019050613cf0600083018461387a565b92915050565b6000608082019050613d0b600083018761387a565b613d18602083018661387a565b613d256040830185613c9d565b8181036060830152613d3781846138f6565b905095945050505050565b60006020820190508181036000830152613d5c8184613889565b905092915050565b6000602082019050613d7960008301846138e7565b92915050565b60006020820190508181036000830152613d99818461392f565b905092915050565b60006020820190508181036000830152613dba81613a18565b9050919050565b60006020820190508181036000830152613dda81613a3b565b9050919050565b60006020820190508181036000830152613dfa81613a5e565b9050919050565b60006020820190508181036000830152613e1a81613a81565b9050919050565b60006020820190508181036000830152613e3a81613aa4565b9050919050565b60006020820190508181036000830152613e5a81613ac7565b9050919050565b60006020820190508181036000830152613e7a81613b0d565b9050919050565b60006020820190508181036000830152613e9a81613b30565b9050919050565b60006020820190508181036000830152613eba81613b53565b9050919050565b60006020820190508181036000830152613eda81613b76565b9050919050565b60006020820190508181036000830152613efa81613b99565b9050919050565b60006020820190508181036000830152613f1a81613bbc565b9050919050565b60006020820190508181036000830152613f3a81613bdf565b9050919050565b60006020820190508181036000830152613f5a81613c02565b9050919050565b60006020820190508181036000830152613f7a81613c25565b9050919050565b60006020820190508181036000830152613f9a81613c48565b9050919050565b60006020820190508181036000830152613fba81613c6b565b9050919050565b6000602082019050613fd66000830184613c9d565b92915050565b6000613fe6613ff7565b9050613ff282826142f1565b919050565b6000604051905090565b600067ffffffffffffffff82111561401c5761401b614429565b5b61402582614458565b9050602081019050919050565b600067ffffffffffffffff82111561404d5761404c614429565b5b61405682614458565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140ff82614273565b915061410a83614273565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413f5761413e61439c565b5b828201905092915050565b600061415582614273565b915061416083614273565b9250826141705761416f6143cb565b5b828204905092915050565b600061418682614273565b915061419183614273565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ca576141c961439c565b5b828202905092915050565b60006141e082614273565b91506141eb83614273565b9250828210156141fe576141fd61439c565b5b828203905092915050565b600061421482614253565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142aa57808201518184015260208101905061428f565b838111156142b9576000848401525b50505050565b600060028204905060018216806142d757607f821691505b602082108114156142eb576142ea6143fa565b5b50919050565b6142fa82614458565b810181811067ffffffffffffffff8211171561431957614318614429565b5b80604052505050565b600061432d82614273565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143605761435f61439c565b5b600182019050919050565b600061437682614273565b915061438183614273565b925082614391576143906143cb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f796f752063616e74206265636f6d652075676c7920616e796d6f726500000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5465616d206d696e74696e67206f6e6c79000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374206d696e74696e6700000000000000000000000000600082015250565b7f796f7520616c72656164792066726565206d696e7465642063756e7400000000600082015250565b7f467265652073616c6520696e6163746976650000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f55736572206d61782066726565206c696d697400000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f207465616d206d696e7473206c6566740000000000000000000000000000600082015250565b7f5468697320706861736520697320667265650000000000000000000000000000600082015250565b7f5075626c69632073616c6520696e616374697665000000000000000000000000600082015250565b7f4f6e6c79203120667265652063756e7400000000000000000000000000000000600082015250565b7f67697665206d65206d6f7265206d6f6e65790000000000000000000000000000600082015250565b7f6d6178206d696e74203520706572207472616e73616374696f6e000000000000600082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f75206d696e74656420616c6c2075676c792e616620796f752063616e00000000600082015250565b6147a081614209565b81146147ab57600080fd5b50565b6147b78161421b565b81146147c257600080fd5b50565b6147ce81614227565b81146147d957600080fd5b50565b6147e581614273565b81146147f057600080fd5b5056fea26469706673582212204f6b4165001e8eee1c38ec6d6b417ea7bd764ed710627e2628ad4dd67674b88264736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d544d56684e78703645477347536867456335614d33436d5972714c6a787642583254344c4e476b56726452482f00000000000000000000

-----Decoded View---------------
Arg [0] : revealedURI (string): ipfs://QmTMVhNxp6EGsGShgEc5aM3CmYrqLjxvBX2T4LNGkVrdRH/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d544d56684e78703645477347536867456335614d33436d
Arg [3] : 5972714c6a787642583254344c4e476b56726452482f00000000000000000000


Deployed Bytecode Sourcemap

52501:5753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27123:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32136:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34204:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33664:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56089:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56842:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52824:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26177:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35090:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52592:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57191:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53541:316;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53024:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57864:109;;;;;;;;;;;;;:::i;:::-;;35331:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55018:688;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56321:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53148:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52956:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31925:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53227:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54434:574;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27802:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13233:103;;;;;;;;;;;;;:::i;:::-;;56933:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53869:557;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57062:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52715:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12582:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57310:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56431:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32305:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55867:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34480:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52990:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52678:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52631:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52766:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53280:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35587:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56205:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56553:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52544:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55983:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34859:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13491:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52863:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27123:615;27208:4;27523:10;27508:25;;:11;:25;;;;:102;;;;27600:10;27585:25;;:11;:25;;;;27508:102;:179;;;;27677:10;27662:25;;:11;:25;;;;27508:179;27488:199;;27123:615;;;:::o;32136:100::-;32190:13;32223:5;32216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32136:100;:::o;34204:204::-;34272:7;34297:16;34305:7;34297;:16::i;:::-;34292:64;;34322:34;;;;;;;;;;;;;;34292:64;34376:15;:24;34392:7;34376:24;;;;;;;;;;;;;;;;;;;;;34369:31;;34204:204;;;:::o;33664:474::-;33737:13;33769:27;33788:7;33769:18;:27::i;:::-;33737:61;;33819:5;33813:11;;:2;:11;;;33809:48;;;33833:24;;;;;;;;;;;;;;33809:48;33897:5;33874:28;;:19;:17;:19::i;:::-;:28;;;33870:175;;33922:44;33939:5;33946:19;:17;:19::i;:::-;33922:16;:44::i;:::-;33917:128;;33994:35;;;;;;;;;;;;;;33917:128;33870:175;34084:2;34057:15;:24;34073:7;34057:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34122:7;34118:2;34102:28;;34111:5;34102:28;;;;;;;;;;;;33664:474;;;:::o;56089:108::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56177:12:::1;56163:11;:26;;;;56089:108:::0;:::o;56842:83::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56911:6:::1;56902;;:15;;;;;;;;;;;;;;;;;;56842:83:::0;:::o;52824:30::-;;;;:::o;26177:315::-;26230:7;26458:15;:13;:15::i;:::-;26443:12;;26427:13;;:28;:46;26420:53;;26177:315;:::o;35090:170::-;35224:28;35234:4;35240:2;35244:7;35224:9;:28::i;:::-;35090:170;;;:::o;52592:32::-;;;;:::o;57191:111::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57283:11:::1;57270:10;;:24;;;;;;;;;;;;;;;;;;57191:111:::0;:::o;53541:316::-;53607:8;58047:6;;;;;;;;;;;58046:7;58038:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:5;58111:8;58095:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;58087:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58197:10;58184:23;;:9;:23;;;58176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53650:10:::1;;;;;;;;;;;53636:24;;:10;:24;;;53628:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53731:11;;53719:8;53701:15;;:26;;;;:::i;:::-;:41;;53693:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53797:8;53778:15;;:27;;;;;;;:::i;:::-;;;;;;;;53818:31;53828:10;53840:8;53818:9;:31::i;:::-;53541:316:::0;;:::o;53024:29::-;;;;;;;;;;;;;:::o;57864:109::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57922:10:::1;57914:28;;:51;57943:21;57914:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57864:109::o:0;35331:185::-;35469:39;35486:4;35492:2;35496:7;35469:39;;;;;;;;;;;;:16;:39::i;:::-;35331:185;;;:::o;55018:688::-;55078:16;55112:23;55138:17;55148:6;55138:9;:17::i;:::-;55112:43;;55166:30;55213:15;55199:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55166:63;;55240:22;55265:1;55240:26;;55277:23;55317:349;55342:15;55324;:33;:64;;;;;52580:5;55361:14;:27;;55324:64;55317:349;;;55405:25;55433:23;55441:14;55433:7;:23::i;:::-;55405:51;;55498:6;55477:27;;:17;:27;;;55473:153;;;55558:14;55525:13;55539:15;55525:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;55593:17;;;;;:::i;:::-;;;;55473:153;55638:16;;;;;:::i;:::-;;;;55317:349;;;;55685:13;55678:20;;;;;;55018:688;;;:::o;56321:102::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56407:8:::1;56393:11;:22;;;;;;;;;;;;:::i;:::-;;56321:102:::0;:::o;53148:70::-;;;;;;;;;;;;;:::o;52956:25::-;;;;;;;;;;;;;:::o;31925:144::-;31989:7;32032:27;32051:7;32032:18;:27::i;:::-;32009:52;;31925:144;;;:::o;53227:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;54434:574::-;54502:8;58047:6;;;;;;;;;;;58046:7;58038:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:5;58111:8;58095:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;58087:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58197:10;58184:23;;:9;:23;;;58176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54531:10:::1;;;;;;;;;;;54523:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;54609:11;;54598:8;:22;;;;:::i;:::-;54585:9;:35;54577:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52758:1;54662:8;:28;;54654:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54734:17;54754:13;:25;54768:10;54754:25;;;;;;;;;;;;;;;;54734:45;;52813:2;54828:8;54816:9;:20;;;;:::i;:::-;:44;;54808:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54947:8;54935:9;:20;;;;:::i;:::-;54906:13;:25;54920:10;54906:25;;;;;;;;;;;;;;;:50;;;;54969:31;54979:10;54991:8;54969:9;:31::i;:::-;58242:1;54434:574:::0;;:::o;27802:224::-;27866:7;27907:1;27890:19;;:5;:19;;;27886:60;;;27918:28;;;;;;;;;;;;;;27886:60;23141:13;27964:18;:25;27983:5;27964:25;;;;;;;;;;;;;;;;:54;27957:61;;27802:224;;;:::o;13233:103::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13298:30:::1;13325:1;13298:18;:30::i;:::-;13233:103::o:0;56933:123::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57013:6:::1;57000:10;;:19;;;;;;;;;;;;;;;;;;57042:6;57041:7;57030:8;;:18;;;;;;;;;;;;;;;;;;56933:123:::0;:::o;53869:557::-;53937:8;58047:6;;;;;;;;;;;58046:7;58038:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:5;58111:8;58095:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;58087:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58197:10;58184:23;;:9;:23;;;58176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;53966:8:::1;;;;;;;;;;;53958:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;54029:1;54016:9;:14;54008:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54084:1;54072:8;:13;54064:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54153:1;54125:13;:25;54139:10;54125:25;;;;;;;;;;;;;;;;:29;54117:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54207:14;:26;54222:10;54207:26;;;;;;;;;;;;;;;;;;;;;;;;;54206:27;54198:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54288:13;:11;:13::i;:::-;52580:5;54276:25;54268:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;54347:13;:25;54361:10;54347:25;;;;;;;;;;;;;;;;:27;;;;;;;;;:::i;:::-;;;;;;54387:31;54397:10;54409:8;54387:9;:31::i;:::-;53869:557:::0;;:::o;57062:121::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57138:6:::1;57127:8;;:17;;;;;;;;;;;;;;;;;;57169:6;57168:7;57155:10;;:20;;;;;;;;;;;;;;;;;;57062:121:::0;:::o;52715:44::-;52758:1;52715:44;:::o;12582:87::-;12628:7;12655:6;;;;;;;;;;;12648:13;;12582:87;:::o;57310:146::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57398:8:::1;58047:6;;;;;;;;;;;58046:7;58038:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:5;58111:8;58095:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;58087:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58197:10;58184:23;;:9;:23;;;58176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57419:29:::2;57429:8;57439;57419:9;:29::i;:::-;12873:1:::1;57310:146:::0;;:::o;56431:114::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56525:12:::1;56511:11;:26;;;;;;;;;;;;:::i;:::-;;56431:114:::0;:::o;32305:104::-;32361:13;32394:7;32387:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32305:104;:::o;55867:106::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55957:8:::1;55941:13;:24;;;;;;;;;;;;:::i;:::-;;55867:106:::0;:::o;34480:308::-;34591:19;:17;:19::i;:::-;34579:31;;:8;:31;;;34575:61;;;34619:17;;;;;;;;;;;;;;34575:61;34701:8;34649:18;:39;34668:19;:17;:19::i;:::-;34649:39;;;;;;;;;;;;;;;:49;34689:8;34649:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34761:8;34725:55;;34740:19;:17;:19::i;:::-;34725:55;;;34771:8;34725:55;;;;;;:::i;:::-;;;;;;;;34480:308;;:::o;52990:27::-;;;;;;;;;;;;;:::o;52678:30::-;;;;:::o;52631:40::-;;;;:::o;52766:49::-;52813:2;52766:49;:::o;53280:48::-;;;;;;;;;;;;;;;;;:::o;35587:396::-;35754:28;35764:4;35770:2;35774:7;35754:9;:28::i;:::-;35815:1;35797:2;:14;;;:19;35793:183;;35836:56;35867:4;35873:2;35877:7;35886:5;35836:30;:56::i;:::-;35831:145;;35920:40;;;;;;;;;;;;;;35831:145;35793:183;35587:396;;;;:::o;56205:108::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56293:12:::1;56279:11;:26;;;;56205:108:::0;:::o;56553:281::-;56619:13;56655:17;56663:8;56655:7;:17::i;:::-;56647:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;56776:11;56789:26;56806:8;56789:16;:26::i;:::-;56759:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56745:81;;56553:281;;;:::o;52544:41::-;52580:5;52544:41;:::o;55983:96::-;56027:13;56060:11;56053:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55983:96;:::o;34859:164::-;34956:4;34980:18;:25;34999:5;34980:25;;;;;;;;;;;;;;;:35;35006:8;34980:35;;;;;;;;;;;;;;;;;;;;;;;;;34973:42;;34859:164;;;;:::o;13491:201::-;12813:12;:10;:12::i;:::-;12802:23;;:7;:5;:7::i;:::-;:23;;;12794:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13600:1:::1;13580:22;;:8;:22;;;;13572:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13656:28;13675:8;13656:18;:28::i;:::-;13491:201:::0;:::o;52863:84::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36238:273::-;36295:4;36351:7;36332:15;:13;:15::i;:::-;:26;;:66;;;;;36385:13;;36375:7;:23;36332:66;:152;;;;;36483:1;23911:8;36436:17;:26;36454:7;36436:26;;;;;;;;;;;;:43;:48;36332:152;36312:172;;36238:273;;;:::o;29440:1129::-;29507:7;29527:12;29542:7;29527:22;;29610:4;29591:15;:13;:15::i;:::-;:23;29587:915;;29644:13;;29637:4;:20;29633:869;;;29682:14;29699:17;:23;29717:4;29699:23;;;;;;;;;;;;29682:40;;29815:1;23911:8;29788:6;:23;:28;29784:699;;;30307:113;30324:1;30314:6;:11;30307:113;;;30367:17;:25;30385:6;;;;;;;30367:25;;;;;;;;;;;;30358:34;;30307:113;;;30453:6;30446:13;;;;;;29784:699;29633:869;;29587:915;30530:31;;;;;;;;;;;;;;29440:1129;;;;:::o;50220:105::-;50280:7;50307:10;50300:17;;50220:105;:::o;11306:98::-;11359:7;11386:10;11379:17;;11306:98;:::o;53432:101::-;53497:7;53524:1;53517:8;;53432:101;:::o;41477:2515::-;41592:27;41622;41641:7;41622:18;:27::i;:::-;41592:57;;41707:4;41666:45;;41682:19;41666:45;;;41662:86;;41720:28;;;;;;;;;;;;;;41662:86;41761:22;41810:4;41787:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;41831:43;41848:4;41854:19;:17;:19::i;:::-;41831:16;:43::i;:::-;41787:87;:147;;;;41915:19;:17;:19::i;:::-;41891:43;;:20;41903:7;41891:11;:20::i;:::-;:43;;;41787:147;41761:174;;41953:17;41948:66;;41979:35;;;;;;;;;;;;;;41948:66;42043:1;42029:16;;:2;:16;;;42025:52;;;42054:23;;;;;;;;;;;;;;42025:52;42090:43;42112:4;42118:2;42122:7;42131:1;42090:21;:43::i;:::-;42206:15;:24;42222:7;42206:24;;;;;;;;;;;;42199:31;;;;;;;;;;;42598:18;:24;42617:4;42598:24;;;;;;;;;;;;;;;;42596:26;;;;;;;;;;;;42667:18;:22;42686:2;42667:22;;;;;;;;;;;;;;;;42665:24;;;;;;;;;;;24193:8;23795:3;43048:15;:41;;43006:21;43024:2;43006:17;:21::i;:::-;:84;:128;42960:17;:26;42978:7;42960:26;;;;;;;;;;;:174;;;;43304:1;24193:8;43254:19;:46;:51;43250:626;;;43326:19;43358:1;43348:7;:11;43326:33;;43515:1;43481:17;:30;43499:11;43481:30;;;;;;;;;;;;:35;43477:384;;;43619:13;;43604:11;:28;43600:242;;43799:19;43766:17;:30;43784:11;43766:30;;;;;;;;;;;:52;;;;43600:242;43477:384;43250:626;;43923:7;43919:2;43904:27;;43913:4;43904:27;;;;;;;;;;;;43942:42;43963:4;43969:2;43973:7;43982:1;43942:20;:42::i;:::-;41477:2515;;;;;:::o;36595:104::-;36664:27;36674:2;36678:8;36664:27;;;;;;;;;;;;:9;:27::i;:::-;36595:104;;:::o;13852:191::-;13926:16;13945:6;;;;;;;;;;;13926:25;;13971:8;13962:6;;:17;;;;;;;;;;;;;;;;;;14026:8;13995:40;;14016:8;13995:40;;;;;;;;;;;;13852:191;;:::o;47689:716::-;47852:4;47898:2;47873:45;;;47919:19;:17;:19::i;:::-;47940:4;47946:7;47955:5;47873:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47869:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48173:1;48156:6;:13;:18;48152:235;;;48202:40;;;;;;;;;;;;;;48152:235;48345:6;48339:13;48330:6;48326:2;48322:15;48315:38;47869:529;48042:54;;;48032:64;;;:6;:64;;;;48025:71;;;47689:716;;;;;;:::o;8868:723::-;8924:13;9154:1;9145:5;:10;9141:53;;;9172:10;;;;;;;;;;;;;;;;;;;;;9141:53;9204:12;9219:5;9204:20;;9235:14;9260:78;9275:1;9267:4;:9;9260:78;;9293:8;;;;;:::i;:::-;;;;9324:2;9316:10;;;;;:::i;:::-;;;9260:78;;;9348:19;9380:6;9370:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9348:39;;9398:154;9414:1;9405:5;:10;9398:154;;9442:1;9432:11;;;;;:::i;:::-;;;9509:2;9501:5;:10;;;;:::i;:::-;9488:2;:24;;;;:::i;:::-;9475:39;;9458:6;9465;9458:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9538:2;9529:11;;;;;:::i;:::-;;;9398:154;;;9576:6;9562:21;;;;;8868:723;;;;:::o;49053:159::-;;;;;:::o;33225:148::-;33289:14;33350:5;33340:15;;33325:41;;;:::o;49871:158::-;;;;;:::o;37072:2236::-;37195:20;37218:13;;37195:36;;37260:1;37246:16;;:2;:16;;;37242:48;;;37271:19;;;;;;;;;;;;;;37242:48;37317:1;37305:8;:13;37301:44;;;37327:18;;;;;;;;;;;;;;37301:44;37358:61;37388:1;37392:2;37396:12;37410:8;37358:21;:61::i;:::-;37962:1;23278:2;37933:1;:25;;37932:31;37920:8;:44;37894:18;:22;37913:2;37894:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;24058:3;38363:29;38390:1;38378:8;:13;38363:14;:29::i;:::-;:56;;23795:3;38300:15;:41;;38258:21;38276:2;38258:17;:21::i;:::-;:84;:162;38207:17;:31;38225:12;38207:31;;;;;;;;;;;:213;;;;38437:20;38460:12;38437:35;;38487:11;38516:8;38501:12;:23;38487:37;;38563:1;38545:2;:14;;;:19;38541:635;;38585:313;38641:12;38637:2;38616:38;;38633:1;38616:38;;;;;;;;;;;;38682:69;38721:1;38725:2;38729:14;;;;;;38745:5;38682:30;:69::i;:::-;38677:174;;38787:40;;;;;;;;;;;;;;38677:174;38893:3;38878:12;:18;38585:313;;38979:12;38962:13;;:29;38958:43;;38993:8;;;38958:43;38541:635;;;39042:119;39098:14;;;;;;39094:2;39073:40;;39090:1;39073:40;;;;;;;;;;;;39156:3;39141:12;:18;39042:119;;38541:635;39206:12;39190:13;:28;;;;37072:2236;;39240:60;39269:1;39273:2;39277:12;39291:8;39240:20;:60::i;:::-;37072:2236;;;;:::o;33460:142::-;33518:14;33579:5;33569:15;;33554:41;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:407::-;6416:6;6424;6473:2;6461:9;6452:7;6448:23;6444:32;6441:2;;;6489:1;6486;6479:12;6441:2;6532:1;6557:53;6602:7;6593:6;6582:9;6578:22;6557:53;:::i;:::-;6547:63;;6503:117;6659:2;6685:53;6730:7;6721:6;6710:9;6706:22;6685:53;:::i;:::-;6675:63;;6630:118;6431:324;;;;;:::o;6761:179::-;6830:10;6851:46;6893:3;6885:6;6851:46;:::i;:::-;6929:4;6924:3;6920:14;6906:28;;6841:99;;;;:::o;6946:118::-;7033:24;7051:5;7033:24;:::i;:::-;7028:3;7021:37;7011:53;;:::o;7100:732::-;7219:3;7248:54;7296:5;7248:54;:::i;:::-;7318:86;7397:6;7392:3;7318:86;:::i;:::-;7311:93;;7428:56;7478:5;7428:56;:::i;:::-;7507:7;7538:1;7523:284;7548:6;7545:1;7542:13;7523:284;;;7624:6;7618:13;7651:63;7710:3;7695:13;7651:63;:::i;:::-;7644:70;;7737:60;7790:6;7737:60;:::i;:::-;7727:70;;7583:224;7570:1;7567;7563:9;7558:14;;7523:284;;;7527:14;7823:3;7816:10;;7224:608;;;;;;;:::o;7838:109::-;7919:21;7934:5;7919:21;:::i;:::-;7914:3;7907:34;7897:50;;:::o;7953:360::-;8039:3;8067:38;8099:5;8067:38;:::i;:::-;8121:70;8184:6;8179:3;8121:70;:::i;:::-;8114:77;;8200:52;8245:6;8240:3;8233:4;8226:5;8222:16;8200:52;:::i;:::-;8277:29;8299:6;8277:29;:::i;:::-;8272:3;8268:39;8261:46;;8043:270;;;;;:::o;8319:364::-;8407:3;8435:39;8468:5;8435:39;:::i;:::-;8490:71;8554:6;8549:3;8490:71;:::i;:::-;8483:78;;8570:52;8615:6;8610:3;8603:4;8596:5;8592:16;8570:52;:::i;:::-;8647:29;8669:6;8647:29;:::i;:::-;8642:3;8638:39;8631:46;;8411:272;;;;;:::o;8689:377::-;8795:3;8823:39;8856:5;8823:39;:::i;:::-;8878:89;8960:6;8955:3;8878:89;:::i;:::-;8871:96;;8976:52;9021:6;9016:3;9009:4;9002:5;8998:16;8976:52;:::i;:::-;9053:6;9048:3;9044:16;9037:23;;8799:267;;;;;:::o;9096:845::-;9199:3;9236:5;9230:12;9265:36;9291:9;9265:36;:::i;:::-;9317:89;9399:6;9394:3;9317:89;:::i;:::-;9310:96;;9437:1;9426:9;9422:17;9453:1;9448:137;;;;9599:1;9594:341;;;;9415:520;;9448:137;9532:4;9528:9;9517;9513:25;9508:3;9501:38;9568:6;9563:3;9559:16;9552:23;;9448:137;;9594:341;9661:38;9693:5;9661:38;:::i;:::-;9721:1;9735:154;9749:6;9746:1;9743:13;9735:154;;;9823:7;9817:14;9813:1;9808:3;9804:11;9797:35;9873:1;9864:7;9860:15;9849:26;;9771:4;9768:1;9764:12;9759:17;;9735:154;;;9918:6;9913:3;9909:16;9902:23;;9601:334;;9415:520;;9203:738;;;;;;:::o;9947:366::-;10089:3;10110:67;10174:2;10169:3;10110:67;:::i;:::-;10103:74;;10186:93;10275:3;10186:93;:::i;:::-;10304:2;10299:3;10295:12;10288:19;;10093:220;;;:::o;10319:366::-;10461:3;10482:67;10546:2;10541:3;10482:67;:::i;:::-;10475:74;;10558:93;10647:3;10558:93;:::i;:::-;10676:2;10671:3;10667:12;10660:19;;10465:220;;;:::o;10691:366::-;10833:3;10854:67;10918:2;10913:3;10854:67;:::i;:::-;10847:74;;10930:93;11019:3;10930:93;:::i;:::-;11048:2;11043:3;11039:12;11032:19;;10837:220;;;:::o;11063:366::-;11205:3;11226:67;11290:2;11285:3;11226:67;:::i;:::-;11219:74;;11302:93;11391:3;11302:93;:::i;:::-;11420:2;11415:3;11411:12;11404:19;;11209:220;;;:::o;11435:366::-;11577:3;11598:67;11662:2;11657:3;11598:67;:::i;:::-;11591:74;;11674:93;11763:3;11674:93;:::i;:::-;11792:2;11787:3;11783:12;11776:19;;11581:220;;;:::o;11807:366::-;11949:3;11970:67;12034:2;12029:3;11970:67;:::i;:::-;11963:74;;12046:93;12135:3;12046:93;:::i;:::-;12164:2;12159:3;12155:12;12148:19;;11953:220;;;:::o;12179:400::-;12339:3;12360:84;12442:1;12437:3;12360:84;:::i;:::-;12353:91;;12453:93;12542:3;12453:93;:::i;:::-;12571:1;12566:3;12562:11;12555:18;;12343:236;;;:::o;12585:366::-;12727:3;12748:67;12812:2;12807:3;12748:67;:::i;:::-;12741:74;;12824:93;12913:3;12824:93;:::i;:::-;12942:2;12937:3;12933:12;12926:19;;12731:220;;;:::o;12957:366::-;13099:3;13120:67;13184:2;13179:3;13120:67;:::i;:::-;13113:74;;13196:93;13285:3;13196:93;:::i;:::-;13314:2;13309:3;13305:12;13298:19;;13103:220;;;:::o;13329:366::-;13471:3;13492:67;13556:2;13551:3;13492:67;:::i;:::-;13485:74;;13568:93;13657:3;13568:93;:::i;:::-;13686:2;13681:3;13677:12;13670:19;;13475:220;;;:::o;13701:366::-;13843:3;13864:67;13928:2;13923:3;13864:67;:::i;:::-;13857:74;;13940:93;14029:3;13940:93;:::i;:::-;14058:2;14053:3;14049:12;14042:19;;13847:220;;;:::o;14073:366::-;14215:3;14236:67;14300:2;14295:3;14236:67;:::i;:::-;14229:74;;14312:93;14401:3;14312:93;:::i;:::-;14430:2;14425:3;14421:12;14414:19;;14219:220;;;:::o;14445:366::-;14587:3;14608:67;14672:2;14667:3;14608:67;:::i;:::-;14601:74;;14684:93;14773:3;14684:93;:::i;:::-;14802:2;14797:3;14793:12;14786:19;;14591:220;;;:::o;14817:366::-;14959:3;14980:67;15044:2;15039:3;14980:67;:::i;:::-;14973:74;;15056:93;15145:3;15056:93;:::i;:::-;15174:2;15169:3;15165:12;15158:19;;14963:220;;;:::o;15189:366::-;15331:3;15352:67;15416:2;15411:3;15352:67;:::i;:::-;15345:74;;15428:93;15517:3;15428:93;:::i;:::-;15546:2;15541:3;15537:12;15530:19;;15335:220;;;:::o;15561:366::-;15703:3;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15800:93;15889:3;15800:93;:::i;:::-;15918:2;15913:3;15909:12;15902:19;;15707:220;;;:::o;15933:366::-;16075:3;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16172:93;16261:3;16172:93;:::i;:::-;16290:2;16285:3;16281:12;16274:19;;16079:220;;;:::o;16305:366::-;16447:3;16468:67;16532:2;16527:3;16468:67;:::i;:::-;16461:74;;16544:93;16633:3;16544:93;:::i;:::-;16662:2;16657:3;16653:12;16646:19;;16451:220;;;:::o;16677:108::-;16754:24;16772:5;16754:24;:::i;:::-;16749:3;16742:37;16732:53;;:::o;16791:118::-;16878:24;16896:5;16878:24;:::i;:::-;16873:3;16866:37;16856:53;;:::o;16915:695::-;17193:3;17215:92;17303:3;17294:6;17215:92;:::i;:::-;17208:99;;17324:95;17415:3;17406:6;17324:95;:::i;:::-;17317:102;;17436:148;17580:3;17436:148;:::i;:::-;17429:155;;17601:3;17594:10;;17197:413;;;;;:::o;17616:222::-;17709:4;17747:2;17736:9;17732:18;17724:26;;17760:71;17828:1;17817:9;17813:17;17804:6;17760:71;:::i;:::-;17714:124;;;;:::o;17844:640::-;18039:4;18077:3;18066:9;18062:19;18054:27;;18091:71;18159:1;18148:9;18144:17;18135:6;18091:71;:::i;:::-;18172:72;18240:2;18229:9;18225:18;18216:6;18172:72;:::i;:::-;18254;18322:2;18311:9;18307:18;18298:6;18254:72;:::i;:::-;18373:9;18367:4;18363:20;18358:2;18347:9;18343:18;18336:48;18401:76;18472:4;18463:6;18401:76;:::i;:::-;18393:84;;18044:440;;;;;;;:::o;18490:373::-;18633:4;18671:2;18660:9;18656:18;18648:26;;18720:9;18714:4;18710:20;18706:1;18695:9;18691:17;18684:47;18748:108;18851:4;18842:6;18748:108;:::i;:::-;18740:116;;18638:225;;;;:::o;18869:210::-;18956:4;18994:2;18983:9;18979:18;18971:26;;19007:65;19069:1;19058:9;19054:17;19045:6;19007:65;:::i;:::-;18961:118;;;;:::o;19085:313::-;19198:4;19236:2;19225:9;19221:18;19213:26;;19285:9;19279:4;19275:20;19271:1;19260:9;19256:17;19249:47;19313:78;19386:4;19377:6;19313:78;:::i;:::-;19305:86;;19203:195;;;;:::o;19404:419::-;19570:4;19608:2;19597:9;19593:18;19585:26;;19657:9;19651:4;19647:20;19643:1;19632:9;19628:17;19621:47;19685:131;19811:4;19685:131;:::i;:::-;19677:139;;19575:248;;;:::o;19829:419::-;19995:4;20033:2;20022:9;20018:18;20010:26;;20082:9;20076:4;20072:20;20068:1;20057:9;20053:17;20046:47;20110:131;20236:4;20110:131;:::i;:::-;20102:139;;20000:248;;;:::o;20254:419::-;20420:4;20458:2;20447:9;20443:18;20435:26;;20507:9;20501:4;20497:20;20493:1;20482:9;20478:17;20471:47;20535:131;20661:4;20535:131;:::i;:::-;20527:139;;20425:248;;;:::o;20679:419::-;20845:4;20883:2;20872:9;20868:18;20860:26;;20932:9;20926:4;20922:20;20918:1;20907:9;20903:17;20896:47;20960:131;21086:4;20960:131;:::i;:::-;20952:139;;20850:248;;;:::o;21104:419::-;21270:4;21308:2;21297:9;21293:18;21285:26;;21357:9;21351:4;21347:20;21343:1;21332:9;21328:17;21321:47;21385:131;21511:4;21385:131;:::i;:::-;21377:139;;21275:248;;;:::o;21529:419::-;21695:4;21733:2;21722:9;21718:18;21710:26;;21782:9;21776:4;21772:20;21768:1;21757:9;21753:17;21746:47;21810:131;21936:4;21810:131;:::i;:::-;21802:139;;21700:248;;;:::o;21954:419::-;22120:4;22158:2;22147:9;22143:18;22135:26;;22207:9;22201:4;22197:20;22193:1;22182:9;22178:17;22171:47;22235:131;22361:4;22235:131;:::i;:::-;22227:139;;22125:248;;;:::o;22379:419::-;22545:4;22583:2;22572:9;22568:18;22560:26;;22632:9;22626:4;22622:20;22618:1;22607:9;22603:17;22596:47;22660:131;22786:4;22660:131;:::i;:::-;22652:139;;22550:248;;;:::o;22804:419::-;22970:4;23008:2;22997:9;22993:18;22985:26;;23057:9;23051:4;23047:20;23043:1;23032:9;23028:17;23021:47;23085:131;23211:4;23085:131;:::i;:::-;23077:139;;22975:248;;;:::o;23229:419::-;23395:4;23433:2;23422:9;23418:18;23410:26;;23482:9;23476:4;23472:20;23468:1;23457:9;23453:17;23446:47;23510:131;23636:4;23510:131;:::i;:::-;23502:139;;23400:248;;;:::o;23654:419::-;23820:4;23858:2;23847:9;23843:18;23835:26;;23907:9;23901:4;23897:20;23893:1;23882:9;23878:17;23871:47;23935:131;24061:4;23935:131;:::i;:::-;23927:139;;23825:248;;;:::o;24079:419::-;24245:4;24283:2;24272:9;24268:18;24260:26;;24332:9;24326:4;24322:20;24318:1;24307:9;24303:17;24296:47;24360:131;24486:4;24360:131;:::i;:::-;24352:139;;24250:248;;;:::o;24504:419::-;24670:4;24708:2;24697:9;24693:18;24685:26;;24757:9;24751:4;24747:20;24743:1;24732:9;24728:17;24721:47;24785:131;24911:4;24785:131;:::i;:::-;24777:139;;24675:248;;;:::o;24929:419::-;25095:4;25133:2;25122:9;25118:18;25110:26;;25182:9;25176:4;25172:20;25168:1;25157:9;25153:17;25146:47;25210:131;25336:4;25210:131;:::i;:::-;25202:139;;25100:248;;;:::o;25354:419::-;25520:4;25558:2;25547:9;25543:18;25535:26;;25607:9;25601:4;25597:20;25593:1;25582:9;25578:17;25571:47;25635:131;25761:4;25635:131;:::i;:::-;25627:139;;25525:248;;;:::o;25779:419::-;25945:4;25983:2;25972:9;25968:18;25960:26;;26032:9;26026:4;26022:20;26018:1;26007:9;26003:17;25996:47;26060:131;26186:4;26060:131;:::i;:::-;26052:139;;25950:248;;;:::o;26204:419::-;26370:4;26408:2;26397:9;26393:18;26385:26;;26457:9;26451:4;26447:20;26443:1;26432:9;26428:17;26421:47;26485:131;26611:4;26485:131;:::i;:::-;26477:139;;26375:248;;;:::o;26629:222::-;26722:4;26760:2;26749:9;26745:18;26737:26;;26773:71;26841:1;26830:9;26826:17;26817:6;26773:71;:::i;:::-;26727:124;;;;:::o;26857:129::-;26891:6;26918:20;;:::i;:::-;26908:30;;26947:33;26975:4;26967:6;26947:33;:::i;:::-;26898:88;;;:::o;26992:75::-;27025:6;27058:2;27052:9;27042:19;;27032:35;:::o;27073:307::-;27134:4;27224:18;27216:6;27213:30;27210:2;;;27246:18;;:::i;:::-;27210:2;27284:29;27306:6;27284:29;:::i;:::-;27276:37;;27368:4;27362;27358:15;27350:23;;27139:241;;;:::o;27386:308::-;27448:4;27538:18;27530:6;27527:30;27524:2;;;27560:18;;:::i;:::-;27524:2;27598:29;27620:6;27598:29;:::i;:::-;27590:37;;27682:4;27676;27672:15;27664:23;;27453:241;;;:::o;27700:132::-;27767:4;27790:3;27782:11;;27820:4;27815:3;27811:14;27803:22;;27772:60;;;:::o;27838:141::-;27887:4;27910:3;27902:11;;27933:3;27930:1;27923:14;27967:4;27964:1;27954:18;27946:26;;27892:87;;;:::o;27985:114::-;28052:6;28086:5;28080:12;28070:22;;28059:40;;;:::o;28105:98::-;28156:6;28190:5;28184:12;28174:22;;28163:40;;;:::o;28209:99::-;28261:6;28295:5;28289:12;28279:22;;28268:40;;;:::o;28314:113::-;28384:4;28416;28411:3;28407:14;28399:22;;28389:38;;;:::o;28433:184::-;28532:11;28566:6;28561:3;28554:19;28606:4;28601:3;28597:14;28582:29;;28544:73;;;;:::o;28623:168::-;28706:11;28740:6;28735:3;28728:19;28780:4;28775:3;28771:14;28756:29;;28718:73;;;;:::o;28797:169::-;28881:11;28915:6;28910:3;28903:19;28955:4;28950:3;28946:14;28931:29;;28893:73;;;;:::o;28972:148::-;29074:11;29111:3;29096:18;;29086:34;;;;:::o;29126:305::-;29166:3;29185:20;29203:1;29185:20;:::i;:::-;29180:25;;29219:20;29237:1;29219:20;:::i;:::-;29214:25;;29373:1;29305:66;29301:74;29298:1;29295:81;29292:2;;;29379:18;;:::i;:::-;29292:2;29423:1;29420;29416:9;29409:16;;29170:261;;;;:::o;29437:185::-;29477:1;29494:20;29512:1;29494:20;:::i;:::-;29489:25;;29528:20;29546:1;29528:20;:::i;:::-;29523:25;;29567:1;29557:2;;29572:18;;:::i;:::-;29557:2;29614:1;29611;29607:9;29602:14;;29479:143;;;;:::o;29628:348::-;29668:7;29691:20;29709:1;29691:20;:::i;:::-;29686:25;;29725:20;29743:1;29725:20;:::i;:::-;29720:25;;29913:1;29845:66;29841:74;29838:1;29835:81;29830:1;29823:9;29816:17;29812:105;29809:2;;;29920:18;;:::i;:::-;29809:2;29968:1;29965;29961:9;29950:20;;29676:300;;;;:::o;29982:191::-;30022:4;30042:20;30060:1;30042:20;:::i;:::-;30037:25;;30076:20;30094:1;30076:20;:::i;:::-;30071:25;;30115:1;30112;30109:8;30106:2;;;30120:18;;:::i;:::-;30106:2;30165:1;30162;30158:9;30150:17;;30027:146;;;;:::o;30179:96::-;30216:7;30245:24;30263:5;30245:24;:::i;:::-;30234:35;;30224:51;;;:::o;30281:90::-;30315:7;30358:5;30351:13;30344:21;30333:32;;30323:48;;;:::o;30377:149::-;30413:7;30453:66;30446:5;30442:78;30431:89;;30421:105;;;:::o;30532:126::-;30569:7;30609:42;30602:5;30598:54;30587:65;;30577:81;;;:::o;30664:77::-;30701:7;30730:5;30719:16;;30709:32;;;:::o;30747:154::-;30831:6;30826:3;30821;30808:30;30893:1;30884:6;30879:3;30875:16;30868:27;30798:103;;;:::o;30907:307::-;30975:1;30985:113;30999:6;30996:1;30993:13;30985:113;;;31084:1;31079:3;31075:11;31069:18;31065:1;31060:3;31056:11;31049:39;31021:2;31018:1;31014:10;31009:15;;30985:113;;;31116:6;31113:1;31110:13;31107:2;;;31196:1;31187:6;31182:3;31178:16;31171:27;31107:2;30956:258;;;;:::o;31220:320::-;31264:6;31301:1;31295:4;31291:12;31281:22;;31348:1;31342:4;31338:12;31369:18;31359:2;;31425:4;31417:6;31413:17;31403:27;;31359:2;31487;31479:6;31476:14;31456:18;31453:38;31450:2;;;31506:18;;:::i;:::-;31450:2;31271:269;;;;:::o;31546:281::-;31629:27;31651:4;31629:27;:::i;:::-;31621:6;31617:40;31759:6;31747:10;31744:22;31723:18;31711:10;31708:34;31705:62;31702:2;;;31770:18;;:::i;:::-;31702:2;31810:10;31806:2;31799:22;31589:238;;;:::o;31833:233::-;31872:3;31895:24;31913:5;31895:24;:::i;:::-;31886:33;;31941:66;31934:5;31931:77;31928:2;;;32011:18;;:::i;:::-;31928:2;32058:1;32051:5;32047:13;32040:20;;31876:190;;;:::o;32072:176::-;32104:1;32121:20;32139:1;32121:20;:::i;:::-;32116:25;;32155:20;32173:1;32155:20;:::i;:::-;32150:25;;32194:1;32184:2;;32199:18;;:::i;:::-;32184:2;32240:1;32237;32233:9;32228:14;;32106:142;;;;:::o;32254:180::-;32302:77;32299:1;32292:88;32399:4;32396:1;32389:15;32423:4;32420:1;32413:15;32440:180;32488:77;32485:1;32478:88;32585:4;32582:1;32575:15;32609:4;32606:1;32599:15;32626:180;32674:77;32671:1;32664:88;32771:4;32768:1;32761:15;32795:4;32792:1;32785:15;32812:180;32860:77;32857:1;32850:88;32957:4;32954:1;32947:15;32981:4;32978:1;32971:15;32998:102;33039:6;33090:2;33086:7;33081:2;33074:5;33070:14;33066:28;33056:38;;33046:54;;;:::o;33106:178::-;33246:30;33242:1;33234:6;33230:14;33223:54;33212:72;:::o;33290:225::-;33430:34;33426:1;33418:6;33414:14;33407:58;33499:8;33494:2;33486:6;33482:15;33475:33;33396:119;:::o;33521:167::-;33661:19;33657:1;33649:6;33645:14;33638:43;33627:61;:::o;33694:169::-;33834:21;33830:1;33822:6;33818:14;33811:45;33800:63;:::o;33869:178::-;34009:30;34005:1;33997:6;33993:14;33986:54;33975:72;:::o;34053:168::-;34193:20;34189:1;34181:6;34177:14;34170:44;34159:62;:::o;34227:155::-;34367:7;34363:1;34355:6;34351:14;34344:31;34333:49;:::o;34388:182::-;34528:34;34524:1;34516:6;34512:14;34505:58;34494:76;:::o;34576:169::-;34716:21;34712:1;34704:6;34700:14;34693:45;34682:63;:::o;34751:234::-;34891:34;34887:1;34879:6;34875:14;34868:58;34960:17;34955:2;34947:6;34943:15;34936:42;34857:128;:::o;34991:168::-;35131:20;35127:1;35119:6;35115:14;35108:44;35097:62;:::o;35165:168::-;35305:20;35301:1;35293:6;35289:14;35282:44;35271:62;:::o;35339:170::-;35479:22;35475:1;35467:6;35463:14;35456:46;35445:64;:::o;35515:166::-;35655:18;35651:1;35643:6;35639:14;35632:42;35621:60;:::o;35687:168::-;35827:20;35823:1;35815:6;35811:14;35804:44;35793:62;:::o;35861:176::-;36001:28;35997:1;35989:6;35985:14;35978:52;35967:70;:::o;36043:168::-;36183:20;36179:1;36171:6;36167:14;36160:44;36149:62;:::o;36217:178::-;36357:30;36353:1;36345:6;36341:14;36334:54;36323:72;:::o;36401:122::-;36474:24;36492:5;36474:24;:::i;:::-;36467:5;36464:35;36454:2;;36513:1;36510;36503:12;36454:2;36444:79;:::o;36529:116::-;36599:21;36614:5;36599:21;:::i;:::-;36592:5;36589:32;36579:2;;36635:1;36632;36625:12;36579:2;36569:76;:::o;36651:120::-;36723:23;36740:5;36723:23;:::i;:::-;36716:5;36713:34;36703:2;;36761:1;36758;36751:12;36703:2;36693:78;:::o;36777:122::-;36850:24;36868:5;36850:24;:::i;:::-;36843:5;36840:35;36830:2;;36889:1;36886;36879:12;36830:2;36820:79;:::o

Swarm Source

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