ETH Price: $3,391.30 (+1.85%)

Token

NoLaughTime (NLT)
 

Overview

Max Total Supply

500 NLT

Holders

93

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NLT
0xa78ae32525eae4f935925d1f20faf99738cb85e1
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:
NoLaughTime

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-24
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;
/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


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

pragma solidity ^0.8.0;
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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





// File: @openzeppelin/contracts/utils/Strings.sol
pragma solidity ^0.8.0;
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}



// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity ^0.8.0;
/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}



// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

        _balances[to] += 1;
        _owners[tokenId] = to;

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

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

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

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}





// File: @openzeppelin/contracts/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}



// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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();
    }

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

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

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

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    
    function SellingTransfert(uint256 tokenId) internal virtual {}
    /**
     * @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 && !_ownerships[tokenId].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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (to.isContract()) {
                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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
        if (address(msg.sender).isContract()) {
          SellingTransfert(tokenId);
        }
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert 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 {}
}



// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

// File: operator-filter-registry/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

// File: operator-filter-registry/src/OperatorFilterer.sol


pragma solidity ^0.8.13;
/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: operator-filter-registry/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////
/////🦔INTERFACES🦔/////////////////////
////////////////////////////////////////



pragma solidity ^0.8.12;


interface InterfaceDescriptor {
    function renderEyewear(uint256 _Eyewear) external view returns (bytes memory);
    function renderHats(uint256 _Hats, string[10] memory _listcolor) external view returns (bytes memory);
    function renderWeather(uint256 _Weather, uint256 _tokenutc) external view returns (bytes memory);
    function renderWeather1(uint256 _Weather) external view returns (bytes memory);
    function renderBackground(uint256 _background) external view returns (bytes memory);
    function renderClothes(uint256 _Clothes, string[10] memory _listcolor) external view returns (bytes memory);
    function renderEye(uint256 _Eye) external view returns (bytes memory);
    function renderBody(uint256 _Body) external view returns (bytes memory);
    function renderHairs(uint256 _hairs) external view returns (bytes memory);
    function renderFramework(uint256 _background) external view returns (bytes memory);
    function renderOther(uint256 _other) external view returns (bytes memory);
    }

// File: contracts/NoLaughTime.sol
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
// ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((


contract NoLaughTime is Ownable, ERC721A, DefaultOperatorFilterer {
  uint256 public  MAX = 10000;
  uint256 public  MAX_REROLLS = 100;
  uint256 public  MAX_REROLLS_COLOR = 100;
  uint256 public  LIMIT_MINT_TRANSACTION = 5;
  uint256 public  REROLL_PRICE = 0.008 ether;
  uint256 public  REROLL_COLOR_PRICE = 0.0025 ether;
  uint256 public  Mint_Price = 0.0012 ether;
  uint256 public  Free_Public = 1;

  uint256 public rerollsMade;
  uint256 public rerollsMadecolor;

  uint8 public saleState = 0; // 0 = DEV, 1 = OG SALE, 2 = WL SALE, 3 = SALE, 4 = CLOSED, 5= BLOCKED
  uint8 public saleStateReroll = 0; // 0 = lock , 1 = delock

  bytes32 internal _merkleRootOG;
  bytes32 internal _merkleRootWL;

  mapping(address => uint) public mintedPublicPerAddress;

  //Withdraw address
  address t1 = 0x6237e097Be19daD61303A65859f31024432CC522; //

  //Save seed for traits for each token
  mapping(uint256 => uint256) internal tokenSeed;

  //Save UTC
  mapping(uint256 => uint256) internal tokenutc;

  // changecolor
  mapping(uint256 => uint256) internal tokencolor;

  //Save account time sell
  mapping (uint256 => uint256) internal CountSellForCity; 

  //Amount minted by address in presale OG
  mapping(address => uint256) public whitelistMintsOG;

  //Amount minted by address in presale
  mapping(address => uint256) public whitelistMints;

  InterfaceDescriptor public descriptor;

  uint16[][8] rarities;
  string[][9] traitsByName;
  // Mapping from token ID to name
  mapping (uint256 => string) private _tokenName;


  //SVG-parts shared by all NoLaughTime
  string private constant svgZoom = "<style>#u45 {transition-duration: 2s;transform-origin: 35%;transform-box:fill-box;}#wt78:hover #u45 {transform: scale(1.5);}</style><g id='u45'>";
  string private constant Gend = "</g>";
  

  constructor(InterfaceDescriptor descriptor_) ERC721A("NoLaughTime", unicode"NLT") {

    // Initializing variables
    descriptor = descriptor_;

    //sum of rarities values must be equal to the mod used in _getRandomIndex, 10000 in our case
    
    rarities[0] = [
    0,
    2500,
    2500,
    2500,
    1500,
    750,
    250
    ]; //Bodys

    rarities[1] = [
      0,
      5000,
      2500,
      1500,
      650,
      250,
      100
    ]; //Weathers
    rarities[2] = [
      0,
      5000,
      1500,
      1500,
      350,
      750,
      750,
      150
    ]; //Eyewears
    rarities[3] = [
      0,
      1000,
      500,
      500,
      500,
      400,
      400,
      400,
      400,
      500,
      300,
      100,
      1200,
      1100,
      1000,
      900,
      800
    ]; //Hats
    rarities[4] = [
      0,
      1100,
      1000,
      1000,
      900,
      800,
      800,
      700,
      700,
      600,
      600,
      500,
      400,
      350,
      200,
      250,
      100
    ]; //Eyes
    rarities[5] = [
      0,
      1200,
      1000,
      1500,
      1300,
      1400,
      500,
      500,
      500,
      400,
      400,
      400,
      400,
      500
    ]; //Clothes
    rarities[6] = [
      0,
      0,
      1100,
      1000,
      1000,
      900,
      800,
      800,
      700,
      700,
      600,
      600,
      500,
      400,
      350,
      200,
      250,
      100
    ]; //hairs
    rarities[7] = [
      0,
      200,
      400,
      800,
      1000,
      1200,
      1600,
      2000,
      1600,
      1200
    ]; //temporality

    //traits
    //Bodys
    traitsByName[0] = [
      "n/a",
      "White",
      "Mestizo",
      "Black",
      "Zombie",
      "Alien",
      "Ape"
    ];
    //Weathers
    traitsByName[1] = [
      "n/a",
      "0",
      "1",
      "2",
      "3",
      "4",
      "5"
    ];
    //Eyewears
    traitsByName[2] = [
      "n/a",
      "None",
      "Mask",
      "Eye Patch",
      "3D Glasses",
      "Sunglasses",
      "Glasses",
      "Monocle"
    ];
    //Hats
    traitsByName[3] = [
      "n/a",
      "None",
      "Pilot",
      "Ninja",
      "Soccer Player",
      "Zombie",
      "Ape",
      "Alien",
      "Luffy",
      "Witch",
      "King",
      "Emperor",
      "Cap 1",
      "Cap 2",
      "Cap 3",
      "Headband",
      "Cowbow"
    ];
    //Eyes
    traitsByName[4] = [
      "n/a",
      "Black",
      "Darkest Brown",
      "Dark Brown",
      "Brown",
      "Light Brown",
      "Dark Blue",
      "Blue",
      "Light Blue",
      "Dark Green",
      "Light Green",
      "Grey",
      "Red",
      "Purple",
      "Orange",
      "Violet",
      "Pink"
    ];
    //Clothes
    traitsByName[5] = [
      "n/a",
      "Vintage Suit",
      "Suit",
      "Shirt",
      "Jersey",
      "Too Small",
      "Pilot",
      "Ninja",
      "Soccer Player",
      "Zombie",
      "Ape",
      "Alien",
      "Luffy",
      "Witch"
    ];
    //hairs
    traitsByName[6] = [
      "n/a",
      "None",
      "Black",
      "Darkest Brown",
      "Dark Brown",
      "Brown",
      "Light Brown",
      "Dark Blonde",
      "Blonde",
      "Light Blonde",
      "Very Light Blonde",
      "Grey",
      "Light Grey",
      "Red",
      "Purple",
      "Orange",
      "Violet",
      "Pink"
    ];
    //accessories
    traitsByName[7] = [
      "n/a",
      "Prehistory",
      "1789",
      "1888",
      "1906",
      "1954",
      "1968",
      "2022",
      "2050",
      "2743"
    ];

    traitsByName[8] = [
      "n/a",
      "5",
      "5",
      "5",
      "4",
      "4",
      "3",
      "3",
      "2",
      "1"
    ];
  }

  //Get the attribute name for the properties of the token by its index
  function _getTrait(uint256 _trait, uint256 index) internal view returns (string memory) {
    return traitsByName[_trait][index];
  }

  function TimeUtc(uint256 utcnb) public view returns (string memory) {
      uint256 utcid = utcnb;
      uint256 daysh = uint256(((block.timestamp + ((utcid % 24) * 3600)) % 86400) / 3600);
      uint256 daysm = uint256((block.timestamp % 3600) / 60);
      string memory apm = "";
      string memory dp =":";
      string memory utc =" (UTC+";
      if (daysh < 12) {
          apm = " AM";
          if (daysh == 0) {daysh = daysh + 12;}}
      else {
          apm = " PM";
          if (daysh > 12){daysh = daysh - 12;}}
      if (daysm < 10) {dp = ":0";}
      if (utcid > 12){utc =" (UTC-";utcid = 12-(utcid % 12);}
      return string(abi.encodePacked(uint2str(daysh),dp,uint2str(daysm),apm,utc,uint2str(utcid),")"));
  }

  function Seasons() internal view returns (string memory) {
    uint256 b = block.timestamp % 31556952;
    string memory saison = "";
    if (b < 6825600 || b > 30736152) {
      saison = "Winter";
    }
    else if (b >= 6825600 && b <= 14857200) {
      saison = "Spring";
    }
    else if (b > 14857200 && b < 22892400){
      saison = "Summer";
    }
    else {saison = "Fall";}
    return saison;
  }

  function Years() internal view returns (uint256) {
    return uint256((block.timestamp / 31556952) + 1970);
  }

  function Tiers(uint256 _TokenId) public view returns (string memory) {
    return _getTrait(8, CityValue(_TokenId));
  }

  ////////////////////////////////////////////////////////////
  /////🦔GENERATE TRAITS AND SVG BASED ON SEED🦔/////////////
  ///////////////////////////////////////////////////////////
function trait4getTraits(uint256 tokenId) internal view returns (uint16[] memory){
    uint256 seed = tokenSeed[tokenId];
    uint16[] memory randomInputs = expand(seed, 8, tokenId);
    uint16[] memory traits = new uint16[](8);

    traits[0] = getRandomIndex(rarities[0], randomInputs[0]);
    traits[1] = getRandomIndex(rarities[1], randomInputs[1]);
    traits[2] = getRandomIndex(rarities[2], randomInputs[2]);
    traits[3] = getRandomIndex(rarities[3], randomInputs[3]);
    traits[4] = getRandomIndex(rarities[4], randomInputs[4]);
    traits[5] = getRandomIndex(rarities[5], randomInputs[5]);
    traits[6] = getRandomIndex(rarities[6], randomInputs[6]);
    traits[7] = getRandomIndex(rarities[7], randomInputs[7]);

    if (traits[5] == 12) {
      traits[0] = 1;
    } // luffy white people
    if (traits[0] == 4 || traits[0] == 5 || traits[0] == 6) {
      traits[6] = 1;
    } // no hair on body no human
      if (traits[3] == 3) {
      traits[2] = 1;
    } // ninja cap, no glasses

    return traits;
}


  //Get randomized values for each different trait with a single pseudorandom seed
  // note: we are generating both traits and SVG on the fly based on the seed which is the the only parameter saved in memory
  // Not writing a whole struct allows for serious gas savings on mint, but has a downside that we can't easily address or change a single trait
  function getTraits(uint256 tokenId) internal view returns (string memory svg, string memory properties) {
    uint256 tokenId1 = tokenId;
    uint16[] memory traits = trait4getTraits(tokenId);

    // render svg
    bytes memory _svg = renderNoLaughTime(
      traits,
      tokenId
    );

    svg = base64(_svg);

    // pack properties, put 1 after the last property for JSON to be formed correctly (no comma after the last one)
    bytes memory properties1;
    properties1 = abi.encodePacked(
      packMetaData("Body", _getTrait(0, traits[0]), 0),
      packMetaData("Weather", _getTrait(1, traits[1]), 0),
      packMetaData("Eyewear", _getTrait(2, traits[2]), 0),
      packMetaData("Hats", _getTrait(3, traits[3]), 0),
      packMetaData("Eye", _getTrait(4, traits[4]), 0),
      packMetaData("Clothes", _getTrait(5, traits[5]), 0),
      packMetaData("Hairs", _getTrait(6, traits[6]), 0)
    );
    bytes memory _properties = abi.encodePacked(
      properties1,
      packMetaData("Time", TimeUtc(tokenutc[tokenId1]), 0),
      packMetaData("Season", Seasons(), 0),
      packMetaData("Tiers", _getTrait(8, CityValue(tokenId1)),0),
      packMetaData("Temporality", _getTrait(7, CityValue(tokenId1)), 1)
    );
    properties = string(abi.encodePacked(_properties));    
    return (svg, properties);
  }

  // Get a random attribute using the rarities defined
  // Shout out to Anonymice for the logic
  function getRandomIndex(
    uint16[] memory attributeRarities,
    uint256 randomNumber
  ) private pure returns (uint16 index) {
    uint16 random10k = uint16(randomNumber % 10000);
    uint16 lowerBound;
    for (uint16 i = 1; i <= attributeRarities.length; i++) {
      uint16 percentage = attributeRarities[i];

      if (random10k < percentage + lowerBound && random10k >= lowerBound) {
        return i;
      }
      lowerBound = lowerBound + percentage;
    }
    revert();
  }

  //Get attribute svg for each different property of the token
  function renderNoLaughTime(uint16[] memory _traits, uint256 _tokenId) internal view returns (bytes memory) {
    bytes memory perso = abi.encodePacked(
      svgZoom,
      descriptor.renderBody(_traits[0]),
      descriptor.renderEye(_traits[4]),
      descriptor.renderHairs(_traits[6]),
      descriptor.renderClothes(_traits[5],colorgenerate(_tokenId)),
      descriptor.renderHats(_traits[3],colorgenerate(_tokenId)),
      descriptor.renderEyewear(_traits[2]),
      Gend
    );
    return
      abi.encodePacked(
        descriptor.renderOther(1),
        descriptor.renderWeather(_traits[1], tokenutc[_tokenId]),
        descriptor.renderBackground(CityValue(_tokenId)),
        perso,
        descriptor.renderWeather1(_traits[1]),
        descriptor.renderFramework(CityValue(_tokenId)),
        descriptor.renderOther(4),
        descriptor.renderOther(5),
        descriptor.renderOther(2)
      );
  }


 //return Man
  function RenderMan(uint256 _tokenId) public view returns (bytes memory) {
    require(_tokenId <= totalSupply(), "Man not exist");
    uint16[] memory traits = trait4getTraits(_tokenId);
    return abi.encodePacked(
      descriptor.renderBody(traits[0]),
      descriptor.renderEye(traits[4]),
      descriptor.renderHairs(traits[6]),
      descriptor.renderClothes(traits[5],colorgenerate(_tokenId)),
      descriptor.renderHats(traits[3],colorgenerate(_tokenId)),
      descriptor.renderEyewear(traits[2])
    );
  }

  /////////////////////////////////////
  /////🦔GENERATE METADATA🦔//////////
  ////////////////////////////////////

  //Get the metadata for a token in base64 format
  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "Token not found");
    (string memory svg, string memory properties) = getTraits(tokenId);

    return
      string(
        abi.encodePacked(
          "data:application/json;base64,",
          base64(
            abi.encodePacked(
              '{"name":"NoLaugh #',
              uint2str(tokenId),' ',_tokenName[tokenId],
              '", "description": "NoLaughTime will live forever through the Ethereum blockchain and remain happy and free.", "traits": [',
              properties,
              '], "image":"data:image/svg+xml;base64,',
              svg,
              '"}'
            )
          )
        )
      );
  }

  // Bundle metadata so it follows the standard
  function packMetaData( string memory name, string memory svg, uint256 last ) private pure returns (bytes memory) {
    string memory comma = ",";
    if (last > 0) comma = "";
    return
      abi.encodePacked(
        '{"trait_type": "',
        name,
        '", "value": "',
        svg,
        '"}',
        comma
      );
  }

  /////////////////////////////////////
  /////🦔MINTING🦔////////////////////
  ////////////////////////////////////

    //giveaways
	function Gift(uint256 numberOfTokens, address recipient) external onlyOwner {
    uint256 supply = totalSupply();
    require(supply + numberOfTokens <= MAX, "Would exceed max supply");
    for (uint256 i = 0; i < numberOfTokens; i++) {
      tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i)));
    }
    delete supply;
    _safeMint(recipient, numberOfTokens);
  }

  //mint NoLaughTime
  function Mint(uint256 numberOfTokens) external payable {
    uint256 supply = totalSupply();
    uint256 free = mintedPublicPerAddress[msg.sender] >= Free_Public ? 0 : Free_Public - mintedPublicPerAddress[msg.sender];
    uint256 free2 = free >= numberOfTokens ? 0 : numberOfTokens - free;
    require(saleState == 3, "Sale inactive");
    require(numberOfTokens <= LIMIT_MINT_TRANSACTION, "Too many");
    require(supply + numberOfTokens <= MAX, "Would exceed max public supply");
    require(Mint_Price * free2 == msg.value, "Wrong ETH amount");
    mintedPublicPerAddress[msg.sender] += numberOfTokens;

    for (uint256 i = 0; i < numberOfTokens; i++) {
      tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i)));
    }
    delete supply;
    _safeMint(msg.sender, numberOfTokens);
  }

  //free mint, 2 per wallet, address must be whitelisted OG
  function OGMint(bytes32[] calldata proof_) external {
    uint256 supply = totalSupply();
    require(saleState == 1, "Sale inactive");
    require(supply + 2 <= MAX, "Would exceed max supply");
    require(isWhitelistedOG(msg.sender, proof_), "Not on the list");
    require(whitelistMintsOG[msg.sender] == 0, "Already minted");
    whitelistMintsOG[msg.sender]++;
    for (uint256 i = 0; i < 2; i++) {
      tokenSeed[supply + i] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply + i)));
    }
    delete supply;
    _safeMint(msg.sender, 2);
  }

  //free mint, 1 per wallet, address must be whitelisted
  function WLMint(bytes32[] calldata proof_) external {
    uint256 supply = totalSupply();
    require(saleState == 2, "Sale inactive");
    require(supply + 1 <= MAX, "Would exceed max supply");
    require(isWhitelistedWL(msg.sender, proof_), "Not on the list");
    require(whitelistMints[msg.sender] == 0, "Already minted");
    whitelistMints[msg.sender]++;
    tokenSeed[supply] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, supply)));
    delete supply;
    _safeMint(msg.sender, 1);
  }

  //rerolls a common NoLaughTime
  function Reroll(uint256 _tokenId) external payable {
    require(saleStateReroll == 1, "Reroll inactive");
    require(rerollsMade < MAX_REROLLS, "No more rerolls");
    require(msg.sender == ownerOf(_tokenId), "Only owner can reroll");
    require(REROLL_PRICE == msg.value, "Wrong ETH amount");

    rerollsMade = rerollsMade + 1;
    tokenSeed[_tokenId] = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _tokenId + 1)));
    CountSellForCity[_tokenId] = uint256(Years() - 2023);
  }

  function Reroll_Color(uint256 _tokenId) external payable {
    require(saleStateReroll == 1, "Reroll Color inactive");
    require(rerollsMadecolor < MAX_REROLLS_COLOR, "No more rerolls");
    require(msg.sender == ownerOf(_tokenId), "Only owner can reroll");
    require(REROLL_COLOR_PRICE == msg.value, "Wrong ETH amount");

    rerollsMadecolor = rerollsMadecolor + 1;
    tokencolor[_tokenId] = tokencolor[_tokenId] + 1;   
  }

  function ChangeUtc(uint256 _tokenId, uint256 _timeUtc) external {
    require(msg.sender == ownerOf(_tokenId), "Only owner can change Utc");

    tokenutc[_tokenId] = uint256(_timeUtc % 24);   
  }


  /////////////////////////////////////
  /////🦔RENAMING🦔///////////////////
  ////////////////////////////////////




   function getSlice(uint256 begin, uint256 end, string memory text) internal pure returns (string memory) {
        bytes memory a = new bytes(end-begin+1);
        for(uint i=0;i<=end-begin;i++){
            a[i] = bytes(text)[i+begin-1];
        }
        return string(a);    
      }

    // seedcolor to hexadecimal color
  function colorgenerate(uint256 _tokenId) internal view returns (string[10] memory listcolor) {
      string memory hexa = Strings.toHexString(uint256(keccak256(abi.encode(tokenSeed[_tokenId] , 50 + tokencolor[_tokenId]))), 32);
      for(uint i=0;i<=9;i++){
          listcolor[i] = string(getSlice(6*i+3,6*i+8,hexa));
      }
      return listcolor;
  }


  ///////////////////////////////////
  /////🦔ADMIN🦔////////////////////
  //////////////////////////////////



  function flipSaleState(uint8 Statevalue) public onlyOwner {
    if (saleState >= 5) {
    }
    else {saleState = Statevalue;}
  }

  function flipSaleStatereroll() external onlyOwner {
    if (saleStateReroll == 1) {
      saleStateReroll = 0;
    }
    else {saleStateReroll = 1;}
  }


  function setMaxSupply(uint256 _supply) public onlyOwner {
        MAX = _supply;
    }

  function setRerollPrice(uint256 _price) public onlyOwner {
        REROLL_PRICE = _price;
    }

  function setMaxReroll(uint256 _nb) public onlyOwner {
        MAX_REROLLS = _nb;
    }

  function setRerollPriceColor(uint256 _price) public onlyOwner {
        REROLL_COLOR_PRICE = _price;
    }

  function setMaxRerollColor(uint256 _nb) public onlyOwner {
        MAX_REROLLS_COLOR = _nb;
    }

    function setMintPrice(uint256 _price) public onlyOwner {
        Mint_Price = _price;
    }

    function setLimitMintTransaction(uint256 _maxtx) public onlyOwner {
        LIMIT_MINT_TRANSACTION = _maxtx;
    }

    function setPublicFreeNumber(uint256 _number) public onlyOwner {
        Free_Public = _number;
    }


  // Withdraw to the team according to shares
  function withdrawAll() public payable onlyOwner {
      require(payable(t1).send(address(this).balance));
    }

  function WAaddress(address newt1) public onlyOwner {
        t1 = newt1;
    }

  ///////////////////////////////////
  /////🦔HELPERS🦔//////////////////
  //////////////////////////////////


  // Check if the address is whitelisted
  function isWhitelistedOG(address account_, bytes32[] calldata proof_) public view returns (bool) {
    return _verifyOG(_leaf(account_), proof_);
  }

  function isWhitelistedWL(address account_, bytes32[] calldata proof_) public view returns (bool) {
    return _verifyWL(_leaf(account_), proof_);
  }

  // Set Merckle root
  function setMerkleRootOG(bytes32 merkleRoot_) public onlyOwner {
    _merkleRootOG = merkleRoot_;
  }

  function setMerkleRootWL(bytes32 merkleRoot_) public onlyOwner {
    _merkleRootWL = merkleRoot_;
  }

  // Encode Merckle leaf from address
  function _leaf(address account_) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(account_));
  }

  // verify proof
  function _verifyOG(bytes32 leaf_, bytes32[] memory proof_) internal view returns (bool) {
    return MerkleProof.verify(proof_, _merkleRootOG, leaf_);
  }

  function _verifyWL(bytes32 leaf_, bytes32[] memory proof_) internal view returns (bool) {
    return MerkleProof.verify(proof_, _merkleRootWL, leaf_);
  }

  ///set attributes libraries
  function setDescriptor(address source) external onlyOwner {
    descriptor = InterfaceDescriptor(source);
  }

  //generates random numbers based on a random number
  function expand(uint256 _randomNumber, uint256 n, uint256 _tokenId) private view returns (uint16[] memory expandedValues)
  {
    expandedValues = new uint16[](n);
    for (uint256 i = 0; i < n; i++) {
      if (i == 1) {
        expandedValues[i] = bytes2uint(keccak256(abi.encode(_randomNumber, i + 1, ((block.timestamp + ((uint256(tokenutc[_tokenId]) % 24) * 3600)) / 86400))));
      }
      else {expandedValues[i] = bytes2uint(keccak256(abi.encode(_randomNumber, i + 1)));}
    }
    return expandedValues;
  }

  //converts uint256 to uint16
  function bytes2uint(bytes32 _a) private pure returns (uint16) {
    return uint16(uint256(_a));
  }



  //returns number of tokens owned
  function tokensOfOwner(address address_) public virtual view returns (uint256[] memory) {
        uint256 _balance = balanceOf(address_);
        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply();
        for (uint256 i = 0; i < _loopThrough; i++) {
            bool _exists = _exists(i);
            if (_exists) {
                if (ownerOf(i) == address_) { _tokens[_index] = i; _index++; }
            }
            else if (!_exists && _tokens[_balance - 1] == 0) { _loopThrough++; }
        }
        return _tokens;
    }

  //Helper function to convert uint to string
  function uint2str(uint256 _i) internal pure returns (string memory _uintAsString)
  {
    if (_i == 0) {
      return "0";
    }
    uint256 j = _i;
    uint256 len;
    while (j != 0) {
      len++;
      j /= 10;
    }
    bytes memory bstr = new bytes(len);
    uint256 k = len;
    while (_i != 0) {
      k = k - 1;
      uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
      bytes1 b1 = bytes1(temp);
      bstr[k] = b1;
      _i /= 10;
    }
    return string(bstr);
  }



//  Base64 by Brecht Devos - <[email protected]>
//  Provides a function for encoding some bytes in base64

    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function base64(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    // modify the nft metadatas during a sale
    function SellingTransfert(uint256 tokenId) internal virtual override {
      uint256 yearsnow = Years();
      uint256 nbcity = yearsnow - CountSellForCity[tokenId] - 2013 - getRandomIndex(rarities[7], tokenSeed[tokenId]);
      if (nbcity >= 10) {
        CountSellForCity[tokenId] = CountSellForCity[tokenId] + nbcity - 8;
      }
      else if (nbcity <= 1) {
        CountSellForCity[tokenId] = CountSellForCity[tokenId];
      }
      else {CountSellForCity[tokenId] = CountSellForCity[tokenId] + 1;}
    }

    function CityValue(uint256 tokenId) internal view returns (uint256) {
      uint256 yearsnow = Years();
      uint256 nbcity = yearsnow - CountSellForCity[tokenId] - 2013 - getRandomIndex(rarities[7], tokenSeed[tokenId]);
      if (nbcity >= 10) {
        return uint256(9);
      }
      else if (nbcity <= 1) {
        return uint256(1);
      }
      else {
      return uint256(nbcity);}
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    
  //if you are reading this, you are a true blockchain nerd. Much love - @NFChuck & @Spiridono !!!
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract InterfaceDescriptor","name":"descriptor_","type":"address"}],"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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timeUtc","type":"uint256"}],"name":"ChangeUtc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Free_Public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"Gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LIMIT_MINT_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REROLLS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REROLLS_COLOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"Mint_Price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"OGMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REROLL_COLOR_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REROLL_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"RenderMan","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reroll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Reroll_Color","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_TokenId","type":"uint256"}],"name":"Tiers","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"utcnb","type":"uint256"}],"name":"TimeUtc","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newt1","type":"address"}],"name":"WAaddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"WLMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract InterfaceDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"Statevalue","type":"uint8"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatereroll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelistedOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelistedWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPublicPerAddress","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rerollsMade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rerollsMadecolor","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":"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":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStateReroll","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"source","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxtx","type":"uint256"}],"name":"setLimitMintTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nb","type":"uint256"}],"name":"setMaxReroll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nb","type":"uint256"}],"name":"setMaxRerollColor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_number","type":"uint256"}],"name":"setPublicFreeNumber","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setRerollPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setRerollPriceColor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintsOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526127106009556064600a819055600b556005600c55661c6bf526340000600d556608e1bc9bf04000600e5566044364c5bb0000600f5560016010556013805461ffff19169055601780546001600160a01b031916736237e097be19dad61303a65859f31024432cc5221790553480156200007d57600080fd5b506040516200760f3803806200760f833981016040819052620000a091620018dd565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020016a4e6f4c6175676854696d6560a81b8152506040518060400160405280600381526020016213931560ea1b815250620001116200010b620014db60201b60201c565b620014df565b8151620001269060039060208501906200152f565b5080516200013c9060049060208401906200152f565b50600060015550506daaeb6d7670e522a718067333cd4e3b1562000289578015620001d757604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001b857600080fd5b505af1158015620001cd573d6000803e3d6000fd5b5050505062000289565b6001600160a01b03821615620002285760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200019d565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050505b5050601e80546001600160a01b0319166001600160a01b0383161790556040805160e081018252600081526109c46020820181905291810182905260608101919091526105dc60808201526102ee60a082015260fa60c0820152620002f390601f906007620015be565b506040805160e0810182526000815261138860208201526109c4918101919091526105dc606082015261028a608082015260fa60a0820152606460c0820152601f600162000346929101906007620015be565b5060408051610100810182526000815261138860208201526105dc918101829052606081019190915261015e60808201526102ee60a0820181905260c0820152609660e08201526200039d906021906008620015be565b506040805161022081018252600081526103e8602082018190526101f4928201839052606082018390526080820183905261019060a0830181905260c0830181905260e0830181905261010083015261012082019290925261012c61014082015260646101608201526104b061018082015261044c6101a08201526101c08101919091526103846101e082015261032061020082015262000443906022906011620015be565b5060408051610220810182526000815261044c60208201526103e89181018290526060810191909152610384608082015261032060a0820181905260c08201526102bc60e0820181905261010082015261025861012082018190526101408201526101f461016082015261019061018082015261015e6101a082015260c86101c082015260fa6101e08201526064610200820152620004e7906023906011620015be565b50604080516101c081018252600081526104b060208201526103e8918101919091526105dc6060820152610514608082015261057860a08201526101f460c0820181905260e0820181905261010082018190526101906101208301819052610140830181905261016083018190526101808301526101a08201526200057190602490600e620015be565b5060408051610240810182526000808252602082015261044c918101919091526103e860608201819052608082015261038460a082015261032060c0820181905260e08201526102bc610100820181905261012082015261025861014082018190526101608201526101f46101808201526101906101a082015261015e6101c082015260c86101e082015260fa61020082015260646102208201526200061c906025906012620015be565b5060408051610140810182526000815260c860208201526101909181019190915261032060608201526103e860808201526104b060a0820181905261064060c083018190526107d060e08401526101008301526101208201526200068590602690600a620015be565b506040805161012081018252600360e08201818152626e2f6160e81b610100840152825282518084018452600580825264576869746560d81b602083810191909152808501929092528451808601865260078152664d657374697a6f60c81b81840152848601528451808601865281815264426c61636b60d81b8184015260608501528451808601865260068152655a6f6d62696560d01b818401526080850152845180860186529081526420b634b2b760d91b8183015260a084015283518085019094529083526241706560e81b9083015260c0810191909152602760006200077492910190600762001669565b506040805161012081018252600360e08201908152626e2f6160e81b6101008301528152815180830183526001808252600360fc1b6020808401919091528084019290925283518085018552818152603160f81b818401528385015283518085018552818152601960f91b81840152606084015283518085018552818152603360f81b81840152608084015283518085018552818152600d60fa1b8184015260a084015283518085019094528352603560f81b9083015260c08101919091526200084390602890600762001669565b50604080516101408101825260036101008201908152626e2f6160e81b6101208301528152815180830183526004808252634e6f6e6560e01b6020808401919091528084019290925283518085018552908152634d61736b60e01b818301528284015282518084018452600981526808af2ca40a0c2e8c6d60bb1b81830152606083015282518084018452600a80825269334420476c617373657360b01b828401526080840191909152835180850185529081526953756e676c617373657360b01b8183015260a083015282518084018452600780825266476c617373657360c81b8284015260c084019190915283518085019094528352664d6f6e6f636c6560c81b9083015260e081019190915262000962906029906008620016c9565b50604080516102608101825260036102208201818152626e2f6160e81b6102408401528252825180840184526004808252634e6f6e6560e01b6020838101919091528085019290925284518086018652600580825264141a5b1bdd60da1b828501528587019190915285518087018752818152644e696e6a6160d81b81850152606086015285518087018752600d81526c29b7b1b1b2b910283630bcb2b960991b818501526080860152855180870187526006808252655a6f6d62696560d01b8286015260a0870191909152865180880188528581526241706560e81b8186015260c0870152865180880188528281526420b634b2b760d91b8186015260e087015286518088018852828152644c7566667960d81b8186015261010087015286518088018852828152640aed2e8c6d60db1b8186015261012087015286518088018852928352634b696e6760e01b8385015261014086019290925285518087018752600781526622b6b832b937b960c91b818501526101608601528551808701875281815264436170203160d81b81850152610180860152855180870187528181526421b0b8101960d91b818501526101a08601528551808701875290815264436170203360d81b818401526101c08501528451808601865260088152671219585918985b9960c21b818401526101e08501528451808601909552845265436f77626f7760d01b908401526102008201929092529060279062000b8a9291019060116200171b565b50604080516102608101825260036102208201818152626e2f6160e81b610240840152825282518084018452600580825264426c61636b60d81b6020808401919091528085019290925284518086018652600d81526c2230b935b2b9ba10213937bbb760991b818401528486015284518086018652600a808252692230b93590213937bbb760b11b8285015260608601919091528551808701875291825264213937bbb760d91b82840152608085019190915284518086018652600b8082526a2634b3b43a10213937bbb760a91b8285015260a08601919091528551808701875260098152684461726b20426c756560b81b8185015260c086015285518087018752600480825263426c756560e01b8286015260e087019190915286518088018852838152694c6967687420426c756560b01b8186015261010087015286518088018852928352692230b9359023b932b2b760b11b83850152610120860192909252855180870187529081526a2634b3b43a1023b932b2b760a91b8184015261014085015284518086018652818152634772657960e01b81840152610160850152845180860186529283526214995960ea1b8383015261018084019290925283518085018552600680825265507572706c6560d01b828401526101a085019190915284518086018652818152654f72616e676560d01b818401526101c08501528451808601865290815265159a5bdb195d60d21b818301526101e084015283518085019094529083526350696e6b60e01b9083015261020081019190915262000dd890602b9060116200171b565b50604080516102008101825260036101c08201818152626e2f6160e81b6101e0840152825282518084018452600c81526b159a5b9d1859d94814dd5a5d60a21b6020808301919091528084019190915283518085018552600481526314dd5a5d60e21b81830152838501528351808501855260058082526414da1a5c9d60da1b828401526060850191909152845180860186526006808252654a657273657960d01b828501526080860191909152855180870187526009815268151bdbc814db585b1b60ba1b8185015260a08601528551808701875282815264141a5b1bdd60da1b8185015260c086015285518087018752828152644e696e6a6160d81b8185015260e086015285518087018752600d81526c29b7b1b1b2b910283630bcb2b960991b8185015261010086015285518087018752908152655a6f6d62696560d01b81840152610120850152845180860186529283526241706560e81b83830152610140840192909252835180850185528281526420b634b2b760d91b8183015261016084015283518085018552828152644c7566667960d81b818301526101808401528351808501909452908352640aed2e8c6d60db1b908301526101a081019190915262000fac90602c90600e6200176d565b50604080516102808101825260036102408201818152626e2f6160e81b6102608401528252825180840184526004808252634e6f6e6560e01b6020838101919091528085019290925284518086018652600580825264426c61636b60d81b828501528587019190915285518087018752600d81526c2230b935b2b9ba10213937bbb760991b81850152606086015285518087018752600a808252692230b93590213937bbb760b11b8286015260808701919091528651808801885291825264213937bbb760d91b8285015260a086019190915285518087018752600b8082526a2634b3b43a10213937bbb760a91b8286015260c0870191909152865180880188529081526a4461726b20426c6f6e646560a81b8185015260e086015285518087018752600680825265426c6f6e646560d01b8286015261010087019190915286518088018852600c81526b4c6967687420426c6f6e646560a01b8186015261012087015286518088018852601181527056657279204c6967687420426c6f6e646560781b8186015261014087015286518088018852838152634772657960e01b8186015261016087015286518088018852918252694c69676874204772657960b01b82850152610180860191909152855180870187529384526214995960ea1b848401526101a08501939093528451808601865283815265507572706c6560d01b818401526101c085015284518086018652838152654f72616e676560d01b818401526101e08501528451808601865283815265159a5bdb195d60d21b81840152610200850152845180860190955284526350696e6b60e01b908401526102208201929092529060279062001226929101906012620017bf565b50604080516101808101825260036101408201908152626e2f6160e81b610160830152815281518083018352600a815269507265686973746f727960b01b60208281019190915280830191909152825180840184526004808252633137383960e01b828401528385019190915283518085018552818152630627070760e31b8184015260608401528351808501855281815263189c981b60e11b81840152608084015283518085018552818152630c4e4d4d60e21b8184015260a08401528351808501855281815263062726c760e31b8184015260c084015283518085018552818152631918191960e11b8184015260e084015283518085018552818152630323035360e41b8184015261010084015283518085019094528352633237343360e01b90830152610120810191909152602760076200136992910190600a62001811565b50604051806101400160405280604051806040016040528060038152602001626e2f6160e81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001603560f81b8152508152602001604051806040016040528060018152602001600d60fa1b8152508152602001604051806040016040528060018152602001600d60fa1b8152508152602001604051806040016040528060018152602001603360f81b8152508152602001604051806040016040528060018152602001603360f81b8152508152602001604051806040016040528060018152602001601960f91b8152508152602001604051806040016040528060018152602001603160f81b8152508152506027600860098110620014c357620014c36200190f565b620014d392910190600a62001811565b505062001961565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200153d9062001925565b90600052602060002090601f016020900481019282620015615760008555620015ac565b82601f106200157c57805160ff1916838001178555620015ac565b82800160010185558215620015ac579182015b82811115620015ac5782518255916020019190600101906200158f565b50620015ba92915062001863565b5090565b82805482825590600052602060002090600f01601090048101928215620015ac5791602002820160005b838211156200162a57835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302620015e8565b80156200165a5782816101000a81549061ffff02191690556002016020816001010492830192600103026200162a565b5050620015ba92915062001863565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620016aa9184916020909101906200152f565b50916020019190600101906200168a565b50620015ba9291506200187a565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb57825180516200170a9184916020909101906200152f565b5091602001919060010190620016ea565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb57825180516200175c9184916020909101906200152f565b50916020019190600101906200173c565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620017ae9184916020909101906200152f565b50916020019190600101906200178e565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620018009184916020909101906200152f565b5091602001919060010190620017e0565b828054828255906000526020600020908101928215620016bb579160200282015b82811115620016bb5782518051620018529184916020909101906200152f565b509160200191906001019062001832565b5b80821115620015ba576000815560010162001864565b80821115620015ba5760006200189182826200189b565b506001016200187a565b508054620018a99062001925565b6000825580601f10620018ba575050565b601f016020900490600052602060002090810190620018da919062001863565b50565b600060208284031215620018f057600080fd5b81516001600160a01b03811681146200190857600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200193a57607f821691505b6020821081036200195b57634e487b7160e01b600052602260045260246000fd5b50919050565b615c9e80620019716000396000f3fe6080604052600436106103ac5760003560e01c806370a08231116101e7578063ad3e31b71161010d578063d49d5181116100a0578063f489e4961161006f578063f489e49614610aaf578063f4a0a52814610acf578063fd074a4814610aef578063fec4f63114610b0457600080fd5b8063d49d518114610a39578063dc610b1414610a4f578063e985e9c514610a6f578063f2fde38b14610a8f57600080fd5b8063baff1acc116100dc578063baff1acc146109d0578063bf3952d7146109e3578063c2428ef714610a03578063c87b56dd14610a1957600080fd5b8063ad3e31b71461095a578063af8063241461097a578063b7e7da6a1461099a578063b88d4fde146109b057600080fd5b80638e8fac9511610185578063a22cb46511610154578063a22cb465146108e4578063a58fdc1114610904578063a647f0cf14610924578063a74e807d1461093a57600080fd5b80638e8fac95146108835780639394d545146108a357806395d89b41146108b95780639f51758e146108ce57600080fd5b806382853eff116101c157806382853eff146108105780638462151c14610830578063853828b61461085d5780638da5cb5b1461086557600080fd5b806370a08231146107ae578063715018a6146107ce5780637fb66e22146107e357600080fd5b8063303e74df116102d757806342842e0e1161026a5780636352211e116102395780636352211e1461072e57806368ccfb871461074e5780636bee32641461076e5780636f8b44b01461078e57600080fd5b806342842e0e146106a75780634e8461cc146106c7578063578502ca146106f4578063603f4d521461071457600080fd5b80633ab2616d116102a65780633ab2616d1461062f5780633d5810e6146106455780633f794f251461066557806341f434341461068557600080fd5b8063303e74df146105ab57806334452fc9146105cb57806334b2196b146105de57806338e71675146105fe57600080fd5b806308d49f821161034f57806318160ddd1161031e57806318160ddd146105465780631a99dbb51461055f57806323b872dd14610575578063240c387c1461059557600080fd5b806308d49f82146104d0578063095ea7b3146104e65780630f2cc11d1461050657806312e7a1bf1461052657600080fd5b806301ffc9a71161038b57806301ffc9a71461043357806306fdde03146104635780630788370314610485578063081812fc1461049857600080fd5b80628af2e6146103b15780630186d137146103f157806301b9a39714610413575b600080fd5b3480156103bd57600080fd5b506103de6103cc366004614d40565b601d6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614da6565b610b24565b005b34801561041f57600080fd5b5061041161042e366004614d40565b610ccf565b34801561043f57600080fd5b5061045361044e366004614dfd565b610d1b565b60405190151581526020016103e8565b34801561046f57600080fd5b50610478610d6d565b6040516103e89190614e72565b610411610493366004614e85565b610dff565b3480156104a457600080fd5b506104b86104b3366004614e85565b611006565b6040516001600160a01b0390911681526020016103e8565b3480156104dc57600080fd5b506103de600a5481565b3480156104f257600080fd5b50610411610501366004614e9e565b61104a565b34801561051257600080fd5b50610453610521366004614ec8565b6110d2565b34801561053257600080fd5b50610411610541366004614f1a565b611121565b34801561055257600080fd5b50600254600154036103de565b34801561056b57600080fd5b506103de600b5481565b34801561058157600080fd5b50610411610590366004614f3d565b61116e565b3480156105a157600080fd5b506103de600e5481565b3480156105b757600080fd5b50601e546104b8906001600160a01b031681565b6104116105d9366004614e85565b611193565b3480156105ea57600080fd5b506104116105f9366004614f79565b6112ea565b34801561060a57600080fd5b5060135461061d90610100900460ff1681565b60405160ff90911681526020016103e8565b34801561063b57600080fd5b506103de60105481565b34801561065157600080fd5b50610478610660366004614e85565b611374565b34801561067157600080fd5b50610411610680366004614e85565b6117a6565b34801561069157600080fd5b506104b86daaeb6d7670e522a718067333cd4e81565b3480156106b357600080fd5b506104116106c2366004614f3d565b6117d5565b3480156106d357600080fd5b506103de6106e2366004614d40565b601c6020526000908152604090205481565b34801561070057600080fd5b5061041161070f366004614e85565b6117fa565b34801561072057600080fd5b5060135461061d9060ff1681565b34801561073a57600080fd5b506104b8610749366004614e85565b611829565b34801561075a57600080fd5b50610411610769366004614d40565b61183b565b34801561077a57600080fd5b50610411610789366004614e85565b611887565b34801561079a57600080fd5b506104116107a9366004614e85565b6118b6565b3480156107ba57600080fd5b506103de6107c9366004614d40565b6118e5565b3480156107da57600080fd5b50610411611933565b3480156107ef57600080fd5b506103de6107fe366004614d40565b60166020526000908152604090205481565b34801561081c57600080fd5b5061041161082b366004614da6565b611969565b34801561083c57600080fd5b5061085061084b366004614d40565b611ac8565b6040516103e89190614f9b565b610411611c01565b34801561087157600080fd5b506000546001600160a01b03166104b8565b34801561088f57600080fd5b5061041161089e366004614e85565b611c5c565b3480156108af57600080fd5b506103de600c5481565b3480156108c557600080fd5b50610478611c8b565b3480156108da57600080fd5b506103de600d5481565b3480156108f057600080fd5b506104116108ff366004614fed565b611c9a565b34801561091057600080fd5b5061041161091f366004614e85565b611d2f565b34801561093057600080fd5b506103de60115481565b34801561094657600080fd5b50610411610955366004614e85565b611d5e565b34801561096657600080fd5b50610411610975366004614e85565b611d8d565b34801561098657600080fd5b50610411610995366004615024565b611dbc565b3480156109a657600080fd5b506103de600f5481565b3480156109bc57600080fd5b506104116109cb3660046150bd565b611ea4565b6104116109de366004614e85565b611ed1565b3480156109ef57600080fd5b506104786109fe366004614e85565b612061565b348015610a0f57600080fd5b506103de60125481565b348015610a2557600080fd5b50610478610a34366004614e85565b612076565b348015610a4557600080fd5b506103de60095481565b348015610a5b57600080fd5b50610453610a6a366004614ec8565b61213b565b348015610a7b57600080fd5b50610453610a8a366004615167565b612182565b348015610a9b57600080fd5b50610411610aaa366004614d40565b6121b0565b348015610abb57600080fd5b50610411610aca366004614e85565b612248565b348015610adb57600080fd5b50610411610aea366004614e85565b612277565b348015610afb57600080fd5b506104116122a6565b348015610b1057600080fd5b50610478610b1f366004614e85565b612300565b6000610b336002546001540390565b60135490915060ff16600114610b645760405162461bcd60e51b8152600401610b5b90615191565b60405180910390fd5b600954610b728260026151ce565b1115610b905760405162461bcd60e51b8152600401610b5b906151e6565b610b9b3384846110d2565b610bd95760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601c602052604090205415610c275760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601c60205260408120805491610c428361521d565b919050555060005b6002811015610cba574233610c5f83856151ce565b604051602001610c7193929190615236565b60408051601f19818403018152919052805160209091012060186000610c9784866151ce565b815260208101919091526040016000205580610cb28161521d565b915050610c4a565b5060009050610cca3360026124cf565b505050565b6000546001600160a01b03163314610cf95760405162461bcd60e51b8152600401610b5b9061525e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610d4c57506001600160e01b03198216635b5e139f60e01b145b80610d6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610d7c90615293565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890615293565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000610e0e6002546001540390565b60105433600090815260166020526040812054929350911015610e4d5733600090815260166020526040902054601054610e4891906152cd565b610e50565b60005b9050600083821015610e6b57610e6682856152cd565b610e6e565b60005b60135490915060ff16600314610e965760405162461bcd60e51b8152600401610b5b90615191565b600c54841115610ed35760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610b5b565b600954610ee085856151ce565b1115610f2e5760405162461bcd60e51b815260206004820152601e60248201527f576f756c6420657863656564206d6178207075626c696320737570706c7900006044820152606401610b5b565b3481600f54610f3d91906152e4565b14610f5a5760405162461bcd60e51b8152600401610b5b90615303565b3360009081526016602052604081208054869290610f799084906151ce565b90915550600090505b84811015610ff1574233610f9683876151ce565b604051602001610fa893929190615236565b60408051601f19818403018152919052805160209091012060186000610fce84886151ce565b815260208101919091526040016000205580610fe98161521d565b915050610f82565b506000925061100033856124cf565b50505050565b6000611011826124ed565b61102e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061105582611829565b9050806001600160a01b0316836001600160a01b0316036110895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906110a957506110a78133612182565b155b156110c7576040516367d9dca160e11b815260040160405180910390fd5b610cca838383612519565b60006111196110e085612575565b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506125b492505050565b949350505050565b6000546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610b5b9061525e565b601354600560ff909116101561116b576013805460ff191660ff83161790555b50565b826001600160a01b038116331461118857611188336125ca565b611000848484612683565b60135460ff610100909104166001146111e65760405162461bcd60e51b81526020600482015260156024820152745265726f6c6c20436f6c6f7220696e61637469766560581b6044820152606401610b5b565b600b546012541061122b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b61123481611829565b6001600160a01b0316336001600160a01b03161461128c5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600e54146112ad5760405162461bcd60e51b8152600401610b5b90615303565b6012546112bb9060016151ce565b6012556000818152601a60205260409020546112d89060016151ce565b6000918252601a602052604090912055565b6112f382611829565b6001600160a01b0316336001600160a01b0316146113535760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e206368616e676520557463000000000000006044820152606401610b5b565b61135e601882615343565b6000928352601960205260409092209190915550565b60606113836002546001540390565b8211156113c25760405162461bcd60e51b815260206004820152600d60248201526c13585b881b9bdd08195e1a5cdd609a1b6044820152606401610b5b565b60006113cd8361268e565b601e5481519192506001600160a01b031690631020bb629083906000906113f6576113f6615357565b60200260200101516040518263ffffffff1660e01b8152600401611424919061ffff91909116815260200190565b600060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611469919081019061536d565b601e5482516001600160a01b039091169063b7fd9bfe908490600490811061149357611493615357565b60200260200101516040518263ffffffff1660e01b81526004016114c1919061ffff91909116815260200190565b600060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611506919081019061536d565b601e5483516001600160a01b0390911690637760d266908590600690811061153057611530615357565b60200260200101516040518263ffffffff1660e01b815260040161155e919061ffff91909116815260200190565b600060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a3919081019061536d565b601e5484516001600160a01b03909116906369e2321390869060059081106115cd576115cd615357565b60200260200101516115de89612dc5565b6040518363ffffffff1660e01b81526004016115fb9291906153e3565b600060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611640919081019061536d565b601e5485516001600160a01b0390911690633bf9045c908790600390811061166a5761166a615357565b602002602001015161167b8a612dc5565b6040518363ffffffff1660e01b81526004016116989291906153e3565b600060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116dd919081019061536d565b601e5486516001600160a01b03909116906353dbb7c7908890600290811061170757611707615357565b60200260200101516040518263ffffffff1660e01b8152600401611735919061ffff91909116815260200190565b600060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177a919081019061536d565b60405160200161178f9695949392919061545b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146117d05760405162461bcd60e51b8152600401610b5b9061525e565b601055565b826001600160a01b03811633146117ef576117ef336125ca565b611000848484612e9b565b6000546001600160a01b031633146118245760405162461bcd60e51b8152600401610b5b9061525e565b600a55565b600061183482612eb6565b5192915050565b6000546001600160a01b031633146118655760405162461bcd60e51b8152600401610b5b9061525e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b15760405162461bcd60e51b8152600401610b5b9061525e565b600b55565b6000546001600160a01b031633146118e05760405162461bcd60e51b8152600401610b5b9061525e565b600955565b60006001600160a01b03821661190e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b0316331461195d5760405162461bcd60e51b8152600401610b5b9061525e565b6119676000612fd0565b565b60006119786002546001540390565b60135490915060ff166002146119a05760405162461bcd60e51b8152600401610b5b90615191565b6009546119ae8260016151ce565b11156119cc5760405162461bcd60e51b8152600401610b5b906151e6565b6119d733848461213b565b611a155760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601d602052604090205415611a635760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601d60205260408120805491611a7e8361521d565b9190505550423382604051602001611a9893929190615236565b60408051601f19818403018152918152815160209283012060009384526018909252822055610cca3360016124cf565b60606000611ad5836118e5565b90506000816001600160401b03811115611af157611af1615050565b604051908082528060200260200182016040528015611b1a578160200160208202803683370190505b509050600080611b2d6002546001540390565b905060005b81811015611bf6576000611b45826124ed565b90508015611b9f57876001600160a01b0316611b6083611829565b6001600160a01b031603611b9a5781858581518110611b8157611b81615357565b602090810291909101015283611b968161521d565b9450505b611be3565b80158015611bd0575084611bb46001886152cd565b81518110611bc457611bc4615357565b60200260200101516000145b15611be35782611bdf8161521d565b9350505b5080611bee8161521d565b915050611b32565b509195945050505050565b6000546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610b5b9061525e565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505061196757600080fd5b6000546001600160a01b03163314611c865760405162461bcd60e51b8152600401610b5b9061525e565b600e55565b606060048054610d7c90615293565b336001600160a01b03831603611cc35760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611d595760405162461bcd60e51b8152600401610b5b9061525e565b601455565b6000546001600160a01b03163314611d885760405162461bcd60e51b8152600401610b5b9061525e565b600c55565b6000546001600160a01b03163314611db75760405162461bcd60e51b8152600401610b5b9061525e565b601555565b6000546001600160a01b03163314611de65760405162461bcd60e51b8152600401610b5b9061525e565b6000611df56002546001540390565b600954909150611e0584836151ce565b1115611e235760405162461bcd60e51b8152600401610b5b906151e6565b60005b83811015611e95574233611e3a83856151ce565b604051602001611e4c93929190615236565b60408051601f19818403018152919052805160209091012060186000611e7284866151ce565b815260208101919091526040016000205580611e8d8161521d565b915050611e26565b5060009050610cca82846124cf565b836001600160a01b0381163314611ebe57611ebe336125ca565b611eca85858585613020565b5050505050565b60135460ff61010090910416600114611f1e5760405162461bcd60e51b815260206004820152600f60248201526e5265726f6c6c20696e61637469766560881b6044820152606401610b5b565b600a5460115410611f635760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b611f6c81611829565b6001600160a01b0316336001600160a01b031614611fc45760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600d5414611fe55760405162461bcd60e51b8152600401610b5b90615303565b601154611ff39060016151ce565b60115542336120038360016151ce565b60405160200161201593929190615236565b60408051601f198184030181529181528151602092830120600084815260189093529120556107e761204561306b565b61204f91906152cd565b6000918252601b602052604090912055565b6060610d6760086120718461308c565b613190565b6060612081826124ed565b6120bf5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610b5b565b6000806120cb84613252565b915091506121136120db85613573565b60008681526030602090815260409182902091516120ff93929186918891016154da565b60405160208183030381529060405261369e565b60405160200161212391906156b5565b60405160208183030381529060405292505050919050565b600061111961214985612575565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061380492505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121da5760405162461bcd60e51b8152600401610b5b9061525e565b6001600160a01b03811661223f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5b565b61116b81612fd0565b6000546001600160a01b031633146122725760405162461bcd60e51b8152600401610b5b9061525e565b600d55565b6000546001600160a01b031633146122a15760405162461bcd60e51b8152600401610b5b9061525e565b600f55565b6000546001600160a01b031633146122d05760405162461bcd60e51b8152600401610b5b9061525e565b601354610100900460ff166001036122ef576013805461ff0019169055565b6013805461ff001916610100179055565b6060816000610e1062015180612317601885615343565b61232390610e106152e4565b61232d90426151ce565b6123379190615343565b61234191906156fa565b90506000603c612353610e1042615343565b61235d91906156fa565b6040805160208082018352600082528251808401845260018152601d60f91b818301528351808501909452600684526520285554432b60d01b918401919091529293509190600c8510156123e4576040518060400160405280600381526020016220414d60e81b8152509250846000036123df576123dc85600c6151ce565b94505b612419565b6040518060400160405280600381526020016220504d60e81b8152509250600c85111561241957612416600c866152cd565b94505b600a841015612440576040518060400160405280600281526020016103a360f41b81525091505b600c861115612480575060408051808201909152600681526520285554432d60d01b6020820152612472600c87615343565b61247d90600c6152cd565b95505b61248985613573565b8261249386613573565b858461249e8b613573565b6040516020016124b39695949392919061570e565b6040516020818303038152906040529650505050505050919050565b6124e9828260405180602001604052806000815250613813565b5050565b600060015482108015610d67575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60006125c382601454856139d9565b9392505050565b6daaeb6d7670e522a718067333cd4e3b1561116b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190615796565b61116b57604051633b79c77360e21b81526001600160a01b0382166004820152602401610b5b565b610cca8383836139ef565b6000818152601860205260408120546060916126ac82600886613be5565b60408051600880825261012082019092529192506000919060208201610100803683375050601f80546040805160208084028201810190925282815294955061277194935083018282801561274857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161270f5790505b50505050508360008151811061276057612760615357565b602002602001015161ffff16613d57565b8160008151811061278457612784615357565b61ffff92909216602092830291909101820152805460408051828402810184019091528181526128209290918282018282801561280857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127cf5790505b50505050508360018151811061276057612760615357565b8160018151811061283357612833615357565b61ffff929092166020928302919091018201526021805460408051828502810185019091528181526128d293909291908301828280156128ba57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116128815790505b50505050508360028151811061276057612760615357565b816002815181106128e5576128e5615357565b61ffff92909216602092830291909101820152602280546040805182850281018501909152818152612984939092919083018282801561296c57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129335790505b50505050508360038151811061276057612760615357565b8160038151811061299757612997615357565b61ffff92909216602092830291909101820152602380546040805182850281018501909152818152612a369390929190830182828015612a1e57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129e55790505b50505050508360048151811061276057612760615357565b81600481518110612a4957612a49615357565b61ffff92909216602092830291909101820152602480546040805182850281018501909152818152612ae89390929190830182828015612ad057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612a975790505b50505050508360058151811061276057612760615357565b81600581518110612afb57612afb615357565b61ffff92909216602092830291909101820152602580546040805182850281018501909152818152612b9a9390929190830182828015612b8257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b495790505b50505050508360068151811061276057612760615357565b81600681518110612bad57612bad615357565b61ffff92909216602092830291909101820152602680546040805182850281018501909152818152612c4c9390929190830182828015612c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612bfb5790505b50505050508360078151811061276057612760615357565b81600781518110612c5f57612c5f615357565b602002602001019061ffff16908161ffff168152505080600581518110612c8857612c88615357565b602002602001015161ffff16600c03612cc757600181600081518110612cb057612cb0615357565b602002602001019061ffff16908161ffff16815250505b80600081518110612cda57612cda615357565b602002602001015161ffff1660041480612d12575080600081518110612d0257612d02615357565b602002602001015161ffff166005145b80612d3b575080600081518110612d2b57612d2b615357565b602002602001015161ffff166006145b15612d6c57600181600681518110612d5557612d55615357565b602002602001019061ffff16908161ffff16815250505b80600381518110612d7f57612d7f615357565b602002602001015161ffff1660030361111957600181600281518110612da757612da7615357565b602002602001019061ffff16908161ffff1681525050949350505050565b612dcd614cfc565b600082815260186020908152604080832054601a909252822054612e299190612df79060326151ce565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6020613dfb565b905060005b60098111612e9457612e6b612e448260066152e4565b612e4f9060036151ce565b612e5a8360066152e4565b612e659060086151ce565b84613f96565b8382600a8110612e7d57612e7d615357565b602002015280612e8c8161521d565b915050612e2e565b5050919050565b610cca83838360405180602001604052806000815250611ea4565b604080516060810182526000808252602082018190529181019190915281600154811015612fb757600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612fb55780516001600160a01b031615612f4c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612fb0579392505050565b612f4c565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61302b8484846139ef565b6001600160a01b0383163b1515801561304d575061304b84848484614073565b155b15611000576040516368d2bf6b60e11b815260040160405180910390fd5b600061307b6301e18558426156fa565b613087906107b26151ce565b905090565b60008061309761306b565b90506000613130601f60070180548060200260200160405190810160405280929190818152602001828054801561311557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116130dc5790505b5050506000888152601860205260409020549150613d579050565b61ffff166107dd601b6000878152602001908152602001600020548461315691906152cd565b61316091906152cd565b61316a91906152cd565b9050600a811061317e575060099392505050565b600181116125c3575060019392505050565b6060602783600981106131a5576131a5615357565b0182815481106131b7576131b7615357565b9060005260206000200180546131cc90615293565b80601f01602080910402602001604051908101604052809291908181526020018280546131f890615293565b80156132455780601f1061321a57610100808354040283529160200191613245565b820191906000526020600020905b81548152906001019060200180831161322857829003601f168201915b5050505050905092915050565b6060808260006132618261268e565b9050600061326f828761415e565b905061327a8161369e565b945060606132ce60405180604001604052806004815260200163426f647960e01b8152506132c76000866000815181106132b6576132b6615357565b602002602001015161ffff16613190565b60006149ab565b613309604051806040016040528060078152602001662bb2b0ba3432b960c91b8152506132c76001876001815181106132b6576132b6615357565b6133446040518060400160405280600781526020016622bcb2bbb2b0b960c91b8152506132c76002886002815181106132b6576132b6615357565b61337c604051806040016040528060048152602001634861747360e01b8152506132c76003896003815181106132b6576132b6615357565b6133b36040518060400160405280600381526020016245796560e81b8152506132c760048a6004815181106132b6576132b6615357565b6133ee60405180604001604052806007815260200166436c6f7468657360c81b8152506132c760058b6005815181106132b6576132b6615357565b61342760405180604001604052806005815260200164486169727360d81b8152506132c760068c6006815181106132b6576132b6615357565b60405160200161343d97969594939291906157b3565b604051602081830303815290604052905060008161348d6040518060400160405280600481526020016354696d6560e01b8152506132c7601960008a815260200190815260200160002054612300565b6134b76040518060400160405280600681526020016529b2b0b9b7b760d11b8152506132c7614a0b565b6134e660405180604001604052806005815260200164546965727360d81b8152506132c760086120718c61308c565b6135226040518060400160405280600b81526020016a54656d706f72616c69747960a81b81525061351b60076120718d61308c565b60016149ab565b604051602001613536959493929190615845565b60405160208183030381529060405290508060405160200161355891906158b0565b60405160208183030381529060405295505050505050915091565b60608160000361359a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135c457806135ae8161521d565b91506135bd9050600a836156fa565b915061359e565b6000816001600160401b038111156135de576135de615050565b6040519080825280601f01601f191660200182016040528015613608576020820181803683370190505b509050815b85156136955761361e6001826152cd565b9050600061362d600a886156fa565b61363890600a6152e4565b61364290886152cd565b61364d9060306158cc565b905060008160f81b90508084848151811061366a5761366a615357565b60200101906001600160f81b031916908160001a90535061368c600a896156fa565b9750505061360d565b50949350505050565b606081516000036136bd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615c2960409139905060006003845160026136ec91906151ce565b6136f691906156fa565b6137019060046152e4565b905060006137108260206151ce565b6001600160401b0381111561372757613727615050565b6040519080825280601f01601f191660200182016040528015613751576020820181803683370190505b509050818152600183018586518101602084015b818310156137bf5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613765565b6003895106600181146137d957600281146137ea576137f6565b613d3d60f01b6001198301526137f6565b603d60f81b6000198301525b509398975050505050505050565b60006125c382601554856139d9565b6001546001600160a01b03841661383c57604051622e076360e81b815260040160405180910390fd5b8260000361385d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613985575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461394e6000878480600101955087614073565b61396b576040516368d2bf6b60e11b815260040160405180910390fd5b80820361390357826001541461398057600080fd5b6139ca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613986575b50600155611000600085838684565b6000826139e68584614b08565b14949350505050565b60006139fa82612eb6565b9050836001600160a01b031681600001516001600160a01b031614613a315760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613a4f5750613a4f8533612182565b80613a6a575033613a5f84611006565b6001600160a01b0316145b905080613a8a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613ab157604051633a954ecd60e21b815260040160405180910390fd5b613abd60008487612519565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613b91576001548214613b9157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4333b15611eca57611eca83614bac565b6060826001600160401b03811115613bff57613bff615050565b604051908082528060200260200182016040528015613c28578160200160208202803683370190505b50905060005b83811015613d4f5780600103613cee57613cc185613c4d8360016151ce565b6000868152601960205260409020546201518090613c6d90601890615343565b613c7990610e106152e4565b613c8390426151ce565b613c8d91906156fa565b60408051602081019490945283019190915260608201526080015b6040516020818303038152906040528051906020012090565b828281518110613cd357613cd3615357565b602002602001019061ffff16908161ffff1681525050613d3d565b613d1485613cfd8360016151ce565b604080516020810193909352820152606001613ca8565b828281518110613d2657613d26615357565b602002602001019061ffff16908161ffff16815250505b80613d478161521d565b915050613c2e565b509392505050565b600080613d6661271084615343565b9050600060015b85518161ffff1611613df5576000868261ffff1681518110613d9157613d91615357565b602002602001015190508281613da791906158f1565b61ffff168461ffff16108015613dc557508261ffff168461ffff1610155b15613dd557509250610d67915050565b613ddf81846158f1565b9250508080613ded90615917565b915050613d6d565b50600080fd5b60606000613e0a8360026152e4565b613e159060026151ce565b6001600160401b03811115613e2c57613e2c615050565b6040519080825280601f01601f191660200182016040528015613e56576020820181803683370190505b509050600360fc1b81600081518110613e7157613e71615357565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ea057613ea0615357565b60200101906001600160f81b031916908160001a9053506000613ec48460026152e4565b613ecf9060016151ce565b90505b6001811115613f47576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f0357613f03615357565b1a60f81b828281518110613f1957613f19615357565b60200101906001600160f81b031916908160001a90535060049490941c93613f4081615938565b9050613ed2565b5083156125c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b5b565b60606000613fa485856152cd565b613faf9060016151ce565b6001600160401b03811115613fc657613fc6615050565b6040519080825280601f01601f191660200182016040528015613ff0576020820181803683370190505b50905060005b61400086866152cd565b81116136955783600161401388846151ce565b61401d91906152cd565b8151811061402d5761402d615357565b602001015160f81c60f81b82828151811061404a5761404a615357565b60200101906001600160f81b031916908160001a9053508061406b8161521d565b915050613ff6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906140a890339089908890889060040161594f565b6020604051808303816000875af19250505080156140e3575060408051601f3d908101601f191682019092526140e09181019061598c565b60015b614141573d808015614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b508051600003614139576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060006040518060c0016040528060908152602001615b9960909139601e5485516001600160a01b0390911690631020bb629087906000906141a3576141a3615357565b60200260200101516040518263ffffffff1660e01b81526004016141d1919061ffff91909116815260200190565b600060405180830381865afa1580156141ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614216919081019061536d565b601e5486516001600160a01b039091169063b7fd9bfe908890600490811061424057614240615357565b60200260200101516040518263ffffffff1660e01b815260040161426e919061ffff91909116815260200190565b600060405180830381865afa15801561428b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b3919081019061536d565b601e5487516001600160a01b0390911690637760d26690899060069081106142dd576142dd615357565b60200260200101516040518263ffffffff1660e01b815260040161430b919061ffff91909116815260200190565b600060405180830381865afa158015614328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614350919081019061536d565b601e5488516001600160a01b03909116906369e23213908a90600590811061437a5761437a615357565b602002602001015161438b8a612dc5565b6040518363ffffffff1660e01b81526004016143a89291906153e3565b600060405180830381865afa1580156143c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143ed919081019061536d565b601e5489516001600160a01b0390911690633bf9045c908b90600390811061441757614417615357565b60200260200101516144288b612dc5565b6040518363ffffffff1660e01b81526004016144459291906153e3565b600060405180830381865afa158015614462573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261448a919081019061536d565b601e548a516001600160a01b03909116906353dbb7c7908c9060029081106144b4576144b4615357565b60200260200101516040518263ffffffff1660e01b81526004016144e2919061ffff91909116815260200190565b600060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614527919081019061536d565b604051806040016040528060048152602001631e17b39f60e11b81525060405160200161455b9897969594939291906159a9565b60408051808303601f1901815290829052601e54631b7f794d60e11b8352600160048401529092506001600160a01b0316906336fef29a90602401600060405180830381865afa1580156145b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145db919081019061536d565b601e5485516001600160a01b039091169063c209f2ae908790600190811061460557614605615357565b602002602001015160196000888152602001908152602001600020546040518363ffffffff1660e01b815260040161464d92919061ffff929092168252602082015260400190565b600060405180830381865afa15801561466a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614692919081019061536d565b601e546001600160a01b03166384740dde6146ac8761308c565b6040518263ffffffff1660e01b81526004016146ca91815260200190565b600060405180830381865afa1580156146e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261470f919081019061536d565b601e54875185916001600160a01b03169063940f4897908a90600190811061473957614739615357565b60200260200101516040518263ffffffff1660e01b8152600401614767919061ffff91909116815260200190565b600060405180830381865afa158015614784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526147ac919081019061536d565b601e546001600160a01b0316630672e85a6147c68a61308c565b6040518263ffffffff1660e01b81526004016147e491815260200190565b600060405180830381865afa158015614801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614829919081019061536d565b601e54604051631b7f794d60e11b81526004808201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614899919081019061536d565b601e54604051631b7f794d60e11b8152600560048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a919081019061536d565b601e54604051631b7f794d60e11b8152600260048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614953573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261497b919081019061536d565b60405160200161499399989796959493929190615a4e565b60405160208183030381529060405291505092915050565b6040805180820190915260018152600b60fa1b602082015260609082156149dd57506040805160208101909152600081525b8484826040516020016149f293929190615b0f565b6040516020818303038152906040529150509392505050565b60606000614a1d6301e1855842615343565b60408051602081019091526000815290915062682680821080614a4357506301d4ff1882115b15614a6b57506040805180820190915260068152652bb4b73a32b960d11b6020820152610d67565b626826808210158015614a81575062e2b3f08211155b15614aa95750604080518082019091526006815265537072696e6760d01b6020820152610d67565b62e2b3f082118015614abe575063015d4f7082105b15614ae6575060408051808201909152600681526529bab6b6b2b960d11b6020820152610d67565b5060408051808201909152600481526311985b1b60e21b602082015292915050565b600081815b8451811015613d4f576000858281518110614b2a57614b2a615357565b60200260200101519050808311614b6c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614b99565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ba48161521d565b915050614b0d565b6000614bb661306b565b90506000614c4f601f600701805480602002602001604051908101604052809291908181526020018280548015614c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614bfb5790505b5050506000878152601860205260409020549150613d579050565b61ffff166107dd601b60008681526020019081526020016000205484614c7591906152cd565b614c7f91906152cd565b614c8991906152cd565b9050600a8110614cce576000838152601b6020526040902054600890614cb09083906151ce565b614cba91906152cd565b6000848152601b6020526040902055505050565b60018111614ce2575050600052601b602052565b6000838152601b6020526040902054614cba9060016151ce565b604051806101400160405280600a905b6060815260200190600190039081614d0c5790505090565b80356001600160a01b0381168114614d3b57600080fd5b919050565b600060208284031215614d5257600080fd5b6125c382614d24565b60008083601f840112614d6d57600080fd5b5081356001600160401b03811115614d8457600080fd5b6020830191508360208260051b8501011115614d9f57600080fd5b9250929050565b60008060208385031215614db957600080fd5b82356001600160401b03811115614dcf57600080fd5b614ddb85828601614d5b565b90969095509350505050565b6001600160e01b03198116811461116b57600080fd5b600060208284031215614e0f57600080fd5b81356125c381614de7565b60005b83811015614e35578181015183820152602001614e1d565b838111156110005750506000910152565b60008151808452614e5e816020860160208601614e1a565b601f01601f19169290920160200192915050565b6020815260006125c36020830184614e46565b600060208284031215614e9757600080fd5b5035919050565b60008060408385031215614eb157600080fd5b614eba83614d24565b946020939093013593505050565b600080600060408486031215614edd57600080fd5b614ee684614d24565b925060208401356001600160401b03811115614f0157600080fd5b614f0d86828701614d5b565b9497909650939450505050565b600060208284031215614f2c57600080fd5b813560ff811681146125c357600080fd5b600080600060608486031215614f5257600080fd5b614f5b84614d24565b9250614f6960208501614d24565b9150604084013590509250925092565b60008060408385031215614f8c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614fd357835183529284019291840191600101614fb7565b50909695505050505050565b801515811461116b57600080fd5b6000806040838503121561500057600080fd5b61500983614d24565b9150602083013561501981614fdf565b809150509250929050565b6000806040838503121561503757600080fd5b8235915061504760208401614d24565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561508e5761508e615050565b604052919050565b60006001600160401b038211156150af576150af615050565b50601f01601f191660200190565b600080600080608085870312156150d357600080fd5b6150dc85614d24565b93506150ea60208601614d24565b92506040850135915060608501356001600160401b0381111561510c57600080fd5b8501601f8101871361511d57600080fd5b803561513061512b82615096565b615066565b81815288602083850101111561514557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561517a57600080fd5b61518383614d24565b915061504760208401614d24565b6020808252600d908201526c53616c6520696e61637469766560981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156151e1576151e16151b8565b500190565b60208082526017908201527f576f756c6420657863656564206d617820737570706c79000000000000000000604082015260600190565b60006001820161522f5761522f6151b8565b5060010190565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806152a757607f821691505b6020821081036152c757634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156152df576152df6151b8565b500390565b60008160001904831182151516156152fe576152fe6151b8565b500290565b60208082526010908201526f15dc9bdb99c811551208185b5bdd5b9d60821b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826153525761535261532d565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561537f57600080fd5b81516001600160401b0381111561539557600080fd5b8201601f810184136153a657600080fd5b80516153b461512b82615096565b8181528560208385010111156153c957600080fd5b6153da826020830160208601614e1a565b95945050505050565b61ffff831681526040602080830182905260009161018084019190840185845b600a81101561543257603f19878603018352615420858351614e46565b94509183019190830190600101615403565b5092979650505050505050565b60008151615451818560208601614e1a565b9290920192915050565b60008751602061546e8285838d01614e1a565b8851918401916154818184848d01614e1a565b88519201916154938184848c01614e1a565b87519201916154a58184848b01614e1a565b86519201916154b78184848a01614e1a565b85519201916154c98184848901614e1a565b919091019998505050505050505050565b717b226e616d65223a224e6f4c61756768202360701b8152845160009060206155098260128601838b01614e1a565b600160fd1b6012928501928301528654601390600090600181811c908083168061553457607f831692505b868310810361555157634e487b7160e01b85526022600452602485fd5b808015615565576001811461557a576155ab565b60ff19851689880152838901870195506155ab565b60008e81526020902060005b858110156155a15781548b82018a0152908401908901615586565b505086848a010195505b50507f222c20226465736372697074696f6e223a20224e6f4c6175676854696d652077845250507f696c6c206c69766520666f7265766572207468726f75676820746865204574686020830152507f657265756d20626c6f636b636861696e20616e642072656d61696e206861707060408201527f7920616e6420667265652e222c2022747261697473223a205b0000000000000060608201526156a761569961569361565b607985018c61543f565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b602082015260260190565b8961543f565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516156ed81601d850160208701614e1a565b91909101601d0192915050565b6000826157095761570961532d565b500490565b6000875160206157218285838d01614e1a565b8851918401916157348184848d01614e1a565b88519201916157468184848c01614e1a565b87519201916157588184848b01614e1a565b865192019161576a8184848a01614e1a565b855192019161577c8184848901614e1a565b602960f81b92019182525060010198975050505050505050565b6000602082840312156157a857600080fd5b81516125c381614fdf565b6000885160206157c68285838e01614e1a565b8951918401916157d98184848e01614e1a565b89519201916157eb8184848d01614e1a565b88519201916157fd8184848c01614e1a565b875192019161580f8184848b01614e1a565b86519201916158218184848a01614e1a565b85519201916158338184848901614e1a565b919091019a9950505050505050505050565b60008651615857818460208b01614e1a565b86519083019061586b818360208b01614e1a565b865191019061587e818360208a01614e1a565b8551910190615891818360208901614e1a565b84519101906158a4818360208801614e1a565b01979650505050505050565b600082516158c2818460208701614e1a565b9190910192915050565b600060ff821660ff84168060ff038211156158e9576158e96151b8565b019392505050565b600061ffff80831681851680830382111561590e5761590e6151b8565b01949350505050565b600061ffff80831681810361592e5761592e6151b8565b6001019392505050565b600081615947576159476151b8565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061598290830184614e46565b9695505050505050565b60006020828403121561599e57600080fd5b81516125c381614de7565b6000895160206159bc8285838f01614e1a565b8a51918401916159cf8184848f01614e1a565b8a519201916159e18184848e01614e1a565b89519201916159f38184848d01614e1a565b8851920191615a058184848c01614e1a565b8751920191615a178184848b01614e1a565b8651920191615a298184848a01614e1a565b8551920191615a3b8184848901614e1a565b919091019b9a5050505050505050505050565b60008a51615a60818460208f01614e1a565b8a51615a728183860160208f01614e1a565b8a519184010190615a87818360208e01614e1a565b8951615a998183850160208e01614e1a565b8951929091010190615aaf818360208c01614e1a565b8751615ac18183850160208c01614e1a565b8751929091010190615ad7818360208a01614e1a565b8551615ae98183850160208a01614e1a565b8551929091010190615aff818360208801614e1a565b019b9a5050505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528351600090615b3b816010850160208901614e1a565b6c111610113b30b63ab2911d101160991b6010918401918201528451615b6881601d840160208901614e1a565b61227d60f01b601d92909101918201528351615b8b81601f840160208801614e1a565b01601f019594505050505056fe3c7374796c653e23753435207b7472616e736974696f6e2d6475726174696f6e3a2032733b7472616e73666f726d2d6f726967696e3a203335253b7472616e73666f726d2d626f783a66696c6c2d626f783b7d23777437383a686f7665722023753435207b7472616e73666f726d3a207363616c6528312e35293b7d3c2f7374796c653e3c672069643d27753435273e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc664736f6c634300080d00330000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59

Deployed Bytecode

0x6080604052600436106103ac5760003560e01c806370a08231116101e7578063ad3e31b71161010d578063d49d5181116100a0578063f489e4961161006f578063f489e49614610aaf578063f4a0a52814610acf578063fd074a4814610aef578063fec4f63114610b0457600080fd5b8063d49d518114610a39578063dc610b1414610a4f578063e985e9c514610a6f578063f2fde38b14610a8f57600080fd5b8063baff1acc116100dc578063baff1acc146109d0578063bf3952d7146109e3578063c2428ef714610a03578063c87b56dd14610a1957600080fd5b8063ad3e31b71461095a578063af8063241461097a578063b7e7da6a1461099a578063b88d4fde146109b057600080fd5b80638e8fac9511610185578063a22cb46511610154578063a22cb465146108e4578063a58fdc1114610904578063a647f0cf14610924578063a74e807d1461093a57600080fd5b80638e8fac95146108835780639394d545146108a357806395d89b41146108b95780639f51758e146108ce57600080fd5b806382853eff116101c157806382853eff146108105780638462151c14610830578063853828b61461085d5780638da5cb5b1461086557600080fd5b806370a08231146107ae578063715018a6146107ce5780637fb66e22146107e357600080fd5b8063303e74df116102d757806342842e0e1161026a5780636352211e116102395780636352211e1461072e57806368ccfb871461074e5780636bee32641461076e5780636f8b44b01461078e57600080fd5b806342842e0e146106a75780634e8461cc146106c7578063578502ca146106f4578063603f4d521461071457600080fd5b80633ab2616d116102a65780633ab2616d1461062f5780633d5810e6146106455780633f794f251461066557806341f434341461068557600080fd5b8063303e74df146105ab57806334452fc9146105cb57806334b2196b146105de57806338e71675146105fe57600080fd5b806308d49f821161034f57806318160ddd1161031e57806318160ddd146105465780631a99dbb51461055f57806323b872dd14610575578063240c387c1461059557600080fd5b806308d49f82146104d0578063095ea7b3146104e65780630f2cc11d1461050657806312e7a1bf1461052657600080fd5b806301ffc9a71161038b57806301ffc9a71461043357806306fdde03146104635780630788370314610485578063081812fc1461049857600080fd5b80628af2e6146103b15780630186d137146103f157806301b9a39714610413575b600080fd5b3480156103bd57600080fd5b506103de6103cc366004614d40565b601d6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b5061041161040c366004614da6565b610b24565b005b34801561041f57600080fd5b5061041161042e366004614d40565b610ccf565b34801561043f57600080fd5b5061045361044e366004614dfd565b610d1b565b60405190151581526020016103e8565b34801561046f57600080fd5b50610478610d6d565b6040516103e89190614e72565b610411610493366004614e85565b610dff565b3480156104a457600080fd5b506104b86104b3366004614e85565b611006565b6040516001600160a01b0390911681526020016103e8565b3480156104dc57600080fd5b506103de600a5481565b3480156104f257600080fd5b50610411610501366004614e9e565b61104a565b34801561051257600080fd5b50610453610521366004614ec8565b6110d2565b34801561053257600080fd5b50610411610541366004614f1a565b611121565b34801561055257600080fd5b50600254600154036103de565b34801561056b57600080fd5b506103de600b5481565b34801561058157600080fd5b50610411610590366004614f3d565b61116e565b3480156105a157600080fd5b506103de600e5481565b3480156105b757600080fd5b50601e546104b8906001600160a01b031681565b6104116105d9366004614e85565b611193565b3480156105ea57600080fd5b506104116105f9366004614f79565b6112ea565b34801561060a57600080fd5b5060135461061d90610100900460ff1681565b60405160ff90911681526020016103e8565b34801561063b57600080fd5b506103de60105481565b34801561065157600080fd5b50610478610660366004614e85565b611374565b34801561067157600080fd5b50610411610680366004614e85565b6117a6565b34801561069157600080fd5b506104b86daaeb6d7670e522a718067333cd4e81565b3480156106b357600080fd5b506104116106c2366004614f3d565b6117d5565b3480156106d357600080fd5b506103de6106e2366004614d40565b601c6020526000908152604090205481565b34801561070057600080fd5b5061041161070f366004614e85565b6117fa565b34801561072057600080fd5b5060135461061d9060ff1681565b34801561073a57600080fd5b506104b8610749366004614e85565b611829565b34801561075a57600080fd5b50610411610769366004614d40565b61183b565b34801561077a57600080fd5b50610411610789366004614e85565b611887565b34801561079a57600080fd5b506104116107a9366004614e85565b6118b6565b3480156107ba57600080fd5b506103de6107c9366004614d40565b6118e5565b3480156107da57600080fd5b50610411611933565b3480156107ef57600080fd5b506103de6107fe366004614d40565b60166020526000908152604090205481565b34801561081c57600080fd5b5061041161082b366004614da6565b611969565b34801561083c57600080fd5b5061085061084b366004614d40565b611ac8565b6040516103e89190614f9b565b610411611c01565b34801561087157600080fd5b506000546001600160a01b03166104b8565b34801561088f57600080fd5b5061041161089e366004614e85565b611c5c565b3480156108af57600080fd5b506103de600c5481565b3480156108c557600080fd5b50610478611c8b565b3480156108da57600080fd5b506103de600d5481565b3480156108f057600080fd5b506104116108ff366004614fed565b611c9a565b34801561091057600080fd5b5061041161091f366004614e85565b611d2f565b34801561093057600080fd5b506103de60115481565b34801561094657600080fd5b50610411610955366004614e85565b611d5e565b34801561096657600080fd5b50610411610975366004614e85565b611d8d565b34801561098657600080fd5b50610411610995366004615024565b611dbc565b3480156109a657600080fd5b506103de600f5481565b3480156109bc57600080fd5b506104116109cb3660046150bd565b611ea4565b6104116109de366004614e85565b611ed1565b3480156109ef57600080fd5b506104786109fe366004614e85565b612061565b348015610a0f57600080fd5b506103de60125481565b348015610a2557600080fd5b50610478610a34366004614e85565b612076565b348015610a4557600080fd5b506103de60095481565b348015610a5b57600080fd5b50610453610a6a366004614ec8565b61213b565b348015610a7b57600080fd5b50610453610a8a366004615167565b612182565b348015610a9b57600080fd5b50610411610aaa366004614d40565b6121b0565b348015610abb57600080fd5b50610411610aca366004614e85565b612248565b348015610adb57600080fd5b50610411610aea366004614e85565b612277565b348015610afb57600080fd5b506104116122a6565b348015610b1057600080fd5b50610478610b1f366004614e85565b612300565b6000610b336002546001540390565b60135490915060ff16600114610b645760405162461bcd60e51b8152600401610b5b90615191565b60405180910390fd5b600954610b728260026151ce565b1115610b905760405162461bcd60e51b8152600401610b5b906151e6565b610b9b3384846110d2565b610bd95760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601c602052604090205415610c275760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601c60205260408120805491610c428361521d565b919050555060005b6002811015610cba574233610c5f83856151ce565b604051602001610c7193929190615236565b60408051601f19818403018152919052805160209091012060186000610c9784866151ce565b815260208101919091526040016000205580610cb28161521d565b915050610c4a565b5060009050610cca3360026124cf565b505050565b6000546001600160a01b03163314610cf95760405162461bcd60e51b8152600401610b5b9061525e565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610d4c57506001600160e01b03198216635b5e139f60e01b145b80610d6757506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060038054610d7c90615293565b80601f0160208091040260200160405190810160405280929190818152602001828054610da890615293565b8015610df55780601f10610dca57610100808354040283529160200191610df5565b820191906000526020600020905b815481529060010190602001808311610dd857829003601f168201915b5050505050905090565b6000610e0e6002546001540390565b60105433600090815260166020526040812054929350911015610e4d5733600090815260166020526040902054601054610e4891906152cd565b610e50565b60005b9050600083821015610e6b57610e6682856152cd565b610e6e565b60005b60135490915060ff16600314610e965760405162461bcd60e51b8152600401610b5b90615191565b600c54841115610ed35760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b6044820152606401610b5b565b600954610ee085856151ce565b1115610f2e5760405162461bcd60e51b815260206004820152601e60248201527f576f756c6420657863656564206d6178207075626c696320737570706c7900006044820152606401610b5b565b3481600f54610f3d91906152e4565b14610f5a5760405162461bcd60e51b8152600401610b5b90615303565b3360009081526016602052604081208054869290610f799084906151ce565b90915550600090505b84811015610ff1574233610f9683876151ce565b604051602001610fa893929190615236565b60408051601f19818403018152919052805160209091012060186000610fce84886151ce565b815260208101919091526040016000205580610fe98161521d565b915050610f82565b506000925061100033856124cf565b50505050565b6000611011826124ed565b61102e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061105582611829565b9050806001600160a01b0316836001600160a01b0316036110895760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906110a957506110a78133612182565b155b156110c7576040516367d9dca160e11b815260040160405180910390fd5b610cca838383612519565b60006111196110e085612575565b8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506125b492505050565b949350505050565b6000546001600160a01b0316331461114b5760405162461bcd60e51b8152600401610b5b9061525e565b601354600560ff909116101561116b576013805460ff191660ff83161790555b50565b826001600160a01b038116331461118857611188336125ca565b611000848484612683565b60135460ff610100909104166001146111e65760405162461bcd60e51b81526020600482015260156024820152745265726f6c6c20436f6c6f7220696e61637469766560581b6044820152606401610b5b565b600b546012541061122b5760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b61123481611829565b6001600160a01b0316336001600160a01b03161461128c5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600e54146112ad5760405162461bcd60e51b8152600401610b5b90615303565b6012546112bb9060016151ce565b6012556000818152601a60205260409020546112d89060016151ce565b6000918252601a602052604090912055565b6112f382611829565b6001600160a01b0316336001600160a01b0316146113535760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f776e65722063616e206368616e676520557463000000000000006044820152606401610b5b565b61135e601882615343565b6000928352601960205260409092209190915550565b60606113836002546001540390565b8211156113c25760405162461bcd60e51b815260206004820152600d60248201526c13585b881b9bdd08195e1a5cdd609a1b6044820152606401610b5b565b60006113cd8361268e565b601e5481519192506001600160a01b031690631020bb629083906000906113f6576113f6615357565b60200260200101516040518263ffffffff1660e01b8152600401611424919061ffff91909116815260200190565b600060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611469919081019061536d565b601e5482516001600160a01b039091169063b7fd9bfe908490600490811061149357611493615357565b60200260200101516040518263ffffffff1660e01b81526004016114c1919061ffff91909116815260200190565b600060405180830381865afa1580156114de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611506919081019061536d565b601e5483516001600160a01b0390911690637760d266908590600690811061153057611530615357565b60200260200101516040518263ffffffff1660e01b815260040161155e919061ffff91909116815260200190565b600060405180830381865afa15801561157b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115a3919081019061536d565b601e5484516001600160a01b03909116906369e2321390869060059081106115cd576115cd615357565b60200260200101516115de89612dc5565b6040518363ffffffff1660e01b81526004016115fb9291906153e3565b600060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611640919081019061536d565b601e5485516001600160a01b0390911690633bf9045c908790600390811061166a5761166a615357565b602002602001015161167b8a612dc5565b6040518363ffffffff1660e01b81526004016116989291906153e3565b600060405180830381865afa1580156116b5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116dd919081019061536d565b601e5486516001600160a01b03909116906353dbb7c7908890600290811061170757611707615357565b60200260200101516040518263ffffffff1660e01b8152600401611735919061ffff91909116815260200190565b600060405180830381865afa158015611752573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177a919081019061536d565b60405160200161178f9695949392919061545b565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146117d05760405162461bcd60e51b8152600401610b5b9061525e565b601055565b826001600160a01b03811633146117ef576117ef336125ca565b611000848484612e9b565b6000546001600160a01b031633146118245760405162461bcd60e51b8152600401610b5b9061525e565b600a55565b600061183482612eb6565b5192915050565b6000546001600160a01b031633146118655760405162461bcd60e51b8152600401610b5b9061525e565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118b15760405162461bcd60e51b8152600401610b5b9061525e565b600b55565b6000546001600160a01b031633146118e05760405162461bcd60e51b8152600401610b5b9061525e565b600955565b60006001600160a01b03821661190e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b0316331461195d5760405162461bcd60e51b8152600401610b5b9061525e565b6119676000612fd0565b565b60006119786002546001540390565b60135490915060ff166002146119a05760405162461bcd60e51b8152600401610b5b90615191565b6009546119ae8260016151ce565b11156119cc5760405162461bcd60e51b8152600401610b5b906151e6565b6119d733848461213b565b611a155760405162461bcd60e51b815260206004820152600f60248201526e139bdd081bdb881d1a19481b1a5cdd608a1b6044820152606401610b5b565b336000908152601d602052604090205415611a635760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610b5b565b336000908152601d60205260408120805491611a7e8361521d565b9190505550423382604051602001611a9893929190615236565b60408051601f19818403018152918152815160209283012060009384526018909252822055610cca3360016124cf565b60606000611ad5836118e5565b90506000816001600160401b03811115611af157611af1615050565b604051908082528060200260200182016040528015611b1a578160200160208202803683370190505b509050600080611b2d6002546001540390565b905060005b81811015611bf6576000611b45826124ed565b90508015611b9f57876001600160a01b0316611b6083611829565b6001600160a01b031603611b9a5781858581518110611b8157611b81615357565b602090810291909101015283611b968161521d565b9450505b611be3565b80158015611bd0575084611bb46001886152cd565b81518110611bc457611bc4615357565b60200260200101516000145b15611be35782611bdf8161521d565b9350505b5080611bee8161521d565b915050611b32565b509195945050505050565b6000546001600160a01b03163314611c2b5760405162461bcd60e51b8152600401610b5b9061525e565b6017546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505061196757600080fd5b6000546001600160a01b03163314611c865760405162461bcd60e51b8152600401610b5b9061525e565b600e55565b606060048054610d7c90615293565b336001600160a01b03831603611cc35760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611d595760405162461bcd60e51b8152600401610b5b9061525e565b601455565b6000546001600160a01b03163314611d885760405162461bcd60e51b8152600401610b5b9061525e565b600c55565b6000546001600160a01b03163314611db75760405162461bcd60e51b8152600401610b5b9061525e565b601555565b6000546001600160a01b03163314611de65760405162461bcd60e51b8152600401610b5b9061525e565b6000611df56002546001540390565b600954909150611e0584836151ce565b1115611e235760405162461bcd60e51b8152600401610b5b906151e6565b60005b83811015611e95574233611e3a83856151ce565b604051602001611e4c93929190615236565b60408051601f19818403018152919052805160209091012060186000611e7284866151ce565b815260208101919091526040016000205580611e8d8161521d565b915050611e26565b5060009050610cca82846124cf565b836001600160a01b0381163314611ebe57611ebe336125ca565b611eca85858585613020565b5050505050565b60135460ff61010090910416600114611f1e5760405162461bcd60e51b815260206004820152600f60248201526e5265726f6c6c20696e61637469766560881b6044820152606401610b5b565b600a5460115410611f635760405162461bcd60e51b815260206004820152600f60248201526e4e6f206d6f7265207265726f6c6c7360881b6044820152606401610b5b565b611f6c81611829565b6001600160a01b0316336001600160a01b031614611fc45760405162461bcd60e51b815260206004820152601560248201527413db9b1e481bdddb995c8818d85b881c995c9bdb1b605a1b6044820152606401610b5b565b34600d5414611fe55760405162461bcd60e51b8152600401610b5b90615303565b601154611ff39060016151ce565b60115542336120038360016151ce565b60405160200161201593929190615236565b60408051601f198184030181529181528151602092830120600084815260189093529120556107e761204561306b565b61204f91906152cd565b6000918252601b602052604090912055565b6060610d6760086120718461308c565b613190565b6060612081826124ed565b6120bf5760405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606401610b5b565b6000806120cb84613252565b915091506121136120db85613573565b60008681526030602090815260409182902091516120ff93929186918891016154da565b60405160208183030381529060405261369e565b60405160200161212391906156b5565b60405160208183030381529060405292505050919050565b600061111961214985612575565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061380492505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121da5760405162461bcd60e51b8152600401610b5b9061525e565b6001600160a01b03811661223f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b5b565b61116b81612fd0565b6000546001600160a01b031633146122725760405162461bcd60e51b8152600401610b5b9061525e565b600d55565b6000546001600160a01b031633146122a15760405162461bcd60e51b8152600401610b5b9061525e565b600f55565b6000546001600160a01b031633146122d05760405162461bcd60e51b8152600401610b5b9061525e565b601354610100900460ff166001036122ef576013805461ff0019169055565b6013805461ff001916610100179055565b6060816000610e1062015180612317601885615343565b61232390610e106152e4565b61232d90426151ce565b6123379190615343565b61234191906156fa565b90506000603c612353610e1042615343565b61235d91906156fa565b6040805160208082018352600082528251808401845260018152601d60f91b818301528351808501909452600684526520285554432b60d01b918401919091529293509190600c8510156123e4576040518060400160405280600381526020016220414d60e81b8152509250846000036123df576123dc85600c6151ce565b94505b612419565b6040518060400160405280600381526020016220504d60e81b8152509250600c85111561241957612416600c866152cd565b94505b600a841015612440576040518060400160405280600281526020016103a360f41b81525091505b600c861115612480575060408051808201909152600681526520285554432d60d01b6020820152612472600c87615343565b61247d90600c6152cd565b95505b61248985613573565b8261249386613573565b858461249e8b613573565b6040516020016124b39695949392919061570e565b6040516020818303038152906040529650505050505050919050565b6124e9828260405180602001604052806000815250613813565b5050565b600060015482108015610d67575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60006125c382601454856139d9565b9392505050565b6daaeb6d7670e522a718067333cd4e3b1561116b57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612637573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061265b9190615796565b61116b57604051633b79c77360e21b81526001600160a01b0382166004820152602401610b5b565b610cca8383836139ef565b6000818152601860205260408120546060916126ac82600886613be5565b60408051600880825261012082019092529192506000919060208201610100803683375050601f80546040805160208084028201810190925282815294955061277194935083018282801561274857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161270f5790505b50505050508360008151811061276057612760615357565b602002602001015161ffff16613d57565b8160008151811061278457612784615357565b61ffff92909216602092830291909101820152805460408051828402810184019091528181526128209290918282018282801561280857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116127cf5790505b50505050508360018151811061276057612760615357565b8160018151811061283357612833615357565b61ffff929092166020928302919091018201526021805460408051828502810185019091528181526128d293909291908301828280156128ba57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116128815790505b50505050508360028151811061276057612760615357565b816002815181106128e5576128e5615357565b61ffff92909216602092830291909101820152602280546040805182850281018501909152818152612984939092919083018282801561296c57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129335790505b50505050508360038151811061276057612760615357565b8160038151811061299757612997615357565b61ffff92909216602092830291909101820152602380546040805182850281018501909152818152612a369390929190830182828015612a1e57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116129e55790505b50505050508360048151811061276057612760615357565b81600481518110612a4957612a49615357565b61ffff92909216602092830291909101820152602480546040805182850281018501909152818152612ae89390929190830182828015612ad057602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612a975790505b50505050508360058151811061276057612760615357565b81600581518110612afb57612afb615357565b61ffff92909216602092830291909101820152602580546040805182850281018501909152818152612b9a9390929190830182828015612b8257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b495790505b50505050508360068151811061276057612760615357565b81600681518110612bad57612bad615357565b61ffff92909216602092830291909101820152602680546040805182850281018501909152818152612c4c9390929190830182828015612c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612bfb5790505b50505050508360078151811061276057612760615357565b81600781518110612c5f57612c5f615357565b602002602001019061ffff16908161ffff168152505080600581518110612c8857612c88615357565b602002602001015161ffff16600c03612cc757600181600081518110612cb057612cb0615357565b602002602001019061ffff16908161ffff16815250505b80600081518110612cda57612cda615357565b602002602001015161ffff1660041480612d12575080600081518110612d0257612d02615357565b602002602001015161ffff166005145b80612d3b575080600081518110612d2b57612d2b615357565b602002602001015161ffff166006145b15612d6c57600181600681518110612d5557612d55615357565b602002602001019061ffff16908161ffff16815250505b80600381518110612d7f57612d7f615357565b602002602001015161ffff1660030361111957600181600281518110612da757612da7615357565b602002602001019061ffff16908161ffff1681525050949350505050565b612dcd614cfc565b600082815260186020908152604080832054601a909252822054612e299190612df79060326151ce565b6040805160208101939093528201526060016040516020818303038152906040528051906020012060001c6020613dfb565b905060005b60098111612e9457612e6b612e448260066152e4565b612e4f9060036151ce565b612e5a8360066152e4565b612e659060086151ce565b84613f96565b8382600a8110612e7d57612e7d615357565b602002015280612e8c8161521d565b915050612e2e565b5050919050565b610cca83838360405180602001604052806000815250611ea4565b604080516060810182526000808252602082018190529181019190915281600154811015612fb757600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612fb55780516001600160a01b031615612f4c579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612fb0579392505050565b612f4c565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61302b8484846139ef565b6001600160a01b0383163b1515801561304d575061304b84848484614073565b155b15611000576040516368d2bf6b60e11b815260040160405180910390fd5b600061307b6301e18558426156fa565b613087906107b26151ce565b905090565b60008061309761306b565b90506000613130601f60070180548060200260200160405190810160405280929190818152602001828054801561311557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116130dc5790505b5050506000888152601860205260409020549150613d579050565b61ffff166107dd601b6000878152602001908152602001600020548461315691906152cd565b61316091906152cd565b61316a91906152cd565b9050600a811061317e575060099392505050565b600181116125c3575060019392505050565b6060602783600981106131a5576131a5615357565b0182815481106131b7576131b7615357565b9060005260206000200180546131cc90615293565b80601f01602080910402602001604051908101604052809291908181526020018280546131f890615293565b80156132455780601f1061321a57610100808354040283529160200191613245565b820191906000526020600020905b81548152906001019060200180831161322857829003601f168201915b5050505050905092915050565b6060808260006132618261268e565b9050600061326f828761415e565b905061327a8161369e565b945060606132ce60405180604001604052806004815260200163426f647960e01b8152506132c76000866000815181106132b6576132b6615357565b602002602001015161ffff16613190565b60006149ab565b613309604051806040016040528060078152602001662bb2b0ba3432b960c91b8152506132c76001876001815181106132b6576132b6615357565b6133446040518060400160405280600781526020016622bcb2bbb2b0b960c91b8152506132c76002886002815181106132b6576132b6615357565b61337c604051806040016040528060048152602001634861747360e01b8152506132c76003896003815181106132b6576132b6615357565b6133b36040518060400160405280600381526020016245796560e81b8152506132c760048a6004815181106132b6576132b6615357565b6133ee60405180604001604052806007815260200166436c6f7468657360c81b8152506132c760058b6005815181106132b6576132b6615357565b61342760405180604001604052806005815260200164486169727360d81b8152506132c760068c6006815181106132b6576132b6615357565b60405160200161343d97969594939291906157b3565b604051602081830303815290604052905060008161348d6040518060400160405280600481526020016354696d6560e01b8152506132c7601960008a815260200190815260200160002054612300565b6134b76040518060400160405280600681526020016529b2b0b9b7b760d11b8152506132c7614a0b565b6134e660405180604001604052806005815260200164546965727360d81b8152506132c760086120718c61308c565b6135226040518060400160405280600b81526020016a54656d706f72616c69747960a81b81525061351b60076120718d61308c565b60016149ab565b604051602001613536959493929190615845565b60405160208183030381529060405290508060405160200161355891906158b0565b60405160208183030381529060405295505050505050915091565b60608160000361359a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135c457806135ae8161521d565b91506135bd9050600a836156fa565b915061359e565b6000816001600160401b038111156135de576135de615050565b6040519080825280601f01601f191660200182016040528015613608576020820181803683370190505b509050815b85156136955761361e6001826152cd565b9050600061362d600a886156fa565b61363890600a6152e4565b61364290886152cd565b61364d9060306158cc565b905060008160f81b90508084848151811061366a5761366a615357565b60200101906001600160f81b031916908160001a90535061368c600a896156fa565b9750505061360d565b50949350505050565b606081516000036136bd57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615c2960409139905060006003845160026136ec91906151ce565b6136f691906156fa565b6137019060046152e4565b905060006137108260206151ce565b6001600160401b0381111561372757613727615050565b6040519080825280601f01601f191660200182016040528015613751576020820181803683370190505b509050818152600183018586518101602084015b818310156137bf5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613765565b6003895106600181146137d957600281146137ea576137f6565b613d3d60f01b6001198301526137f6565b603d60f81b6000198301525b509398975050505050505050565b60006125c382601554856139d9565b6001546001600160a01b03841661383c57604051622e076360e81b815260040160405180910390fd5b8260000361385d5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600590925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613985575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461394e6000878480600101955087614073565b61396b576040516368d2bf6b60e11b815260040160405180910390fd5b80820361390357826001541461398057600080fd5b6139ca565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613986575b50600155611000600085838684565b6000826139e68584614b08565b14949350505050565b60006139fa82612eb6565b9050836001600160a01b031681600001516001600160a01b031614613a315760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480613a4f5750613a4f8533612182565b80613a6a575033613a5f84611006565b6001600160a01b0316145b905080613a8a57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416613ab157604051633a954ecd60e21b815260040160405180910390fd5b613abd60008487612519565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116613b91576001548214613b9157805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4333b15611eca57611eca83614bac565b6060826001600160401b03811115613bff57613bff615050565b604051908082528060200260200182016040528015613c28578160200160208202803683370190505b50905060005b83811015613d4f5780600103613cee57613cc185613c4d8360016151ce565b6000868152601960205260409020546201518090613c6d90601890615343565b613c7990610e106152e4565b613c8390426151ce565b613c8d91906156fa565b60408051602081019490945283019190915260608201526080015b6040516020818303038152906040528051906020012090565b828281518110613cd357613cd3615357565b602002602001019061ffff16908161ffff1681525050613d3d565b613d1485613cfd8360016151ce565b604080516020810193909352820152606001613ca8565b828281518110613d2657613d26615357565b602002602001019061ffff16908161ffff16815250505b80613d478161521d565b915050613c2e565b509392505050565b600080613d6661271084615343565b9050600060015b85518161ffff1611613df5576000868261ffff1681518110613d9157613d91615357565b602002602001015190508281613da791906158f1565b61ffff168461ffff16108015613dc557508261ffff168461ffff1610155b15613dd557509250610d67915050565b613ddf81846158f1565b9250508080613ded90615917565b915050613d6d565b50600080fd5b60606000613e0a8360026152e4565b613e159060026151ce565b6001600160401b03811115613e2c57613e2c615050565b6040519080825280601f01601f191660200182016040528015613e56576020820181803683370190505b509050600360fc1b81600081518110613e7157613e71615357565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613ea057613ea0615357565b60200101906001600160f81b031916908160001a9053506000613ec48460026152e4565b613ecf9060016151ce565b90505b6001811115613f47576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613f0357613f03615357565b1a60f81b828281518110613f1957613f19615357565b60200101906001600160f81b031916908160001a90535060049490941c93613f4081615938565b9050613ed2565b5083156125c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610b5b565b60606000613fa485856152cd565b613faf9060016151ce565b6001600160401b03811115613fc657613fc6615050565b6040519080825280601f01601f191660200182016040528015613ff0576020820181803683370190505b50905060005b61400086866152cd565b81116136955783600161401388846151ce565b61401d91906152cd565b8151811061402d5761402d615357565b602001015160f81c60f81b82828151811061404a5761404a615357565b60200101906001600160f81b031916908160001a9053508061406b8161521d565b915050613ff6565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906140a890339089908890889060040161594f565b6020604051808303816000875af19250505080156140e3575060408051601f3d908101601f191682019092526140e09181019061598c565b60015b614141573d808015614111576040519150601f19603f3d011682016040523d82523d6000602084013e614116565b606091505b508051600003614139576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b606060006040518060c0016040528060908152602001615b9960909139601e5485516001600160a01b0390911690631020bb629087906000906141a3576141a3615357565b60200260200101516040518263ffffffff1660e01b81526004016141d1919061ffff91909116815260200190565b600060405180830381865afa1580156141ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614216919081019061536d565b601e5486516001600160a01b039091169063b7fd9bfe908890600490811061424057614240615357565b60200260200101516040518263ffffffff1660e01b815260040161426e919061ffff91909116815260200190565b600060405180830381865afa15801561428b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142b3919081019061536d565b601e5487516001600160a01b0390911690637760d26690899060069081106142dd576142dd615357565b60200260200101516040518263ffffffff1660e01b815260040161430b919061ffff91909116815260200190565b600060405180830381865afa158015614328573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614350919081019061536d565b601e5488516001600160a01b03909116906369e23213908a90600590811061437a5761437a615357565b602002602001015161438b8a612dc5565b6040518363ffffffff1660e01b81526004016143a89291906153e3565b600060405180830381865afa1580156143c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526143ed919081019061536d565b601e5489516001600160a01b0390911690633bf9045c908b90600390811061441757614417615357565b60200260200101516144288b612dc5565b6040518363ffffffff1660e01b81526004016144459291906153e3565b600060405180830381865afa158015614462573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261448a919081019061536d565b601e548a516001600160a01b03909116906353dbb7c7908c9060029081106144b4576144b4615357565b60200260200101516040518263ffffffff1660e01b81526004016144e2919061ffff91909116815260200190565b600060405180830381865afa1580156144ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614527919081019061536d565b604051806040016040528060048152602001631e17b39f60e11b81525060405160200161455b9897969594939291906159a9565b60408051808303601f1901815290829052601e54631b7f794d60e11b8352600160048401529092506001600160a01b0316906336fef29a90602401600060405180830381865afa1580156145b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526145db919081019061536d565b601e5485516001600160a01b039091169063c209f2ae908790600190811061460557614605615357565b602002602001015160196000888152602001908152602001600020546040518363ffffffff1660e01b815260040161464d92919061ffff929092168252602082015260400190565b600060405180830381865afa15801561466a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614692919081019061536d565b601e546001600160a01b03166384740dde6146ac8761308c565b6040518263ffffffff1660e01b81526004016146ca91815260200190565b600060405180830381865afa1580156146e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261470f919081019061536d565b601e54875185916001600160a01b03169063940f4897908a90600190811061473957614739615357565b60200260200101516040518263ffffffff1660e01b8152600401614767919061ffff91909116815260200190565b600060405180830381865afa158015614784573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526147ac919081019061536d565b601e546001600160a01b0316630672e85a6147c68a61308c565b6040518263ffffffff1660e01b81526004016147e491815260200190565b600060405180830381865afa158015614801573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614829919081019061536d565b601e54604051631b7f794d60e11b81526004808201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052614899919081019061536d565b601e54604051631b7f794d60e11b8152600560048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa1580156148e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261490a919081019061536d565b601e54604051631b7f794d60e11b8152600260048201526001600160a01b03909116906336fef29a90602401600060405180830381865afa158015614953573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261497b919081019061536d565b60405160200161499399989796959493929190615a4e565b60405160208183030381529060405291505092915050565b6040805180820190915260018152600b60fa1b602082015260609082156149dd57506040805160208101909152600081525b8484826040516020016149f293929190615b0f565b6040516020818303038152906040529150509392505050565b60606000614a1d6301e1855842615343565b60408051602081019091526000815290915062682680821080614a4357506301d4ff1882115b15614a6b57506040805180820190915260068152652bb4b73a32b960d11b6020820152610d67565b626826808210158015614a81575062e2b3f08211155b15614aa95750604080518082019091526006815265537072696e6760d01b6020820152610d67565b62e2b3f082118015614abe575063015d4f7082105b15614ae6575060408051808201909152600681526529bab6b6b2b960d11b6020820152610d67565b5060408051808201909152600481526311985b1b60e21b602082015292915050565b600081815b8451811015613d4f576000858281518110614b2a57614b2a615357565b60200260200101519050808311614b6c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250614b99565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080614ba48161521d565b915050614b0d565b6000614bb661306b565b90506000614c4f601f600701805480602002602001604051908101604052809291908181526020018280548015614c3457602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411614bfb5790505b5050506000878152601860205260409020549150613d579050565b61ffff166107dd601b60008681526020019081526020016000205484614c7591906152cd565b614c7f91906152cd565b614c8991906152cd565b9050600a8110614cce576000838152601b6020526040902054600890614cb09083906151ce565b614cba91906152cd565b6000848152601b6020526040902055505050565b60018111614ce2575050600052601b602052565b6000838152601b6020526040902054614cba9060016151ce565b604051806101400160405280600a905b6060815260200190600190039081614d0c5790505090565b80356001600160a01b0381168114614d3b57600080fd5b919050565b600060208284031215614d5257600080fd5b6125c382614d24565b60008083601f840112614d6d57600080fd5b5081356001600160401b03811115614d8457600080fd5b6020830191508360208260051b8501011115614d9f57600080fd5b9250929050565b60008060208385031215614db957600080fd5b82356001600160401b03811115614dcf57600080fd5b614ddb85828601614d5b565b90969095509350505050565b6001600160e01b03198116811461116b57600080fd5b600060208284031215614e0f57600080fd5b81356125c381614de7565b60005b83811015614e35578181015183820152602001614e1d565b838111156110005750506000910152565b60008151808452614e5e816020860160208601614e1a565b601f01601f19169290920160200192915050565b6020815260006125c36020830184614e46565b600060208284031215614e9757600080fd5b5035919050565b60008060408385031215614eb157600080fd5b614eba83614d24565b946020939093013593505050565b600080600060408486031215614edd57600080fd5b614ee684614d24565b925060208401356001600160401b03811115614f0157600080fd5b614f0d86828701614d5b565b9497909650939450505050565b600060208284031215614f2c57600080fd5b813560ff811681146125c357600080fd5b600080600060608486031215614f5257600080fd5b614f5b84614d24565b9250614f6960208501614d24565b9150604084013590509250925092565b60008060408385031215614f8c57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614fd357835183529284019291840191600101614fb7565b50909695505050505050565b801515811461116b57600080fd5b6000806040838503121561500057600080fd5b61500983614d24565b9150602083013561501981614fdf565b809150509250929050565b6000806040838503121561503757600080fd5b8235915061504760208401614d24565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561508e5761508e615050565b604052919050565b60006001600160401b038211156150af576150af615050565b50601f01601f191660200190565b600080600080608085870312156150d357600080fd5b6150dc85614d24565b93506150ea60208601614d24565b92506040850135915060608501356001600160401b0381111561510c57600080fd5b8501601f8101871361511d57600080fd5b803561513061512b82615096565b615066565b81815288602083850101111561514557600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561517a57600080fd5b61518383614d24565b915061504760208401614d24565b6020808252600d908201526c53616c6520696e61637469766560981b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156151e1576151e16151b8565b500190565b60208082526017908201527f576f756c6420657863656564206d617820737570706c79000000000000000000604082015260600190565b60006001820161522f5761522f6151b8565b5060010190565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806152a757607f821691505b6020821081036152c757634e487b7160e01b600052602260045260246000fd5b50919050565b6000828210156152df576152df6151b8565b500390565b60008160001904831182151516156152fe576152fe6151b8565b500290565b60208082526010908201526f15dc9bdb99c811551208185b5bdd5b9d60821b604082015260600190565b634e487b7160e01b600052601260045260246000fd5b6000826153525761535261532d565b500690565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561537f57600080fd5b81516001600160401b0381111561539557600080fd5b8201601f810184136153a657600080fd5b80516153b461512b82615096565b8181528560208385010111156153c957600080fd5b6153da826020830160208601614e1a565b95945050505050565b61ffff831681526040602080830182905260009161018084019190840185845b600a81101561543257603f19878603018352615420858351614e46565b94509183019190830190600101615403565b5092979650505050505050565b60008151615451818560208601614e1a565b9290920192915050565b60008751602061546e8285838d01614e1a565b8851918401916154818184848d01614e1a565b88519201916154938184848c01614e1a565b87519201916154a58184848b01614e1a565b86519201916154b78184848a01614e1a565b85519201916154c98184848901614e1a565b919091019998505050505050505050565b717b226e616d65223a224e6f4c61756768202360701b8152845160009060206155098260128601838b01614e1a565b600160fd1b6012928501928301528654601390600090600181811c908083168061553457607f831692505b868310810361555157634e487b7160e01b85526022600452602485fd5b808015615565576001811461557a576155ab565b60ff19851689880152838901870195506155ab565b60008e81526020902060005b858110156155a15781548b82018a0152908401908901615586565b505086848a010195505b50507f222c20226465736372697074696f6e223a20224e6f4c6175676854696d652077845250507f696c6c206c69766520666f7265766572207468726f75676820746865204574686020830152507f657265756d20626c6f636b636861696e20616e642072656d61696e206861707060408201527f7920616e6420667265652e222c2022747261697473223a205b0000000000000060608201526156a761569961569361565b607985018c61543f565b7f5d2c2022696d616765223a22646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b602082015260260190565b8961543f565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516156ed81601d850160208701614e1a565b91909101601d0192915050565b6000826157095761570961532d565b500490565b6000875160206157218285838d01614e1a565b8851918401916157348184848d01614e1a565b88519201916157468184848c01614e1a565b87519201916157588184848b01614e1a565b865192019161576a8184848a01614e1a565b855192019161577c8184848901614e1a565b602960f81b92019182525060010198975050505050505050565b6000602082840312156157a857600080fd5b81516125c381614fdf565b6000885160206157c68285838e01614e1a565b8951918401916157d98184848e01614e1a565b89519201916157eb8184848d01614e1a565b88519201916157fd8184848c01614e1a565b875192019161580f8184848b01614e1a565b86519201916158218184848a01614e1a565b85519201916158338184848901614e1a565b919091019a9950505050505050505050565b60008651615857818460208b01614e1a565b86519083019061586b818360208b01614e1a565b865191019061587e818360208a01614e1a565b8551910190615891818360208901614e1a565b84519101906158a4818360208801614e1a565b01979650505050505050565b600082516158c2818460208701614e1a565b9190910192915050565b600060ff821660ff84168060ff038211156158e9576158e96151b8565b019392505050565b600061ffff80831681851680830382111561590e5761590e6151b8565b01949350505050565b600061ffff80831681810361592e5761592e6151b8565b6001019392505050565b600081615947576159476151b8565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061598290830184614e46565b9695505050505050565b60006020828403121561599e57600080fd5b81516125c381614de7565b6000895160206159bc8285838f01614e1a565b8a51918401916159cf8184848f01614e1a565b8a519201916159e18184848e01614e1a565b89519201916159f38184848d01614e1a565b8851920191615a058184848c01614e1a565b8751920191615a178184848b01614e1a565b8651920191615a298184848a01614e1a565b8551920191615a3b8184848901614e1a565b919091019b9a5050505050505050505050565b60008a51615a60818460208f01614e1a565b8a51615a728183860160208f01614e1a565b8a519184010190615a87818360208e01614e1a565b8951615a998183850160208e01614e1a565b8951929091010190615aaf818360208c01614e1a565b8751615ac18183850160208c01614e1a565b8751929091010190615ad7818360208a01614e1a565b8551615ae98183850160208a01614e1a565b8551929091010190615aff818360208801614e1a565b019b9a5050505050505050505050565b6f3d913a3930b4ba2fba3cb832911d101160811b81528351600090615b3b816010850160208901614e1a565b6c111610113b30b63ab2911d101160991b6010918401918201528451615b6881601d840160208901614e1a565b61227d60f01b601d92909101918201528351615b8b81601f840160208801614e1a565b01601f019594505050505056fe3c7374796c653e23753435207b7472616e736974696f6e2d6475726174696f6e3a2032733b7472616e73666f726d2d6f726967696e3a203335253b7472616e73666f726d2d626f783a66696c6c2d626f783b7d23777437383a686f7665722023753435207b7472616e73666f726d3a207363616c6528312e35293b7d3c2f7374796c653e3c672069643d27753435273e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc664736f6c634300080d0033

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

0000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59

-----Decoded View---------------
Arg [0] : descriptor_ (address): 0x4Ab96CD0B4C40de069550a271A74795b0570cd59

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000004ab96cd0b4c40de069550a271a74795b0570cd59


Deployed Bytecode Sourcemap

75493:27788:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76830:49;;;;;;;;;;-1:-1:-1;76830:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;76830:49:0;;;;;;;;90923:583;;;;;;;;;;-1:-1:-1;90923:583:0;;;;;:::i;:::-;;:::i;:::-;;96932:111;;;;;;;;;;-1:-1:-1;96932:111:0;;;;;:::i;:::-;;:::i;39112:305::-;;;;;;;;;;-1:-1:-1;39112:305:0;;;;;:::i;:::-;;:::i;:::-;;;1930:14:1;;1923:22;1905:41;;1893:2;1878:18;39112:305:0;1765:187:1;42225:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;90003:853::-;;;;;;:::i;:::-;;:::i;43728:204::-;;;;;;;;;;-1:-1:-1;43728:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3057:32:1;;;3039:51;;3027:2;3012:18;43728:204:0;2893:203:1;75596:33:0;;;;;;;;;;;;;;;;43291:371;;;;;;;;;;-1:-1:-1;43291:371:0;;;;;:::i;:::-;;:::i;95836:151::-;;;;;;;;;;-1:-1:-1;95836:151:0;;;;;:::i;:::-;;:::i;94266:134::-;;;;;;;;;;-1:-1:-1;94266:134:0;;;;;:::i;:::-;;:::i;38361:303::-;;;;;;;;;;-1:-1:-1;38615:12:0;;38599:13;;:28;38361:303;;75634:39;;;;;;;;;;;;;;;;102479:163;;;;;;;;;;-1:-1:-1;102479:163:0;;;;;:::i;:::-;;:::i;75772:49::-;;;;;;;;;;;;;;;;76886:37;;;;;;;;;;-1:-1:-1;76886:37:0;;;;-1:-1:-1;;;;;76886:37:0;;;92649:439;;;;;;:::i;:::-;;:::i;93094:201::-;;;;;;;;;;-1:-1:-1;93094:201:0;;;;;:::i;:::-;;:::i;76081:32::-;;;;;;;;;;-1:-1:-1;76081:32:0;;;;;;;;;;;;;;5144:4:1;5132:17;;;5114:36;;5102:2;5087:18;76081:32:0;4972:184:1;75872:31:0;;;;;;;;;;;;;;;;87514:530;;;;;;;;;;-1:-1:-1;87514:530:0;;;;;:::i;:::-;;:::i;95308:103::-;;;;;;;;;;-1:-1:-1;95308:103:0;;;;;:::i;:::-;;:::i;68969:143::-;;;;;;;;;;;;61389:42;68969:143;;102650:171;;;;;;;;;;-1:-1:-1;102650:171:0;;;;;:::i;:::-;;:::i;76731:51::-;;;;;;;;;;-1:-1:-1;76731:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;94768:88;;;;;;;;;;-1:-1:-1;94768:88:0;;;;;:::i;:::-;;:::i;75979:26::-;;;;;;;;;;-1:-1:-1;75979:26:0;;;;;;;;42033:125;;;;;;;;;;-1:-1:-1;42033:125:0;;;;;:::i;:::-;;:::i;95585:80::-;;;;;;;;;;-1:-1:-1;95585:80:0;;;;;:::i;:::-;;:::i;94976:99::-;;;;;;;;;;-1:-1:-1;94976:99:0;;;;;:::i;:::-;;:::i;94571:88::-;;;;;;;;;;-1:-1:-1;94571:88:0;;;;;:::i;:::-;;:::i;39481:206::-;;;;;;;;;;-1:-1:-1;39481:206:0;;;;;:::i;:::-;;:::i;34267:94::-;;;;;;;;;;;;;:::i;76217:54::-;;;;;;;;;;-1:-1:-1;76217:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;91570:523;;;;;;;;;;-1:-1:-1;91570:523:0;;;;;:::i;:::-;;:::i;97815:614::-;;;;;;;;;;-1:-1:-1;97815:614:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;95466:113::-;;;:::i;33616:87::-;;;;;;;;;;-1:-1:-1;33662:7:0;33689:6;-1:-1:-1;;;;;33689:6:0;33616:87;;94862:108;;;;;;;;;;-1:-1:-1;94862:108:0;;;;;:::i;:::-;;:::i;75678:42::-;;;;;;;;;;;;;;;;42394:104;;;;;;;;;;;;;:::i;75725:42::-;;;;;;;;;;;;;;;;44004:287;;;;;;;;;;-1:-1:-1;44004:287:0;;;;;:::i;:::-;;:::i;96173:103::-;;;;;;;;;;-1:-1:-1;96173:103:0;;;;;:::i;:::-;;:::i;75910:26::-;;;;;;;;;;;;;;;;95184:116;;;;;;;;;;-1:-1:-1;95184:116:0;;;;;:::i;:::-;;:::i;96282:103::-;;;;;;;;;;-1:-1:-1;96282:103:0;;;;;:::i;:::-;;:::i;89551:424::-;;;;;;;;;;-1:-1:-1;89551:424:0;;;;;:::i;:::-;;:::i;75826:41::-;;;;;;;;;;;;;;;;102829:228;;;;;;;;;;-1:-1:-1;102829:228:0;;;;;:::i;:::-;;:::i;92133:510::-;;;;;;:::i;:::-;;:::i;82800:122::-;;;;;;;;;;-1:-1:-1;82800:122:0;;;;;:::i;:::-;;:::i;75941:31::-;;;;;;;;;;;;;;;;88228:776;;;;;;;;;;-1:-1:-1;88228:776:0;;;;;:::i;:::-;;:::i;75564:27::-;;;;;;;;;;;;;;;;95993:151;;;;;;;;;;-1:-1:-1;95993:151:0;;;;;:::i;:::-;;:::i;44362:164::-;;;;;;;;;;-1:-1:-1;44362:164:0;;;;;:::i;:::-;;:::i;34516:192::-;;;;;;;;;;-1:-1:-1;34516:192:0;;;;;:::i;:::-;;:::i;94665:97::-;;;;;;;;;;-1:-1:-1;94665:97:0;;;;;:::i;:::-;;:::i;95083:93::-;;;;;;;;;;-1:-1:-1;95083:93:0;;;;;:::i;:::-;;:::i;94406:157::-;;;;;;;;;;;;;:::i;81504:745::-;;;;;;;;;;-1:-1:-1;81504:745:0;;;;;:::i;:::-;;:::i;90923:583::-;90982:14;90999:13;38615:12;;38599:13;;:28;;38361:303;90999:13;91027:9;;90982:30;;-1:-1:-1;91027:9:0;;;:14;91019:40;;;;-1:-1:-1;;;91019:40:0;;;;;;;:::i;:::-;;;;;;;;;91088:3;;91074:10;:6;91083:1;91074:10;:::i;:::-;:17;;91066:53;;;;-1:-1:-1;;;91066:53:0;;;;;;;:::i;:::-;91134:35;91150:10;91162:6;;91134:15;:35::i;:::-;91126:63;;;;-1:-1:-1;;;91126:63:0;;10070:2:1;91126:63:0;;;10052:21:1;10109:2;10089:18;;;10082:30;-1:-1:-1;;;10128:18:1;;;10121:45;10183:18;;91126:63:0;9868:339:1;91126:63:0;91221:10;91204:28;;;;:16;:28;;;;;;:33;91196:60;;;;-1:-1:-1;;;91196:60:0;;10414:2:1;91196:60:0;;;10396:21:1;10453:2;10433:18;;;10426:30;-1:-1:-1;;;10472:18:1;;;10465:44;10526:18;;91196:60:0;10212:338:1;91196:60:0;91280:10;91263:28;;;;:16;:28;;;;;:30;;;;;;:::i;:::-;;;;;;91305:9;91300:150;91324:1;91320;:5;91300:150;;;91400:15;91417:10;91429;91438:1;91429:6;:10;:::i;:::-;91383:57;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91383:57:0;;;;;;;;;91373:68;;91383:57;91373:68;;;;91341:9;91365:77;91351:10;91360:1;91351:6;:10;:::i;:::-;91341:21;;;;;;;;;;;-1:-1:-1;91341:21:0;:101;91327:3;;;;:::i;:::-;;;;91300:150;;;;91456:13;;;91476:24;91486:10;91498:1;91476:9;:24::i;:::-;90975:531;90923:583;;:::o;96932:111::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96997:10:::1;:40:::0;;-1:-1:-1;;;;;;96997:40:0::1;-1:-1:-1::0;;;;;96997:40:0;;;::::1;::::0;;;::::1;::::0;;96932:111::o;39112:305::-;39214:4;-1:-1:-1;;;;;;39251:40:0;;-1:-1:-1;;;39251:40:0;;:105;;-1:-1:-1;;;;;;;39308:48:0;;-1:-1:-1;;;39308:48:0;39251:105;:158;;;-1:-1:-1;;;;;;;;;;1711:40:0;;;39373:36;39231:178;39112:305;-1:-1:-1;;39112:305:0:o;42225:100::-;42279:13;42312:5;42305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42225:100;:::o;90003:853::-;90065:14;90082:13;38615:12;;38599:13;;:28;;38361:303;90082:13;90155:11;;90140:10;90102:12;90117:34;;;:22;:34;;;;;;90065:30;;-1:-1:-1;90102:12:0;90117:49;;:104;;90210:10;90187:34;;;;:22;:34;;;;;;90173:11;;:48;;90187:34;90173:48;:::i;:::-;90117:104;;;90169:1;90117:104;90102:119;;90228:13;90252:14;90244:4;:22;;:50;;90273:21;90290:4;90273:14;:21;:::i;:::-;90244:50;;;90269:1;90244:50;90309:9;;90228:66;;-1:-1:-1;90309:9:0;;90322:1;90309:14;90301:40;;;;-1:-1:-1;;;90301:40:0;;;;;;;:::i;:::-;90374:22;;90356:14;:40;;90348:61;;;;-1:-1:-1;;;90348:61:0;;12137:2:1;90348:61:0;;;12119:21:1;12176:1;12156:18;;;12149:29;-1:-1:-1;;;12194:18:1;;;12187:38;12242:18;;90348:61:0;11935:331:1;90348:61:0;90451:3;;90424:23;90433:14;90424:6;:23;:::i;:::-;:30;;90416:73;;;;-1:-1:-1;;;90416:73:0;;12473:2:1;90416:73:0;;;12455:21:1;12512:2;12492:18;;;12485:30;12551:32;12531:18;;;12524:60;12601:18;;90416:73:0;12271:354:1;90416:73:0;90526:9;90517:5;90504:10;;:18;;;;:::i;:::-;:31;90496:60;;;;-1:-1:-1;;;90496:60:0;;;;;;;:::i;:::-;90586:10;90563:34;;;;:22;:34;;;;;:52;;90601:14;;90563:34;:52;;90601:14;;90563:52;:::i;:::-;;;;-1:-1:-1;90629:9:0;;-1:-1:-1;90624:163:0;90648:14;90644:1;:18;90624:163;;;90737:15;90754:10;90766;90775:1;90766:6;:10;:::i;:::-;90720:57;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;90720:57:0;;;;;;;;;90710:68;;90720:57;90710:68;;;;90678:9;90702:77;90688:10;90697:1;90688:6;:10;:::i;:::-;90678:21;;;;;;;;;;;-1:-1:-1;90678:21:0;:101;90664:3;;;;:::i;:::-;;;;90624:163;;;;90793:13;;;90813:37;90823:10;90835:14;90813:9;:37::i;:::-;90058:798;;;90003:853;:::o;43728:204::-;43796:7;43821:16;43829:7;43821;:16::i;:::-;43816:64;;43846:34;;-1:-1:-1;;;43846:34:0;;;;;;;;;;;43816:64;-1:-1:-1;43900:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43900:24:0;;43728:204::o;43291:371::-;43364:13;43380:24;43396:7;43380:15;:24::i;:::-;43364:40;;43425:5;-1:-1:-1;;;;;43419:11:0;:2;-1:-1:-1;;;;;43419:11:0;;43415:48;;43439:24;;-1:-1:-1;;;43439:24:0;;;;;;;;;;;43415:48;19051:10;-1:-1:-1;;;;;43480:21:0;;;;;;:63;;-1:-1:-1;43506:37:0;43523:5;19051:10;44362:164;:::i;43506:37::-;43505:38;43480:63;43476:138;;;43567:35;;-1:-1:-1;;;43567:35:0;;;;;;;;;;;43476:138;43626:28;43635:2;43639:7;43648:5;43626:8;:28::i;95836:151::-;95927:4;95947:34;95957:15;95963:8;95957:5;:15::i;:::-;95974:6;;95947:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95947:9:0;;-1:-1:-1;;;95947:34:0:i;:::-;95940:41;95836:151;-1:-1:-1;;;;95836:151:0:o;94266:134::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94335:9:::1;::::0;94348:1:::1;94335:9;::::0;;::::1;:14;94331:64:::0;::::1;;94371:9;:22:::0;;-1:-1:-1;;94371:22:0::1;;::::0;::::1;;::::0;;94331:64:::1;94266:134:::0;:::o;102479:163::-;102580:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;102597:37:::1;102616:4;102622:2;102626:7;102597:18;:37::i;92649:439::-:0;92721:15;;;;;;;;;:20;92713:54;;;;-1:-1:-1;;;92713:54:0;;13350:2:1;92713:54:0;;;13332:21:1;13389:2;13369:18;;;13362:30;-1:-1:-1;;;13408:18:1;;;13401:51;13469:18;;92713:54:0;13148:345:1;92713:54:0;92801:17;;92782:16;;:36;92774:64;;;;-1:-1:-1;;;92774:64:0;;13700:2:1;92774:64:0;;;13682:21:1;13739:2;13719:18;;;13712:30;-1:-1:-1;;;13758:18:1;;;13751:45;13813:18;;92774:64:0;13498:339:1;92774:64:0;92867:17;92875:8;92867:7;:17::i;:::-;-1:-1:-1;;;;;92853:31:0;:10;-1:-1:-1;;;;;92853:31:0;;92845:65;;;;-1:-1:-1;;;92845:65:0;;14044:2:1;92845:65:0;;;14026:21:1;14083:2;14063:18;;;14056:30;-1:-1:-1;;;14102:18:1;;;14095:51;14163:18;;92845:65:0;13842:345:1;92845:65:0;92947:9;92925:18;;:31;92917:60;;;;-1:-1:-1;;;92917:60:0;;;;;;;:::i;:::-;93005:16;;:20;;93024:1;93005:20;:::i;:::-;92986:16;:39;93055:20;;;;:10;:20;;;;;;:24;;93078:1;93055:24;:::i;:::-;93032:20;;;;:10;:20;;;;;;:47;92649:439::o;93094:201::-;93187:17;93195:8;93187:7;:17::i;:::-;-1:-1:-1;;;;;93173:31:0;:10;-1:-1:-1;;;;;93173:31:0;;93165:69;;;;-1:-1:-1;;;93165:69:0;;14394:2:1;93165:69:0;;;14376:21:1;14433:2;14413:18;;;14406:30;14472:27;14452:18;;;14445:55;14517:18;;93165:69:0;14192:349:1;93165:69:0;93272:13;93283:2;93272:8;:13;:::i;:::-;93243:18;;;;:8;:18;;;;;;:43;;;;-1:-1:-1;93094:201:0:o;87514:530::-;87572:12;87613:13;38615:12;;38599:13;;:28;;38361:303;87613:13;87601:8;:25;;87593:51;;;;-1:-1:-1;;;87593:51:0;;14997:2:1;87593:51:0;;;14979:21:1;15036:2;15016:18;;;15009:30;-1:-1:-1;;;15055:18:1;;;15048:43;15108:18;;87593:51:0;14795:337:1;87593:51:0;87651:22;87676:25;87692:8;87676:15;:25::i;:::-;87740:10;;87762:9;;87651:50;;-1:-1:-1;;;;;;87740:10:0;;:21;;87651:50;;87740:10;;87762:9;;;;:::i;:::-;;;;;;;87740:32;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87740:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87740:32:0;;;;;;;;;;;;:::i;:::-;87781:10;;87802:9;;-1:-1:-1;;;;;87781:10:0;;;;:20;;87802:6;;87809:1;;87802:9;;;;;;:::i;:::-;;;;;;;87781:31;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87781:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87781:31:0;;;;;;;;;;;;:::i;:::-;87821:10;;87844:9;;-1:-1:-1;;;;;87821:10:0;;;;:22;;87844:6;;87851:1;;87844:9;;;;;;:::i;:::-;;;;;;;87821:33;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87821:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87821:33:0;;;;;;;;;;;;:::i;:::-;87863:10;;87888:9;;-1:-1:-1;;;;;87863:10:0;;;;:24;;87888:6;;87895:1;;87888:9;;;;;;:::i;:::-;;;;;;;87898:23;87912:8;87898:13;:23::i;:::-;87863:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87863:59:0;;;;;;;;;;;;:::i;:::-;87931:10;;87953:9;;-1:-1:-1;;;;;87931:10:0;;;;:21;;87953:6;;87960:1;;87953:9;;;;;;:::i;:::-;;;;;;;87963:23;87977:8;87963:13;:23::i;:::-;87931:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87931:56:0;;;;;;;;;;;;:::i;:::-;87996:10;;88021:9;;-1:-1:-1;;;;;87996:10:0;;;;:24;;88021:6;;88028:1;;88021:9;;;;;;:::i;:::-;;;;;;;87996:35;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87996:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87996:35:0;;;;;;;;;;;;:::i;:::-;87715:323;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87708:330;;;87514:530;;;:::o;95308:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95382:11:::1;:21:::0;95308:103::o;102650:171::-;102755:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;102772:41:::1;102795:4;102801:2;102805:7;102772:22;:41::i;94768:88::-:0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94831:11:::1;:17:::0;94768:88::o;42033:125::-;42097:7;42124:21;42137:7;42124:12;:21::i;:::-;:26;;42033:125;-1:-1:-1;;42033:125:0:o;95585:80::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95647:2:::1;:10:::0;;-1:-1:-1;;;;;;95647:10:0::1;-1:-1:-1::0;;;;;95647:10:0;;;::::1;::::0;;;::::1;::::0;;95585:80::o;94976:99::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95044:17:::1;:23:::0;94976:99::o;94571:88::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94638:3:::1;:13:::0;94571:88::o;39481:206::-;39545:7;-1:-1:-1;;;;;39569:19:0;;39565:60;;39597:28;;-1:-1:-1;;;39597:28:0;;;;;;;;;;;39565:60;-1:-1:-1;;;;;;39651:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;39651:27:0;;39481:206::o;34267:94::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;34332:21:::1;34350:1;34332:9;:21::i;:::-;34267:94::o:0;91570:523::-;91629:14;91646:13;38615:12;;38599:13;;:28;;38361:303;91646:13;91674:9;;91629:30;;-1:-1:-1;91674:9:0;;91687:1;91674:14;91666:40;;;;-1:-1:-1;;;91666:40:0;;;;;;;:::i;:::-;91735:3;;91721:10;:6;91730:1;91721:10;:::i;:::-;:17;;91713:53;;;;-1:-1:-1;;;91713:53:0;;;;;;;:::i;:::-;91781:35;91797:10;91809:6;;91781:15;:35::i;:::-;91773:63;;;;-1:-1:-1;;;91773:63:0;;10070:2:1;91773:63:0;;;10052:21:1;10109:2;10089:18;;;10082:30;-1:-1:-1;;;10128:18:1;;;10121:45;10183:18;;91773:63:0;9868:339:1;91773:63:0;91866:10;91851:26;;;;:14;:26;;;;;;:31;91843:58;;;;-1:-1:-1;;;91843:58:0;;10414:2:1;91843:58:0;;;10396:21:1;10453:2;10433:18;;;10426:30;-1:-1:-1;;;10472:18:1;;;10465:44;10526:18;;91843:58:0;10212:338:1;91843:58:0;91923:10;91908:26;;;;:14;:26;;;;;:28;;;;;;:::i;:::-;;;;;;91998:15;92015:10;92027:6;91981:53;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;91981:53:0;;;;;;;;;91971:64;;91981:53;91971:64;;;;91963:73;91943:17;;;:9;:17;;;;;:93;92063:24;92073:10;92085:1;92063:9;:24::i;97815:614::-;97885:16;97914;97933:19;97943:8;97933:9;:19::i;:::-;97914:38;;97963:24;98005:8;-1:-1:-1;;;;;97990:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97990:24:0;;97963:51;;98025:14;98050:20;98073:13;38615:12;;38599:13;;:28;;38361:303;98073:13;98050:36;;98102:9;98097:300;98121:12;98117:1;:16;98097:300;;;98155:12;98170:10;98178:1;98170:7;:10::i;:::-;98155:25;;98199:7;98195:191;;;98245:8;-1:-1:-1;;;;;98231:22:0;:10;98239:1;98231:7;:10::i;:::-;-1:-1:-1;;;;;98231:22:0;;98227:62;;98275:1;98257:7;98265:6;98257:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;98278:8;;;;:::i;:::-;;;;98227:62;98195:191;;;98328:7;98327:8;:38;;;;-1:-1:-1;98339:7:0;98347:12;98358:1;98347:8;:12;:::i;:::-;98339:21;;;;;;;;:::i;:::-;;;;;;;98364:1;98339:26;98327:38;98323:63;;;98369:14;;;;:::i;:::-;;;;98323:63;-1:-1:-1;98135:3:0;;;;:::i;:::-;;;;98097:300;;;-1:-1:-1;98414:7:0;;97815:614;-1:-1:-1;;;;;97815:614:0:o;95466:113::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95539:2:::1;::::0;95531:39:::1;::::0;-1:-1:-1;;;;;95539:2:0;;::::1;::::0;95548:21:::1;95531:39:::0;::::1;;;::::0;95539:2:::1;95531:39:::0;95539:2;95531:39;95548:21;95539:2;95531:39;::::1;;;;;;95523:48;;;::::0;::::1;94862:108:::0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94935:18:::1;:27:::0;94862:108::o;42394:104::-;42450:13;42483:7;42476:14;;;;;:::i;44004:287::-;19051:10;-1:-1:-1;;;;;44103:24:0;;;44099:54;;44136:17;;-1:-1:-1;;;44136:17:0;;;;;;;;;;;44099:54;19051:10;44166:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44166:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44166:53:0;;;;;;;;;;44235:48;;1905:41:1;;;44166:42:0;;19051:10;44235:48;;1878:18:1;44235:48:0;;;;;;;44004:287;;:::o;96173:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96243:13:::1;:27:::0;96173:103::o;95184:116::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95261:22:::1;:31:::0;95184:116::o;96282:103::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;96352:13:::1;:27:::0;96282:103::o;89551:424::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;89634:14:::1;89651:13;38615:12:::0;;38599:13;;:28;;38361:303;89651:13:::1;89706:3;::::0;89634:30;;-1:-1:-1;89679:23:0::1;89688:14:::0;89634:30;89679:23:::1;:::i;:::-;:30;;89671:66;;;;-1:-1:-1::0;;;89671:66:0::1;;;;;;;:::i;:::-;89749:9;89744:163;89768:14;89764:1;:18;89744:163;;;89857:15;89874:10;89886;89895:1:::0;89886:6;:10:::1;:::i;:::-;89840:57;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;89840:57:0;;::::1;::::0;;;;;;89830:68;;89840:57:::1;89830:68:::0;;::::1;::::0;89798:9:::1;89822:77;89808:10;89817:1:::0;89808:6;:10:::1;:::i;:::-;89798:21:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;89798:21:0;:101;89784:3;::::1;::::0;::::1;:::i;:::-;;;;89744:163;;;;89913:13;;;89933:36;89943:9;89954:14;89933:9;:36::i;102829:228::-:0;102980:4;-1:-1:-1;;;;;70477:18:0;;70485:10;70477:18;70473:83;;70512:32;70533:10;70512:20;:32::i;:::-;103002:47:::1;103025:4;103031:2;103035:7;103044:4;103002:22;:47::i;:::-;102829:228:::0;;;;;:::o;92133:510::-;92199:15;;;;;;;;;:20;92191:48;;;;-1:-1:-1;;;92191:48:0;;18522:2:1;92191:48:0;;;18504:21:1;18561:2;18541:18;;;18534:30;-1:-1:-1;;;18580:18:1;;;18573:45;18635:18;;92191:48:0;18320:339:1;92191:48:0;92268:11;;92254;;:25;92246:53;;;;-1:-1:-1;;;92246:53:0;;13700:2:1;92246:53:0;;;13682:21:1;13739:2;13719:18;;;13712:30;-1:-1:-1;;;13758:18:1;;;13751:45;13813:18;;92246:53:0;13498:339:1;92246:53:0;92328:17;92336:8;92328:7;:17::i;:::-;-1:-1:-1;;;;;92314:31:0;:10;-1:-1:-1;;;;;92314:31:0;;92306:65;;;;-1:-1:-1;;;92306:65:0;;14044:2:1;92306:65:0;;;14026:21:1;14083:2;14063:18;;;14056:30;-1:-1:-1;;;14102:18:1;;;14095:51;14163:18;;92306:65:0;13842:345:1;92306:65:0;92402:9;92386:12;;:25;92378:54;;;;-1:-1:-1;;;92378:54:0;;;;;;;:::i;:::-;92455:11;;:15;;92469:1;92455:15;:::i;:::-;92441:11;:29;92534:15;92551:10;92563:12;:8;92574:1;92563:12;:::i;:::-;92517:59;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;92517:59:0;;;;;;;;;92507:70;;92517:59;92507:70;;;;92499:79;92477:19;;;:9;:19;;;;;:101;92632:4;92622:7;:5;:7::i;:::-;:14;;;;:::i;:::-;92585:26;;;;:16;:26;;;;;;:52;92133:510::o;82800:122::-;82854:13;82883:33;82893:1;82896:19;82906:8;82896:9;:19::i;:::-;82883:9;:33::i;88228:776::-;88301:13;88331:16;88339:7;88331;:16::i;:::-;88323:44;;;;-1:-1:-1;;;88323:44:0;;18866:2:1;88323:44:0;;;18848:21:1;18905:2;18885:18;;;18878:30;-1:-1:-1;;;18924:18:1;;;18917:45;18979:18;;88323:44:0;18664:339:1;88323:44:0;88375:17;88394:24;88422:18;88432:7;88422:9;:18::i;:::-;88374:66;;;;88553:425;88644:17;88653:7;88644:8;:17::i;:::-;88666:19;;;;:10;:19;;;;;;;;;88574:391;;;;;88666:19;88842:10;;88926:3;;88574:391;;:::i;:::-;;;;;;;;;;;;;88553:6;:425::i;:::-;88480:509;;;;;;;;:::i;:::-;;;;;;;;;;;;;88449:549;;;;88228:776;;;:::o;95993:151::-;96084:4;96104:34;96114:15;96120:8;96114:5;:15::i;:::-;96131:6;;96104:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96104:9:0;;-1:-1:-1;;;96104:34:0:i;44362:164::-;-1:-1:-1;;;;;44483:25:0;;;44459:4;44483:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44362:164::o;34516:192::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34605:22:0;::::1;34597:73;;;::::0;-1:-1:-1;;;34597:73:0;;22792:2:1;34597:73:0::1;::::0;::::1;22774:21:1::0;22831:2;22811:18;;;22804:30;22870:34;22850:18;;;22843:62;-1:-1:-1;;;22921:18:1;;;22914:36;22967:19;;34597:73:0::1;22590:402:1::0;34597:73:0::1;34681:19;34691:8;34681:9;:19::i;94665:97::-:0;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94733:12:::1;:21:::0;94665:97::o;95083:93::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;95149:10:::1;:19:::0;95083:93::o;94406:157::-;33662:7;33689:6;-1:-1:-1;;;;;33689:6:0;19051:10;33836:23;33828:68;;;;-1:-1:-1;;;33828:68:0;;;;;;;:::i;:::-;94467:15:::1;::::0;::::1;::::0;::::1;;;;:20:::0;94463:95:::1;;94498:15;:19:::0;;-1:-1:-1;;94498:19:0::1;::::0;;34267:94::o;94463:95::-:1;94537:15;:19:::0;;-1:-1:-1;;94537:19:0::1;;;::::0;;94406:157::o;81504:745::-;81557:13;81597:5;81581:13;81689:4;81680:5;81657:10;81665:2;81597:5;81657:10;:::i;:::-;81656:19;;81671:4;81656:19;:::i;:::-;81637:39;;:15;:39;:::i;:::-;81636:49;;;;:::i;:::-;81635:58;;;;:::i;:::-;81611:83;-1:-1:-1;81703:13:0;81754:2;81728:22;81746:4;81728:15;:22;:::i;:::-;81727:29;;;;:::i;:::-;81766:22;;;;;;;;;:17;:22;;81797:21;;;;;;;;;;-1:-1:-1;;;81797:21:0;;;;81827:27;;;;;;;;;;;-1:-1:-1;;;81827:27:0;;;;;;;81703:54;;-1:-1:-1;81766:22:0;81797:21;81875:2;81867:10;;81863:178;;;81892:11;;;;;;;;;;;;;-1:-1:-1;;;81892:11:0;;;;;81920:5;81929:1;81920:10;81916:37;;81941:10;:5;81949:2;81941:10;:::i;:::-;81933:18;;81916:37;81863:178;;;81980:11;;;;;;;;;;;;;-1:-1:-1;;;81980:11:0;;;;;82016:2;82008:5;:10;82004:36;;;82028:10;82036:2;82028:5;:10;:::i;:::-;82020:18;;82004:36;82061:2;82053:5;:10;82049:28;;;82066:9;;;;;;;;;;;;;-1:-1:-1;;;82066:9:0;;;;;82049:28;82097:2;82089:5;:10;82085:55;;;-1:-1:-1;82101:13:0;;;;;;;;;;;;-1:-1:-1;;;82101:13:0;;;;82127:10;82135:2;82127:5;:10;:::i;:::-;82123:15;;:2;:15;:::i;:::-;82115:23;;82085:55;82179:15;82188:5;82179:8;:15::i;:::-;82195:2;82198:15;82207:5;82198:8;:15::i;:::-;82214:3;82218;82222:15;82231:5;82222:8;:15::i;:::-;82162:80;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82148:95;;;;;;;;81504:745;;;:::o;46046:104::-;46115:27;46125:2;46129:8;46115:27;;;;;;;;;;;;:9;:27::i;:::-;46046:104;;:::o;45788:174::-;45845:4;45909:13;;45899:7;:23;45869:85;;;;-1:-1:-1;;45927:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;45927:27:0;;;;45926:28;;45788:174::o;55112:196::-;55227:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;55227:29:0;-1:-1:-1;;;;;55227:29:0;;;;;;;;;55272:28;;55227:24;;55272:28;;;;;;;55112:196;;;:::o;96430:122::-;96519:26;;-1:-1:-1;;24696:2:1;24692:15;;;24688:53;96519:26:0;;;24676:66:1;96486:7:0;;24758:12:1;;96519:26:0;;;;;;;;;;;;96509:37;;;;;;96502:44;;96430:122;;;:::o;96577:156::-;96659:4;96679:48;96698:6;96706:13;;96721:5;96679:18;:48::i;:::-;96672:55;96577:156;-1:-1:-1;;;96577:156:0:o;70894:647::-;61389:42;71085:45;:49;71081:453;;71384:67;;-1:-1:-1;;;71384:67:0;;71435:4;71384:67;;;24993:34:1;-1:-1:-1;;;;;25063:15:1;;25043:18;;;25036:43;61389:42:0;;71384;;24928:18:1;;71384:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71379:144;;71479:28;;-1:-1:-1;;;71479:28:0;;-1:-1:-1;;;;;3057:32:1;;71479:28:0;;;3039:51:1;3012:18;;71479:28:0;2893:203:1;44593:170:0;44727:28;44737:4;44743:2;44747:7;44727:9;:28::i;83120:1046::-;83208:12;83223:18;;;:9;:18;;;;;;83185:15;;83279:24;83223:18;83292:1;83233:7;83279:6;:24::i;:::-;83335:15;;;83348:1;83335:15;;;;;;;;;83248:55;;-1:-1:-1;83310:22:0;;83335:15;;;;;;;;;-1:-1:-1;;83386:8:0;83371:44;;;;;;;;;;;;;;;;;;;83310:40;;-1:-1:-1;83371:44:0;;;-1:-1:-1;83371:44:0;;83386:8;83371:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83399:12;83412:1;83399:15;;;;;;;;:::i;:::-;;;;;;;83371:44;;:14;:44::i;:::-;83359:6;83366:1;83359:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83434:44;;;;;;;;;;;;;;;;;;;;;;;;;83359:9;83434:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83462:12;83475:1;83462:15;;;;;;;;:::i;83434:44::-;83422:6;83429:1;83422:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83512:11;83497:44;;;;;;;;;;;;;;;;;;;;;;83512:11;83497:44;;;83512:11;83497:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83525:12;83538:1;83525:15;;;;;;;;:::i;83497:44::-;83485:6;83492:1;83485:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83575:11;83560:44;;;;;;;;;;;;;;;;;;;;;;83575:11;83560:44;;;83575:11;83560:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83588:12;83601:1;83588:15;;;;;;;;:::i;83560:44::-;83548:6;83555:1;83548:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83638:11;83623:44;;;;;;;;;;;;;;;;;;;;;;83638:11;83623:44;;;83638:11;83623:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83651:12;83664:1;83651:15;;;;;;;;:::i;83623:44::-;83611:6;83618:1;83611:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83701:11;83686:44;;;;;;;;;;;;;;;;;;;;;;83701:11;83686:44;;;83701:11;83686:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83714:12;83727:1;83714:15;;;;;;;;:::i;83686:44::-;83674:6;83681:1;83674:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83764:11;83749:44;;;;;;;;;;;;;;;;;;;;;;83764:11;83749:44;;;83764:11;83749:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83777:12;83790:1;83777:15;;;;;;;;:::i;83749:44::-;83737:6;83744:1;83737:9;;;;;;;;:::i;:::-;:56;;;;;:9;;;;;;;;;;:56;83827:11;83812:44;;;;;;;;;;;;;;;;;;;;;;83827:11;83812:44;;;83827:11;83812:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83840:12;83853:1;83840:15;;;;;;;;:::i;83812:44::-;83800:6;83807:1;83800:9;;;;;;;;:::i;:::-;;;;;;:56;;;;;;;;;;;83869:6;83876:1;83869:9;;;;;;;;:::i;:::-;;;;;;;:15;;83882:2;83869:15;83865:51;;83907:1;83895:6;83902:1;83895:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;83865:51;83948:6;83955:1;83948:9;;;;;;;;:::i;:::-;;;;;;;:14;;83961:1;83948:14;:32;;;;83966:6;83973:1;83966:9;;;;;;;;:::i;:::-;;;;;;;:14;;83979:1;83966:14;83948:32;:50;;;;83984:6;83991:1;83984:9;;;;;;;;:::i;:::-;;;;;;;:14;;83997:1;83984:14;83948:50;83944:86;;;84021:1;84009:6;84016:1;84009:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;83944:86;84070:6;84077:1;84070:9;;;;;;;;:::i;:::-;;;;;;;:14;;84083:1;84070:14;84066:50;;84107:1;84095:6;84102:1;84095:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;84156:6;83120:1046;-1:-1:-1;;;;83120:1046:0:o;93773:360::-;93837:27;;:::i;:::-;93875:18;93945:19;;;:9;:19;;;;;;;;;93972:10;:20;;;;;;93896:104;;93945:19;93967:25;;:2;:25;:::i;:::-;93934:59;;;;;;25514:25:1;;;;25555:18;;25548:34;25487:18;;93934:59:0;;;;;;;;;;;;93924:70;;;;;;93916:79;;93997:2;93896:19;:104::i;:::-;93875:125;;94013:6;94009:94;94025:1;94022;:4;94009:94;;94066:26;94075:3;94077:1;94075;:3;:::i;:::-;:5;;94079:1;94075:5;:::i;:::-;94081:3;94083:1;94081;:3;:::i;:::-;:5;;94085:1;94081:5;:::i;:::-;94087:4;94066:8;:26::i;:::-;94044:9;94054:1;94044:12;;;;;;;:::i;:::-;;;;:49;94027:3;;;;:::i;:::-;;;;94009:94;;;;94111:16;93773:360;;;:::o;44834:185::-;44972:39;44989:4;44995:2;44999:7;44972:39;;;;;;;;;;;;:16;:39::i;40862:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;40973:7:0;41056:13;;41049:4;:20;41018:886;;;41090:31;41124:17;;;:11;:17;;;;;;;;;41090:51;;;;;;;;;-1:-1:-1;;;;;41090:51:0;;;;-1:-1:-1;;;41090:51:0;;-1:-1:-1;;;;;41090:51:0;;;;;;;;-1:-1:-1;;;41090:51:0;;;;;;;;;;;;;;41160:729;;41210:14;;-1:-1:-1;;;;;41210:28:0;;41206:101;;41274:9;40862:1109;-1:-1:-1;;;40862:1109:0:o;41206:101::-;-1:-1:-1;;;41649:6:0;41694:17;;;;:11;:17;;;;;;;;;41682:29;;;;;;;;;-1:-1:-1;;;;;41682:29:0;;;;;-1:-1:-1;;;41682:29:0;;-1:-1:-1;;;;;41682:29:0;;;;;;;;-1:-1:-1;;;41682:29:0;;;;;;;;;;;;;41742:28;41738:109;;41810:9;40862:1109;-1:-1:-1;;;40862:1109:0:o;41738:109::-;41609:261;;;41071:833;41018:886;41932:31;;-1:-1:-1;;;41932:31:0;;;;;;;;;;;34716:173;34772:16;34791:6;;-1:-1:-1;;;;;34808:17:0;;;-1:-1:-1;;;;;;34808:17:0;;;;;;34841:40;;34791:6;;;;;;;34841:40;;34772:16;34841:40;34761:128;34716:173;:::o;45090:369::-;45257:28;45267:4;45273:2;45277:7;45257:9;:28::i;:::-;-1:-1:-1;;;;;45300:13:0;;10384:20;10432:8;;45300:76;;;;;45320:56;45351:4;45357:2;45361:7;45370:5;45320:30;:56::i;:::-;45319:57;45300:76;45296:156;;;45400:40;;-1:-1:-1;;;45400:40:0;;;;;;;;;;;82681:113;82721:7;82753:26;82771:8;82753:15;:26;:::i;:::-;82752:35;;82783:4;82752:35;:::i;:::-;82737:51;;82681:113;:::o;101948:408::-;102007:7;102025:16;102044:7;:5;:7::i;:::-;102025:26;-1:-1:-1;102060:14:0;102123:47;102138:8;102147:1;102138:11;102123:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;102151:18:0;;;;:9;:18;;;;;;;-1:-1:-1;102123:14:0;;-1:-1:-1;102123:47:0:i;:::-;102077:93;;102116:4;102088:16;:25;102105:7;102088:25;;;;;;;;;;;;102077:8;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:93;;;;:::i;:::-;102060:110;;102193:2;102183:6;:12;102179:170;;-1:-1:-1;102223:1:0;;101948:408;-1:-1:-1;;;101948:408:0:o;102179:170::-;102262:1;102252:6;:11;102248:101;;-1:-1:-1;102291:1:0;;101948:408;-1:-1:-1;;;101948:408:0:o;81363:135::-;81436:13;81465:12;81478:6;81465:20;;;;;;;:::i;:::-;;81486:5;81465:27;;;;;;;;:::i;:::-;;;;;;;;81458:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81363:135;;;;:::o;84531:1347::-;84590:17;;84661:7;84642:16;84700:24;84661:7;84700:15;:24::i;:::-;84675:49;;84752:17;84772:55;84798:6;84813:7;84772:17;:55::i;:::-;84752:75;;84842:12;84849:4;84842:6;:12::i;:::-;84836:18;;84980:24;85050:48;;;;;;;;;;;;;;-1:-1:-1;;;85050:48:0;;;85071:23;85081:1;85084:6;85091:1;85084:9;;;;;;;;:::i;:::-;;;;;;;85071:23;;:9;:23::i;:::-;85096:1;85050:12;:48::i;:::-;85107:51;;;;;;;;;;;;;;-1:-1:-1;;;85107:51:0;;;85131:23;85141:1;85144:6;85151:1;85144:9;;;;;;;;:::i;85107:51::-;85167;;;;;;;;;;;;;;-1:-1:-1;;;85167:51:0;;;85191:23;85201:1;85204:6;85211:1;85204:9;;;;;;;;:::i;85167:51::-;85227:48;;;;;;;;;;;;;;-1:-1:-1;;;85227:48:0;;;85248:23;85258:1;85261:6;85268:1;85261:9;;;;;;;;:::i;85227:48::-;85284:47;;;;;;;;;;;;;;-1:-1:-1;;;85284:47:0;;;85304:23;85314:1;85317:6;85324:1;85317:9;;;;;;;;:::i;85284:47::-;85340:51;;;;;;;;;;;;;;-1:-1:-1;;;85340:51:0;;;85364:23;85374:1;85377:6;85384:1;85377:9;;;;;;;;:::i;85340:51::-;85400:49;;;;;;;;;;;;;;-1:-1:-1;;;85400:49:0;;;85422:23;85432:1;85435:6;85442:1;85435:9;;;;;;;;:::i;85400:49::-;85025:431;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85011:445;;85463:24;85515:11;85535:52;;;;;;;;;;;;;;-1:-1:-1;;;85535:52:0;;;85556:27;85564:8;:18;85573:8;85564:18;;;;;;;;;;;;85556:7;:27::i;85535:52::-;85596:36;;;;;;;;;;;;;;-1:-1:-1;;;85596:36:0;;;85619:9;:7;:9::i;85596:36::-;85641:58;;;;;;;;;;;;;;-1:-1:-1;;;85641:58:0;;;85663:33;85673:1;85676:19;85686:8;85676:9;:19::i;85641:58::-;85708:65;;;;;;;;;;;;;;-1:-1:-1;;;85708:65:0;;;85736:33;85746:1;85749:19;85759:8;85749:9;:19::i;85736:33::-;85771:1;85708:12;:65::i;:::-;85490:290;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85463:317;;85824:11;85807:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;85787:50;;85848:24;;;;;84531:1347;;;:::o;98482:498::-;98535:27;98578:2;98584:1;98578:7;98574:40;;-1:-1:-1;;98596:10:0;;;;;;;;;;;;-1:-1:-1;;;98596:10:0;;;;;98482:498::o;98574:40::-;98632:2;98620:9;98659:53;98666:6;;98659:53;;98683:5;;;;:::i;:::-;;-1:-1:-1;98697:7:0;;-1:-1:-1;98702:2:0;98697:7;;:::i;:::-;;;98659:53;;;98718:17;98748:3;-1:-1:-1;;;;;98738:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;98738:14:0;-1:-1:-1;98718:34:0;-1:-1:-1;98771:3:0;98781:168;98788:7;;98781:168;;98810:5;98814:1;98810;:5;:::i;:::-;98806:9;-1:-1:-1;98824:10:0;98855:7;98860:2;98855;:7;:::i;:::-;98854:14;;98866:2;98854:14;:::i;:::-;98849:19;;:2;:19;:::i;:::-;98838:31;;:2;:31;:::i;:::-;98824:46;;98879:9;98898:4;98891:12;;98879:24;;98922:2;98912:4;98917:1;98912:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;98912:12:0;;;;;;;;-1:-1:-1;98933:8:0;98939:2;98933:8;;:::i;:::-;;;98797:152;;98781:168;;;-1:-1:-1;98969:4:0;98482:498;-1:-1:-1;;;;98482:498:0:o;99213:2037::-;99271:13;99301:4;:11;99316:1;99301:16;99297:31;;-1:-1:-1;;99319:9:0;;;;;;;;;-1:-1:-1;99319:9:0;;;99213:2037::o;99297:31::-;99388:19;99410:5;;;;;;;;;;;;;;;;;99388:27;;99467:18;99513:1;99494:4;:11;99508:1;99494:15;;;;:::i;:::-;99493:21;;;;:::i;:::-;99488:27;;:1;:27;:::i;:::-;99467:48;-1:-1:-1;99598:20:0;99632:15;99467:48;99645:2;99632:15;:::i;:::-;-1:-1:-1;;;;;99621:27:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;99621:27:0;;99598:50;;99745:10;99737:6;99730:26;99852:1;99845:5;99841:13;99923:4;99974;99968:11;99959:7;99955:25;100082:2;100074:6;100070:15;100167:810;100186:6;100177:7;100174:19;100167:810;;;100252:1;100239:15;;;100333:14;;100486:4;100474:2;100470:14;;;100466:25;;100452:40;;100446:47;100441:3;100437:57;;;100419:76;;100614:2;100610:14;;;100606:25;;100592:40;;100586:47;100577:57;;100540:1;100525:17;;100559:76;100755:1;100750:14;;;100746:25;;100732:40;;100726:47;100717:57;;100665:17;;;100699:76;100886:25;;100872:40;;100866:47;100857:57;;100805:17;;;100839:76;;;;100945:17;;100167:810;;;101062:1;101055:4;101049:11;101045:19;101083:1;101078:54;;;;101151:1;101146:52;;;;101038:160;;101078:54;-1:-1:-1;;;;;101094:17:0;;101087:43;101078:54;;101146:52;-1:-1:-1;;;;;101162:17:0;;101155:41;101038:160;-1:-1:-1;101236:6:0;;99213:2037;-1:-1:-1;;;;;;;;99213:2037:0:o;96739:156::-;96821:4;96841:48;96860:6;96868:13;;96883:5;96841:18;:48::i;46524:1751::-;46670:13;;-1:-1:-1;;;;;46698:16:0;;46694:48;;46723:19;;-1:-1:-1;;;46723:19:0;;;;;;;;;;;46694:48;46757:8;46769:1;46757:13;46753:44;;46779:18;;-1:-1:-1;;;46779:18:0;;;;;;;;;;;46753:44;-1:-1:-1;;;;;47148:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;47207:49:0;;-1:-1:-1;;;;;47148:44:0;;;;;;;47207:49;;;;-1:-1:-1;;47148:44:0;;;;;;47207:49;;;;;;;;;;;;;;;;47273:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;47323:66:0;;;-1:-1:-1;;;47373:15:0;47323:66;;;;;;;;;;;;;47273:25;;47470:23;;;;10384:20;10432:8;47510:633;;47550:314;47581:38;;47606:12;;-1:-1:-1;;;;;47581:38:0;;;47598:1;;47581:38;;47598:1;;47581:38;47647:69;47686:1;47690:2;47694:14;;;;;;47710:5;47647:30;:69::i;:::-;47642:174;;47752:40;;-1:-1:-1;;;47752:40:0;;;;;;;;;;;47642:174;47859:3;47843:12;:19;47550:314;;47945:12;47928:13;;:29;47924:43;;47959:8;;;47924:43;47510:633;;;48008:120;48039:40;;48064:14;;;;;-1:-1:-1;;;;;48039:40:0;;;48056:1;;48039:40;;48056:1;;48039:40;48123:3;48107:12;:19;48008:120;;47510:633;-1:-1:-1;48157:13:0;:28;48207:60;48236:1;48240:2;48244:12;48258:8;48207:60;:::i;59922:190::-;60047:4;60100;60071:25;60084:5;60091:4;60071:12;:25::i;:::-;:33;;59922:190;-1:-1:-1;;;;59922:190:0:o;49962:2228::-;50077:35;50115:21;50128:7;50115:12;:21::i;:::-;50077:59;;50175:4;-1:-1:-1;;;;;50153:26:0;:13;:18;;;-1:-1:-1;;;;;50153:26:0;;50149:67;;50188:28;;-1:-1:-1;;;50188:28:0;;;;;;;;;;;50149:67;50229:22;19051:10;-1:-1:-1;;;;;50255:20:0;;;;:73;;-1:-1:-1;50292:36:0;50309:4;19051:10;44362:164;:::i;50292:36::-;50255:126;;;-1:-1:-1;19051:10:0;50345:20;50357:7;50345:11;:20::i;:::-;-1:-1:-1;;;;;50345:36:0;;50255:126;50229:153;;50400:17;50395:66;;50426:35;;-1:-1:-1;;;50426:35:0;;;;;;;;;;;50395:66;-1:-1:-1;;;;;50476:16:0;;50472:52;;50501:23;;-1:-1:-1;;;50501:23:0;;;;;;;;;;;50472:52;50645:35;50662:1;50666:7;50675:4;50645:8;:35::i;:::-;-1:-1:-1;;;;;50976:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;50976:31:0;;;-1:-1:-1;;;;;50976:31:0;;;-1:-1:-1;;50976:31:0;;;;;;;51022:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51022:29:0;;;;;;;;;;;51102:20;;;:11;:20;;;;;;51137:18;;-1:-1:-1;;;;;;51170:49:0;;;;-1:-1:-1;;;51203:15:0;51170:49;;;;;;;;;;51493:11;;51553:24;;;;;51596:13;;51102:20;;51553:24;;51596:13;51592:384;;51806:13;;51791:11;:28;51787:174;;51844:20;;51913:28;;;;-1:-1:-1;;;;;51887:54:0;-1:-1:-1;;;51887:54:0;-1:-1:-1;;;;;;51887:54:0;;;-1:-1:-1;;;;;51844:20:0;;51887:54;;;;51787:174;50951:1036;;;52023:7;52019:2;-1:-1:-1;;;;;52004:27:0;52013:4;-1:-1:-1;;;;;52004:27:0;;;;;;;;;;;52107:10;10384:20;10432:8;52095:88;;52146:25;52163:7;52146:16;:25::i;97104:526::-;97194:30;97266:1;-1:-1:-1;;;;;97253:15:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97253:15:0;;97236:32;;97280:9;97275:322;97299:1;97295;:5;97275:322;;;97320:1;97325;97320:6;97316:274;;97359:130;97391:13;97406:5;:1;97410;97406:5;:::i;:::-;97443:18;;;;:8;:18;;;;;;97480:5;;97435:32;;97465:2;;97435:32;:::i;:::-;97434:41;;97471:4;97434:41;:::i;:::-;97415:61;;:15;:61;:::i;:::-;97414:71;;;;:::i;:::-;97380:107;;;;;;28770:25:1;;;;28811:18;;28804:34;;;;28854:18;;;28847:34;28743:18;;97380:107:0;;;;;;;;;;;;;97370:118;;;;;;97759:2;97668:101;97359:130;97339:14;97354:1;97339:17;;;;;;;;:::i;:::-;;;;;;:150;;;;;;;;;;;97316:274;;;97533:55;97565:13;97580:5;:1;97584;97580:5;:::i;:::-;97554:32;;;;;;25514:25:1;;;;25555:18;;25548:34;25487:18;;97554:32:0;25340:248:1;97533:55:0;97513:14;97528:1;97513:17;;;;;;;;:::i;:::-;;;;;;:75;;;;;;;;;;;97316:274;97302:3;;;;:::i;:::-;;;;97275:322;;;;97104:526;;;;;:::o;85983:501::-;86101:12;;86148:20;86163:5;86148:12;:20;:::i;:::-;86122:47;-1:-1:-1;86176:17:0;86216:1;86200:264;86224:17;:24;86219:1;:29;;;86200:264;;86264:17;86284;86302:1;86284:20;;;;;;;;;;:::i;:::-;;;;;;;86264:40;;86344:10;86331;:23;;;;:::i;:::-;86319:35;;:9;:35;;;:62;;;;;86371:10;86358:23;;:9;:23;;;;86319:62;86315:97;;;-1:-1:-1;86401:1:0;-1:-1:-1;86394:8:0;;-1:-1:-1;;86394:8:0;86315:97;86433:23;86446:10;86433;:23;:::i;:::-;86420:36;;86255:209;86250:3;;;;;:::i;:::-;;;;86200:264;;;;86470:8;;;8837:451;8912:13;8938:19;8970:10;8974:6;8970:1;:10;:::i;:::-;:14;;8983:1;8970:14;:::i;:::-;-1:-1:-1;;;;;8960:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8960:25:0;;8938:47;;-1:-1:-1;;;8996:6:0;9003:1;8996:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;8996:15:0;;;;;;;;;-1:-1:-1;;;9022:6:0;9029:1;9022:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;9022:15:0;;;;;;;;-1:-1:-1;9053:9:0;9065:10;9069:6;9065:1;:10;:::i;:::-;:14;;9078:1;9065:14;:::i;:::-;9053:26;;9048:135;9085:1;9081;:5;9048:135;;;-1:-1:-1;;;9133:5:0;9141:3;9133:11;9120:25;;;;;;;:::i;:::-;;;;9108:6;9115:1;9108:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;9108:37:0;;;;;;;;-1:-1:-1;9170:1:0;9160:11;;;;;9088:3;;;:::i;:::-;;;9048:135;;;-1:-1:-1;9201:10:0;;9193:55;;;;-1:-1:-1;;;9193:55:0;;29666:2:1;9193:55:0;;;29648:21:1;;;29685:18;;;29678:30;29744:34;29724:18;;;29717:62;29796:18;;9193:55:0;29464:356:1;93437:291:0;93526:13;93552:14;93579:9;93583:5;93579:3;:9;:::i;:::-;:11;;93589:1;93579:11;:::i;:::-;-1:-1:-1;;;;;93569:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;93569:22:0;;93552:39;;93606:6;93602:86;93618:9;93622:5;93618:3;:9;:::i;:::-;93615:1;:12;93602:86;;93660:4;93674:1;93666:7;93668:5;93666:1;:7;:::i;:::-;:9;;;;:::i;:::-;93654:22;;;;;;;;:::i;:::-;;;;;;;;;93647:1;93649;93647:4;;;;;;;;:::i;:::-;;;;:29;-1:-1:-1;;;;;93647:29:0;;;;;;;;-1:-1:-1;93628:3:0;;;;:::i;:::-;;;;93602:86;;55800:667;55984:72;;-1:-1:-1;;;55984:72:0;;55963:4;;-1:-1:-1;;;;;55984:36:0;;;;;:72;;19051:10;;56035:4;;56041:7;;56050:5;;55984:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55984:72:0;;;;;;;;-1:-1:-1;;55984:72:0;;;;;;;;;;;;:::i;:::-;;;55980:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56218:6;:13;56235:1;56218:18;56214:235;;56264:40;;-1:-1:-1;;;56264:40:0;;;;;;;;;;;56214:235;56407:6;56401:13;56392:6;56388:2;56384:15;56377:38;55980:480;-1:-1:-1;;;;;;56103:55:0;-1:-1:-1;;;56103:55:0;;-1:-1:-1;55800:667:0;;;;;;:::o;86554:937::-;86647:12;86668:18;86714:7;;;;;;;;;;;;;;;;;86730:10;;86752;;-1:-1:-1;;;;;86730:10:0;;;;:21;;86752:7;;86730:10;;86752;;;;:::i;:::-;;;;;;;86730:33;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86730:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86730:33:0;;;;;;;;;;;;:::i;:::-;86772:10;;86793;;-1:-1:-1;;;;;86772:10:0;;;;:20;;86793:7;;86801:1;;86793:10;;;;;;:::i;:::-;;;;;;;86772:32;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86772:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86772:32:0;;;;;;;;;;;;:::i;:::-;86813:10;;86836;;-1:-1:-1;;;;;86813:10:0;;;;:22;;86836:7;;86844:1;;86836:10;;;;;;:::i;:::-;;;;;;;86813:34;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86813:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86813:34:0;;;;;;;;;;;;:::i;:::-;86856:10;;86881;;-1:-1:-1;;;;;86856:10:0;;;;:24;;86881:7;;86889:1;;86881:10;;;;;;:::i;:::-;;;;;;;86892:23;86906:8;86892:13;:23::i;:::-;86856:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86856:60:0;;;;;;;;;;;;:::i;:::-;86925:10;;86947;;-1:-1:-1;;;;;86925:10:0;;;;:21;;86947:7;;86955:1;;86947:10;;;;;;:::i;:::-;;;;;;;86958:23;86972:8;86958:13;:23::i;:::-;86925:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86925:57:0;;;;;;;;;;;;:::i;:::-;86991:10;;87016;;-1:-1:-1;;;;;86991:10:0;;;;:24;;87016:7;;87024:1;;87016:10;;;;;;:::i;:::-;;;;;;;86991:36;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;86991:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86991:36:0;;;;;;;;;;;;:::i;:::-;87036:4;;;;;;;;;;;;;-1:-1:-1;;;87036:4:0;;;86689:358;;;;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;86689:358:0;;;;;;;87095:10;;-1:-1:-1;;;87095:25:0;;:10;:25;;;529::1;86689:358:0;;-1:-1:-1;;;;;;87095:10:0;;:22;;502:18:1;;87095:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87095:25:0;;;;;;;;;;;;:::i;:::-;87131:10;;87156;;-1:-1:-1;;;;;87131:10:0;;;;:24;;87156:7;;87131:10;;87156;;;;;;:::i;:::-;;;;;;;87168:8;:18;87177:8;87168:18;;;;;;;;;;;;87131:56;;;;;;;;;;;;;;;32600:6:1;32588:19;;;;32570:38;;32639:2;32624:18;;32617:34;32558:2;32543:18;;32397:260;87131:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87131:56:0;;;;;;;;;;;;:::i;:::-;87198:10;;-1:-1:-1;;;;;87198:10:0;:27;87226:19;87236:8;87226:9;:19::i;:::-;87198:48;;;;;;;;;;;;;529:25:1;;517:2;502:18;;383:177;87198:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87198:48:0;;;;;;;;;;;;:::i;:::-;87273:10;;87299;;87257:5;;-1:-1:-1;;;;;87273:10:0;;:25;;87299:7;;87273:10;;87299;;;;;;:::i;:::-;;;;;;;87273:37;;;;;;;;;;;;;;15444:6:1;15432:19;;;;15414:38;;15402:2;15387:18;;15269:189;87273:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87273:37:0;;;;;;;;;;;;:::i;:::-;87321:10;;-1:-1:-1;;;;;87321:10:0;:26;87348:19;87358:8;87348:9;:19::i;:::-;87321:47;;;;;;;;;;;;;529:25:1;;517:2;502:18;;383:177;87321:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87321:47:0;;;;;;;;;;;;:::i;:::-;87379:10;;:25;;-1:-1:-1;;;87379:25:0;;87402:1;87379:25;;;529::1;-1:-1:-1;;;;;87379:10:0;;;;:22;;502:18:1;;87379:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87379:25:0;;;;;;;;;;;;:::i;:::-;87415:10;;:25;;-1:-1:-1;;;87415:25:0;;87438:1;87415:25;;;529::1;-1:-1:-1;;;;;87415:10:0;;;;:22;;502:18:1;;87415:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87415:25:0;;;;;;;;;;;;:::i;:::-;87451:10;;:25;;-1:-1:-1;;;87451:25:0;;87474:1;87451:25;;;529::1;-1:-1:-1;;;;;87451:10:0;;;;:22;;502:18:1;;87451:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87451:25:0;;;;;;;;;;;;:::i;:::-;87068:417;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;87054:431;;;86554:937;;;;:::o;89059:343::-;89179:25;;;;;;;;;;;;-1:-1:-1;;;89179:25:0;;;;89158:12;;89215:8;;89211:24;;-1:-1:-1;89225:10:0;;;;;;;;;-1:-1:-1;89225:10:0;;89211:24;89312:4;89353:3;89382:5;89256:140;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;89242:154;;;89059:343;;;;;:::o;82255:420::-;82297:13;82319:9;82331:26;82349:8;82331:15;:26;:::i;:::-;82364:25;;;;;;;;;:20;:25;;82319:38;;-1:-1:-1;82404:7:0;82400:11;;;:27;;;82419:8;82415:1;:12;82400:27;82396:254;;;-1:-1:-1;82438:17:0;;;;;;;;;;;;-1:-1:-1;;;82438:17:0;;;;82396:254;;;82483:7;82478:1;:12;;:29;;;;;82499:8;82494:1;:13;;82478:29;82474:176;;;-1:-1:-1;82518:17:0;;;;;;;;;;;;-1:-1:-1;;;82518:17:0;;;;82474:176;;;82562:8;82558:1;:12;:28;;;;;82578:8;82574:1;:12;82558:28;82554:96;;;-1:-1:-1;82596:17:0;;;;;;;;;;;;-1:-1:-1;;;82596:17:0;;;;82554:96;;;-1:-1:-1;82633:15:0;;;;;;;;;;;;-1:-1:-1;;;82633:15:0;;;;82663:6;82255:420;-1:-1:-1;;82255:420:0:o;60474:701::-;60557:7;60600:4;60557:7;60615:523;60639:5;:12;60635:1;:16;60615:523;;;60673:20;60696:5;60702:1;60696:8;;;;;;;;:::i;:::-;;;;;;;60673:31;;60739:12;60723;:28;60719:408;;60876:44;;;;;;36311:19:1;;;36346:12;;;36339:28;;;36383:12;;60876:44:0;;;;;;;;;;;;60866:55;;;;;;60851:70;;60719:408;;;61066:44;;;;;;36311:19:1;;;36346:12;;;36339:28;;;36383:12;;61066:44:0;;;;;;;;;;;;61056:55;;;;;;61041:70;;60719:408;-1:-1:-1;60653:3:0;;;;:::i;:::-;;;;60615:523;;101419:521;101497:16;101516:7;:5;:7::i;:::-;101497:26;-1:-1:-1;101532:14:0;101595:47;101610:8;101619:1;101610:11;101595:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;101623:18:0;;;;:9;:18;;;;;;;-1:-1:-1;101595:14:0;;-1:-1:-1;101595:47:0:i;:::-;101549:93;;101588:4;101560:16;:25;101577:7;101560:25;;;;;;;;;;;;101549:8;:36;;;;:::i;:::-;:43;;;;:::i;:::-;:93;;;;:::i;:::-;101532:110;;101665:2;101655:6;:12;101651:282;;101708:25;;;;:16;:25;;;;;;101745:1;;101708:34;;101736:6;;101708:34;:::i;:::-;:38;;;;:::i;:::-;101680:25;;;;:16;:25;;;;;:66;90975:531;90923:583;;:::o;101651:282::-;101783:1;101773:6;:11;101769:164;;-1:-1:-1;;101825:25:0;;:16;:25;;90923:583::o;101769:164::-;101902:25;;;;:16;:25;;;;;;:29;;101930:1;101902:29;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:367::-;628:8;638:6;692:3;685:4;677:6;673:17;669:27;659:55;;710:1;707;700:12;659:55;-1:-1:-1;733:20:1;;-1:-1:-1;;;;;765:30:1;;762:50;;;808:1;805;798:12;762:50;845:4;837:6;833:17;821:29;;905:3;898:4;888:6;885:1;881:14;873:6;869:27;865:38;862:47;859:67;;;922:1;919;912:12;859:67;565:367;;;;;:::o;937:437::-;1023:6;1031;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;-1:-1:-1;;;;;1165:6:1;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1244:70;1306:7;1297:6;1286:9;1282:22;1244:70;:::i;:::-;1333:8;;1218:96;;-1:-1:-1;937:437:1;-1:-1:-1;;;;937:437:1:o;1379:131::-;-1:-1:-1;;;;;;1453:32:1;;1443:43;;1433:71;;1500:1;1497;1490:12;1515:245;1573:6;1626:2;1614:9;1605:7;1601:23;1597:32;1594:52;;;1642:1;1639;1632:12;1594:52;1681:9;1668:23;1700:30;1724:5;1700:30;:::i;1957:258::-;2029:1;2039:113;2053:6;2050:1;2047:13;2039:113;;;2129:11;;;2123:18;2110:11;;;2103:39;2075:2;2068:10;2039:113;;;2170:6;2167:1;2164:13;2161:48;;;-1:-1:-1;;2205:1:1;2187:16;;2180:27;1957:258::o;2220:::-;2262:3;2300:5;2294:12;2327:6;2322:3;2315:19;2343:63;2399:6;2392:4;2387:3;2383:14;2376:4;2369:5;2365:16;2343:63;:::i;:::-;2460:2;2439:15;-1:-1:-1;;2435:29:1;2426:39;;;;2467:4;2422:50;;2220:258;-1:-1:-1;;2220:258:1:o;2483:220::-;2632:2;2621:9;2614:21;2595:4;2652:45;2693:2;2682:9;2678:18;2670:6;2652:45;:::i;2708:180::-;2767:6;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;-1:-1:-1;2859:23:1;;2708:180;-1:-1:-1;2708:180:1:o;3101:254::-;3169:6;3177;3230:2;3218:9;3209:7;3205:23;3201:32;3198:52;;;3246:1;3243;3236:12;3198:52;3269:29;3288:9;3269:29;:::i;:::-;3259:39;3345:2;3330:18;;;;3317:32;;-1:-1:-1;;;3101:254:1:o;3360:511::-;3455:6;3463;3471;3524:2;3512:9;3503:7;3499:23;3495:32;3492:52;;;3540:1;3537;3530:12;3492:52;3563:29;3582:9;3563:29;:::i;:::-;3553:39;;3643:2;3632:9;3628:18;3615:32;-1:-1:-1;;;;;3662:6:1;3659:30;3656:50;;;3702:1;3699;3692:12;3656:50;3741:70;3803:7;3794:6;3783:9;3779:22;3741:70;:::i;:::-;3360:511;;3830:8;;-1:-1:-1;3715:96:1;;-1:-1:-1;;;;3360:511:1:o;3876:269::-;3933:6;3986:2;3974:9;3965:7;3961:23;3957:32;3954:52;;;4002:1;3999;3992:12;3954:52;4041:9;4028:23;4091:4;4084:5;4080:16;4073:5;4070:27;4060:55;;4111:1;4108;4101:12;4150:328;4227:6;4235;4243;4296:2;4284:9;4275:7;4271:23;4267:32;4264:52;;;4312:1;4309;4302:12;4264:52;4335:29;4354:9;4335:29;:::i;:::-;4325:39;;4383:38;4417:2;4406:9;4402:18;4383:38;:::i;:::-;4373:48;;4468:2;4457:9;4453:18;4440:32;4430:42;;4150:328;;;;;:::o;4719:248::-;4787:6;4795;4848:2;4836:9;4827:7;4823:23;4819:32;4816:52;;;4864:1;4861;4854:12;4816:52;-1:-1:-1;;4887:23:1;;;4957:2;4942:18;;;4929:32;;-1:-1:-1;4719:248:1:o;5624:632::-;5795:2;5847:21;;;5917:13;;5820:18;;;5939:22;;;5766:4;;5795:2;6018:15;;;;5992:2;5977:18;;;5766:4;6061:169;6075:6;6072:1;6069:13;6061:169;;;6136:13;;6124:26;;6205:15;;;;6170:12;;;;6097:1;6090:9;6061:169;;;-1:-1:-1;6247:3:1;;5624:632;-1:-1:-1;;;;;;5624:632:1:o;6261:118::-;6347:5;6340:13;6333:21;6326:5;6323:32;6313:60;;6369:1;6366;6359:12;6384:315;6449:6;6457;6510:2;6498:9;6489:7;6485:23;6481:32;6478:52;;;6526:1;6523;6516:12;6478:52;6549:29;6568:9;6549:29;:::i;:::-;6539:39;;6628:2;6617:9;6613:18;6600:32;6641:28;6663:5;6641:28;:::i;:::-;6688:5;6678:15;;;6384:315;;;;;:::o;6889:254::-;6957:6;6965;7018:2;7006:9;6997:7;6993:23;6989:32;6986:52;;;7034:1;7031;7024:12;6986:52;7070:9;7057:23;7047:33;;7099:38;7133:2;7122:9;7118:18;7099:38;:::i;:::-;7089:48;;6889:254;;;;;:::o;7148:127::-;7209:10;7204:3;7200:20;7197:1;7190:31;7240:4;7237:1;7230:15;7264:4;7261:1;7254:15;7280:275;7351:2;7345:9;7416:2;7397:13;;-1:-1:-1;;7393:27:1;7381:40;;-1:-1:-1;;;;;7436:34:1;;7472:22;;;7433:62;7430:88;;;7498:18;;:::i;:::-;7534:2;7527:22;7280:275;;-1:-1:-1;7280:275:1:o;7560:186::-;7608:4;-1:-1:-1;;;;;7633:6:1;7630:30;7627:56;;;7663:18;;:::i;:::-;-1:-1:-1;7729:2:1;7708:15;-1:-1:-1;;7704:29:1;7735:4;7700:40;;7560:186::o;7751:888::-;7846:6;7854;7862;7870;7923:3;7911:9;7902:7;7898:23;7894:33;7891:53;;;7940:1;7937;7930:12;7891:53;7963:29;7982:9;7963:29;:::i;:::-;7953:39;;8011:38;8045:2;8034:9;8030:18;8011:38;:::i;:::-;8001:48;;8096:2;8085:9;8081:18;8068:32;8058:42;;8151:2;8140:9;8136:18;8123:32;-1:-1:-1;;;;;8170:6:1;8167:30;8164:50;;;8210:1;8207;8200:12;8164:50;8233:22;;8286:4;8278:13;;8274:27;-1:-1:-1;8264:55:1;;8315:1;8312;8305:12;8264:55;8351:2;8338:16;8376:48;8392:31;8420:2;8392:31;:::i;:::-;8376:48;:::i;:::-;8447:2;8440:5;8433:17;8487:7;8482:2;8477;8473;8469:11;8465:20;8462:33;8459:53;;;8508:1;8505;8498:12;8459:53;8563:2;8558;8554;8550:11;8545:2;8538:5;8534:14;8521:45;8607:1;8602:2;8597;8590:5;8586:14;8582:23;8575:34;8628:5;8618:15;;;;;7751:888;;;;;;;:::o;8644:260::-;8712:6;8720;8773:2;8761:9;8752:7;8748:23;8744:32;8741:52;;;8789:1;8786;8779:12;8741:52;8812:29;8831:9;8812:29;:::i;:::-;8802:39;;8860:38;8894:2;8883:9;8879:18;8860:38;:::i;8909:337::-;9111:2;9093:21;;;9150:2;9130:18;;;9123:30;-1:-1:-1;;;9184:2:1;9169:18;;9162:43;9237:2;9222:18;;8909:337::o;9251:127::-;9312:10;9307:3;9303:20;9300:1;9293:31;9343:4;9340:1;9333:15;9367:4;9364:1;9357:15;9383:128;9423:3;9454:1;9450:6;9447:1;9444:13;9441:39;;;9460:18;;:::i;:::-;-1:-1:-1;9496:9:1;;9383:128::o;9516:347::-;9718:2;9700:21;;;9757:2;9737:18;;;9730:30;9796:25;9791:2;9776:18;;9769:53;9854:2;9839:18;;9516:347::o;10555:135::-;10594:3;10615:17;;;10612:43;;10635:18;;:::i;:::-;-1:-1:-1;10682:1:1;10671:13;;10555:135::o;10695:359::-;10880:19;;;10937:2;10933:15;;;;-1:-1:-1;;10929:53:1;10924:2;10915:12;;10908:75;11008:2;10999:12;;10992:28;11045:2;11036:12;;10695:359::o;11059:356::-;11261:2;11243:21;;;11280:18;;;11273:30;11339:34;11334:2;11319:18;;11312:62;11406:2;11391:18;;11059:356::o;11420:380::-;11499:1;11495:12;;;;11542;;;11563:61;;11617:4;11609:6;11605:17;11595:27;;11563:61;11670:2;11662:6;11659:14;11639:18;11636:38;11633:161;;11716:10;11711:3;11707:20;11704:1;11697:31;11751:4;11748:1;11741:15;11779:4;11776:1;11769:15;11633:161;;11420:380;;;:::o;11805:125::-;11845:4;11873:1;11870;11867:8;11864:34;;;11878:18;;:::i;:::-;-1:-1:-1;11915:9:1;;11805:125::o;12630:168::-;12670:7;12736:1;12732;12728:6;12724:14;12721:1;12718:21;12713:1;12706:9;12699:17;12695:45;12692:71;;;12743:18;;:::i;:::-;-1:-1:-1;12783:9:1;;12630:168::o;12803:340::-;13005:2;12987:21;;;13044:2;13024:18;;;13017:30;-1:-1:-1;;;13078:2:1;13063:18;;13056:46;13134:2;13119:18;;12803:340::o;14546:127::-;14607:10;14602:3;14598:20;14595:1;14588:31;14638:4;14635:1;14628:15;14662:4;14659:1;14652:15;14678:112;14710:1;14736;14726:35;;14741:18;;:::i;:::-;-1:-1:-1;14775:9:1;;14678:112::o;15137:127::-;15198:10;15193:3;15189:20;15186:1;15179:31;15229:4;15226:1;15219:15;15253:4;15250:1;15243:15;15463:634;15542:6;15595:2;15583:9;15574:7;15570:23;15566:32;15563:52;;;15611:1;15608;15601:12;15563:52;15644:9;15638:16;-1:-1:-1;;;;;15669:6:1;15666:30;15663:50;;;15709:1;15706;15699:12;15663:50;15732:22;;15785:4;15777:13;;15773:27;-1:-1:-1;15763:55:1;;15814:1;15811;15804:12;15763:55;15843:2;15837:9;15868:48;15884:31;15912:2;15884:31;:::i;15868:48::-;15939:2;15932:5;15925:17;15979:7;15974:2;15969;15965;15961:11;15957:20;15954:33;15951:53;;;16000:1;15997;15990:12;15951:53;16013:54;16064:2;16059;16052:5;16048:14;16043:2;16039;16035:11;16013:54;:::i;:::-;16086:5;15463:634;-1:-1:-1;;;;;15463:634:1:o;16102:774::-;16379:6;16367:19;;16349:38;;16337:2;16406;16424:18;;;16417:30;;;16289:4;;16533:3;16518:19;;;16406:2;16322:18;;16560:6;16289:4;16594:253;16608:4;16605:1;16602:11;16594:253;;;16699:2;16695:7;16683:9;16675:6;16671:22;16667:36;16662:3;16655:49;16727:40;16760:6;16751;16745:13;16727:40;:::i;:::-;16717:50;-1:-1:-1;16825:12:1;;;;16790:15;;;;16628:1;16621:9;16594:253;;;-1:-1:-1;16864:6:1;;16102:774;-1:-1:-1;;;;;;;16102:774:1:o;16881:184::-;16922:3;16960:5;16954:12;16975:52;17020:6;17015:3;17008:4;17001:5;16997:16;16975:52;:::i;:::-;17043:16;;;;;16881:184;-1:-1:-1;;16881:184:1:o;17070:1245::-;17429:3;17467:6;17461:13;17493:4;17506:51;17550:6;17545:3;17540:2;17532:6;17528:15;17506:51;:::i;:::-;17620:13;;17579:16;;;;17642:55;17620:13;17579:16;17664:15;;;17642:55;:::i;:::-;17764:13;;17719:20;;;17786:55;17764:13;17719:20;17808:15;;;17786:55;:::i;:::-;17908:13;;17863:20;;;17930:55;17908:13;17863:20;17952:15;;;17930:55;:::i;:::-;18052:13;;18007:20;;;18074:55;18052:13;18007:20;18096:15;;;18074:55;:::i;:::-;18196:13;;18151:20;;;18218:55;18196:13;18151:20;18240:15;;;18218:55;:::i;:::-;18289:20;;;;;17070:1245;-1:-1:-1;;;;;;;;;17070:1245:1:o;19897:2235::-;-1:-1:-1;;;20692:61:1;;20776:13;;20674:3;;20808:4;20821:60;20776:13;20869:2;20860:12;;20843:15;;;20821:60;:::i;:::-;-1:-1:-1;;;20940:2:1;20900:16;;;20932:11;;;20925:24;21017:13;;20968:2;;20990:1;;21077;21099:18;;;;21152;;;;21179:93;;21257:4;21247:8;21243:19;21231:31;;21179:93;21320:2;21310:8;21307:16;21287:18;21284:40;21281:167;;-1:-1:-1;;;21347:33:1;;21403:4;21400:1;21393:15;21433:4;21354:3;21421:17;21281:167;21464:18;21491:122;;;;21627:1;21622:340;;;;21457:505;;21491:122;-1:-1:-1;;21532:24:1;;21519:11;;;21512:45;21581:17;;;21577:26;;;-1:-1:-1;21491:122:1;;21622:340;19081:1;19074:14;;;19118:4;19105:18;;21717:1;21731:175;21745:8;21742:1;21739:15;21731:175;;;21833:14;;21816:10;;;21812:19;;21805:43;21876:16;;;;21762:10;;21731:175;;;21735:3;;21949:2;21938:8;21934:2;21930:17;21926:26;21919:33;;21457:505;-1:-1:-1;;19211:66:1;19199:79;;-1:-1:-1;;19308:34:1;19303:2;19294:12;;19287:56;-1:-1:-1;19373:34:1;19368:2;19359:12;;19352:56;19438:66;19433:2;19424:12;;19417:88;21978:148;22008:117;22033:91;22063:60;19530:3;19521:13;;22080:6;22063:60;:::i;:::-;19622:66;19610:79;;-1:-1:-1;;;19714:2:1;19705:12;;19698:30;19753:2;19744:12;;19545:217;22033:91;22025:6;22008:117;:::i;:::-;-1:-1:-1;;;19832:27:1;;19884:1;19875:11;;19767:125;21978:148;21971:155;19897:2235;-1:-1:-1;;;;;;;;;;19897:2235:1:o;22137:448::-;22399:31;22394:3;22387:44;22369:3;22460:6;22454:13;22476:62;22531:6;22526:2;22521:3;22517:12;22510:4;22502:6;22498:17;22476:62;:::i;:::-;22558:16;;;;22576:2;22554:25;;22137:448;-1:-1:-1;;22137:448:1:o;22997:120::-;23037:1;23063;23053:35;;23068:18;;:::i;:::-;-1:-1:-1;23102:9:1;;22997:120::o;23122:1420::-;23594:3;23632:6;23626:13;23658:4;23671:51;23715:6;23710:3;23705:2;23697:6;23693:15;23671:51;:::i;:::-;23785:13;;23744:16;;;;23807:55;23785:13;23744:16;23829:15;;;23807:55;:::i;:::-;23929:13;;23884:20;;;23951:55;23929:13;23884:20;23973:15;;;23951:55;:::i;:::-;24073:13;;24028:20;;;24095:55;24073:13;24028:20;24117:15;;;24095:55;:::i;:::-;24217:13;;24172:20;;;24239:55;24217:13;24172:20;24261:15;;;24239:55;:::i;:::-;24361:13;;24316:20;;;24383:55;24361:13;24316:20;24405:15;;;24383:55;:::i;:::-;-1:-1:-1;;;24460:20:1;;24489:18;;;-1:-1:-1;24534:1:1;24523:13;;23122:1420;-1:-1:-1;;;;;;;;23122:1420:1:o;25090:245::-;25157:6;25210:2;25198:9;25189:7;25185:23;25181:32;25178:52;;;25226:1;25223;25216:12;25178:52;25258:9;25252:16;25277:28;25299:5;25277:28;:::i;25593:1435::-;25998:3;26036:6;26030:13;26062:4;26075:51;26119:6;26114:3;26109:2;26101:6;26097:15;26075:51;:::i;:::-;26189:13;;26148:16;;;;26211:55;26189:13;26148:16;26233:15;;;26211:55;:::i;:::-;26333:13;;26288:20;;;26355:55;26333:13;26288:20;26377:15;;;26355:55;:::i;:::-;26477:13;;26432:20;;;26499:55;26477:13;26432:20;26521:15;;;26499:55;:::i;:::-;26621:13;;26576:20;;;26643:55;26621:13;26576:20;26665:15;;;26643:55;:::i;:::-;26765:13;;26720:20;;;26787:55;26765:13;26720:20;26809:15;;;26787:55;:::i;:::-;26909:13;;26864:20;;;26931:55;26909:13;26864:20;26953:15;;;26931:55;:::i;:::-;27002:20;;;;;25593:1435;-1:-1:-1;;;;;;;;;;25593:1435:1:o;27033:1042::-;27346:3;27384:6;27378:13;27400:53;27446:6;27441:3;27434:4;27426:6;27422:17;27400:53;:::i;:::-;27516:13;;27475:16;;;;27538:57;27516:13;27475:16;27572:4;27560:17;;27538:57;:::i;:::-;27662:13;;27617:20;;;27684:57;27662:13;27617:20;27718:4;27706:17;;27684:57;:::i;:::-;27808:13;;27763:20;;;27830:57;27808:13;27763:20;27864:4;27852:17;;27830:57;:::i;:::-;27954:13;;27909:20;;;27976:57;27954:13;27909:20;28010:4;27998:17;;27976:57;:::i;:::-;28049:20;;27033:1042;-1:-1:-1;;;;;;;27033:1042:1:o;28080:274::-;28209:3;28247:6;28241:13;28263:53;28309:6;28304:3;28297:4;28289:6;28285:17;28263:53;:::i;:::-;28332:16;;;;;28080:274;-1:-1:-1;;28080:274:1:o;28359:204::-;28397:3;28433:4;28430:1;28426:12;28465:4;28462:1;28458:12;28500:3;28494:4;28490:14;28485:3;28482:23;28479:49;;;28508:18;;:::i;:::-;28544:13;;28359:204;-1:-1:-1;;;28359:204:1:o;28892:224::-;28931:3;28959:6;28992:2;28989:1;28985:10;29022:2;29019:1;29015:10;29053:3;29049:2;29045:12;29040:3;29037:21;29034:47;;;29061:18;;:::i;:::-;29097:13;;28892:224;-1:-1:-1;;;;28892:224:1:o;29121:197::-;29159:3;29187:6;29228:2;29221:5;29217:14;29255:2;29246:7;29243:15;29240:41;;29261:18;;:::i;:::-;29310:1;29297:15;;29121:197;-1:-1:-1;;;29121:197:1:o;29323:136::-;29362:3;29390:5;29380:39;;29399:18;;:::i;:::-;-1:-1:-1;;;29435:18:1;;29323:136::o;29825:489::-;-1:-1:-1;;;;;30094:15:1;;;30076:34;;30146:15;;30141:2;30126:18;;30119:43;30193:2;30178:18;;30171:34;;;30241:3;30236:2;30221:18;;30214:31;;;30019:4;;30262:46;;30288:19;;30280:6;30262:46;:::i;:::-;30254:54;29825:489;-1:-1:-1;;;;;;29825:489:1:o;30319:249::-;30388:6;30441:2;30429:9;30420:7;30416:23;30412:32;30409:52;;;30457:1;30454;30447:12;30409:52;30489:9;30483:16;30508:30;30532:5;30508:30;:::i;30573:1629::-;31028:3;31066:6;31060:13;31092:4;31105:51;31149:6;31144:3;31139:2;31131:6;31127:15;31105:51;:::i;:::-;31219:13;;31178:16;;;;31241:55;31219:13;31178:16;31263:15;;;31241:55;:::i;:::-;31363:13;;31318:20;;;31385:55;31363:13;31318:20;31407:15;;;31385:55;:::i;:::-;31507:13;;31462:20;;;31529:55;31507:13;31462:20;31551:15;;;31529:55;:::i;:::-;31651:13;;31606:20;;;31673:55;31651:13;31606:20;31695:15;;;31673:55;:::i;:::-;31795:13;;31750:20;;;31817:55;31795:13;31750:20;31839:15;;;31817:55;:::i;:::-;31939:13;;31894:20;;;31961:55;31939:13;31894:20;31983:15;;;31961:55;:::i;:::-;32083:13;;32038:20;;;32105:55;32083:13;32038:20;32127:15;;;32105:55;:::i;:::-;32176:20;;;;;30573:1629;-1:-1:-1;;;;;;;;;;;30573:1629:1:o;33232:1749::-;33729:3;33767:6;33761:13;33783:53;33829:6;33824:3;33817:4;33809:6;33805:17;33783:53;:::i;:::-;33867:6;33861:13;33883:68;33942:8;33933:6;33928:3;33924:16;33917:4;33909:6;33905:17;33883:68;:::i;:::-;34029:13;;33977:16;;;33973:31;;34051:57;34029:13;33973:31;34085:4;34073:17;;34051:57;:::i;:::-;34139:6;34133:13;34155:72;34218:8;34207;34200:5;34196:20;34189:4;34181:6;34177:17;34155:72;:::i;:::-;34309:13;;34253:20;;;;34249:35;;34331:57;34309:13;34249:35;34365:4;34353:17;;34331:57;:::i;:::-;34419:6;34413:13;34435:72;34498:8;34487;34480:5;34476:20;34469:4;34461:6;34457:17;34435:72;:::i;:::-;34589:13;;34533:20;;;;34529:35;;34611:57;34589:13;34529:35;34645:4;34633:17;;34611:57;:::i;:::-;34699:6;34693:13;34715:72;34778:8;34767;34760:5;34756:20;34749:4;34741:6;34737:17;34715:72;:::i;:::-;34866:13;;34810:20;;;;34806:35;;34888:54;34866:13;34806:35;34922:4;34910:17;;34888:54;:::i;:::-;34958:17;;33232:1749;-1:-1:-1;;;;;;;;;;;33232:1749:1:o;34986:1163::-;-1:-1:-1;;;35534:57:1;;35614:13;;35516:3;;35636:62;35614:13;35686:2;35677:12;;35670:4;35658:17;;35636:62;:::i;:::-;-1:-1:-1;;;35757:2:1;35717:16;;;35749:11;;;35742:59;35826:13;;35848:63;35826:13;35897:2;35889:11;;35882:4;35870:17;;35848:63;:::i;:::-;-1:-1:-1;;;35971:2:1;35930:17;;;;35963:11;;;35956:35;36016:13;;36038:63;36016:13;36087:2;36079:11;;36072:4;36060:17;;36038:63;:::i;:::-;36121:17;36140:2;36117:26;;34986:1163;-1:-1:-1;;;;;34986:1163:1:o

Swarm Source

ipfs://206da47c9c7e07cc461c8a56d59f95b9978ac3505502b0099ecf1d497ff53fc6
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.