ETH Price: $3,355.60 (-1.79%)
Gas: 6 Gwei

Token

(B)APETAVERSE (BVS)
 

Overview

Max Total Supply

10,000 BVS

Holders

4,038

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BVS
0xc41d063cE93158A01168992932a06cd3B1288c5e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

(B)APETAVERSE is virtual universe where BAPEFAMs get together to elevate the purpose of collectibles to a new level. Conceptualized from the official A BATHING APE®️, The King of Apes will headline (B)APETAVERSE and unveil his face for the first time.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BapetaverseNFT

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Counters.sol
pragma solidity ^0.8.0;
/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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

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


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

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

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

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

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

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

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

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


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


// File: @openzeppelin/contracts/interfaces/IERC165.sol
pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol
pragma solidity ^0.8.0;
/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


// File: @openzeppelin/contracts/token/ERC721/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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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/security/ReentrancyGuard.sol
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol
pragma solidity ^0.8.0;
/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts v4.4.1 (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;
    }
}

// File: contracts/Bapetaverse.sol
pragma solidity 0.8.12;

// @author: https://twitter.com/3DC0D3

contract BapetaverseNFT is ERC721, IERC2981, Ownable, ReentrancyGuard {
	using Strings for uint256;
	using Counters for Counters.Counter;
	Counters.Counter private supply;

	enum MintStatus {
		CLOSED,
		PRESALE,
		PUBLIC
	}

	string public uriPrefix;
	string public uriSuffix = "";
	string public hiddenMetadataUri;

	uint256 public cost = 0.30 ether;
	uint256 public maxSupply = 10000;
	uint256 public nftPerAddressLimit = 2;
	uint256 public royaltiesPercentage = 750;
	uint256 public constant MAX_MINT_AMOUNT_PER_TX = 2;

	bool public revealed = false;
	MintStatus public mintStatus = MintStatus.CLOSED;

	address public signerAddress = 0x1D80Ffd75C924Bc19F22B21E85a1BC472558184A;
	address public constant WITHDRAW_ADDRESS = 0xFC4BF9d0AB489E7684aB0E06D33B8E2257D8fF60;
	bytes32 public merkleRoot = 0x5d89ec5b68e28718105b1c05c18a849e7b82c2cb93e58d194df0839e792aacb3;

	mapping(address => bool) private whitelist;
	mapping(address => uint256) private addressMintedBalance;

    event RoyaltyPercentageEvent(uint256 _newPercentage);
    event NFTPerAddressLimitEvent(uint256 _limit);
    event CostEvent(uint256 _newCost);
    event MaxSupplyEvent(uint256 _newSupply);

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

	constructor(string memory _initUriPrefix, string memory _initHiddenMetadataUri) ERC721("(B)APETAVERSE", "BVS") {
		setUriPrefix(_initUriPrefix);
		setHiddenMetadataUri(_initHiddenMetadataUri);
	}

	modifier onlyExternal() {
		require(msg.sender == tx.origin, "Contracts not allowed to mint");
		_;
	}

	modifier mintCompliance(uint256 _mintAmount) {
		require(mintStatus != MintStatus.CLOSED, "Minting is closed");
		require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded");
		require(_mintAmount > 0 && _mintAmount <= MAX_MINT_AMOUNT_PER_TX, "Invalid mint amount");
		require(msg.value >= cost * _mintAmount, "Insufficient funds");
		require(addressMintedBalance[msg.sender] + _mintAmount <= nftPerAddressLimit, "Max NFT per address exceeded");
		_;
	}

	// external
	function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) {
		uint256 royalties = (_salePrice * royaltiesPercentage) / 10000;
		return (owner(), royalties);
	}

	// public
	function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC721) returns (bool) {
		return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
	}

	function mintForAddress(address _receiver, uint256 _mintAmount) public onlyOwner {
        require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded");
		_mintLoop(_receiver, _mintAmount);
	}

	function _mintLoop(address _receiver, uint256 _mintAmount) private {
		for (uint256 i = 0; i < _mintAmount; i++) {
			addressMintedBalance[_receiver]++;
			supply.increment();
			_safeMint(_receiver, supply.current());
		}
	}

	function _mintPresale(uint256 _mintAmount, bytes32[] memory _proof) private {
		require(mintStatus == MintStatus.PRESALE, "Not presale");
		require(whitelist[msg.sender], "Not Whitelisted");

		if (verify(_proof)) {
			_mintLoop(msg.sender, _mintAmount);
		} else {
			revert("Proof failed");
		}
	}

	function _mintPublic(uint256 _mintAmount, bytes memory _signature) private {
		require(mintStatus == MintStatus.PUBLIC, "Not public sale");

		if (signerOwner(_signature) == signerAddress) {
			_mintLoop(msg.sender, _mintAmount);
		} else {
			revert("Not Authorised");
		}
	}

	function mint(
		uint256 _mintAmount,
		bytes32[] memory _proof,
		bytes memory _signature
	) public payable mintCompliance(_mintAmount) onlyExternal nonReentrant {
		if (mintStatus == MintStatus.PRESALE) {
			_mintPresale(_mintAmount, _proof);
		} else if (mintStatus == MintStatus.PUBLIC) {
			_mintPublic(_mintAmount, _signature);
		}
	}

	function signerOwner(bytes memory _signature) private view returns (address) {
		return ECDSA.recover(keccak256(abi.encode(msg.sender)), _signature);
	}

	function verify(bytes32[] memory _proof) public view returns (bool) {
		return
			MerkleProof.verify(
				_proof,
				merkleRoot,
				keccak256(abi.encodePacked(msg.sender))
			);
	}

	function totalSupply() public view returns (uint256) {
		return supply.current();
	}

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

		if (revealed == false) {
			return bytes(hiddenMetadataUri).length > 0 ? string(abi.encodePacked(hiddenMetadataUri, tokenId.toString(), uriSuffix)) : "";
		}

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

	//only owner
	function setRoyaltyPercentage(uint256 _newPercentage) public onlyOwner {
		royaltiesPercentage = _newPercentage;
        emit RoyaltyPercentageEvent(royaltiesPercentage);
	}

	function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
		nftPerAddressLimit = _limit;
        emit NFTPerAddressLimitEvent(nftPerAddressLimit);
	}

	function setCost(uint256 _newCost) public onlyOwner {
		cost = _newCost;
        emit CostEvent(cost);
	}

	function setMaxSupply(uint256 _newSupply) public onlyOwner {
		maxSupply = _newSupply;
        emit MaxSupplyEvent(maxSupply);
	}

	function setUriPrefix(string memory _newUriPrefix) public onlyOwner {
		uriPrefix = _newUriPrefix;
	}

	function setUriSuffix(string memory _newUriSuffix) public onlyOwner {
		uriSuffix = _newUriSuffix;
	}

	function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
		hiddenMetadataUri = _hiddenMetadataUri;
	}

	function whitelistAddresses(address[] memory _addresses) external onlyOwner {
		for (uint256 i; i < _addresses.length; i++) {
			whitelist[_addresses[i]] = true;
		}
	}

	function setSignerAddress(address _newSignerAddress) public onlyOwner {
		signerAddress = _newSignerAddress;
	}

	function whitelistStatus(address _address) external view returns (bool) {
		return whitelist[_address];
	}

    function mintedBalance(address _address) external view returns (uint256) {
		return addressMintedBalance[_address];
	}

	function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
		merkleRoot = _merkleRoot;
	}

	function setReveal(bool _state) public onlyOwner {
		revealed = _state;
	}

	function setMintStatus(uint8 _status) external onlyOwner {
		mintStatus = MintStatus(_status);
	}

	function withdraw() public onlyOwner {
		require(address(this).balance != 0, "Balance is zero");
		(bool success, ) = payable(WITHDRAW_ADDRESS).call{ value: address(this).balance }("");
		require(success, "Withdrawal failed");
	}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initUriPrefix","type":"string"},{"internalType":"string","name":"_initHiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"CostEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"MaxSupplyEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"NFTPerAddressLimitEvent","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":false,"internalType":"uint256","name":"_newPercentage","type":"uint256"}],"name":"RoyaltyPercentageEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_AMOUNT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStatus","outputs":[{"internalType":"enum BapetaverseNFT.MintStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintedBalance","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":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_status","type":"uint8"}],"name":"setMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSignerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newUriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"whitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a90805190602001906200002b92919062000481565b50670429d069189e0000600c55612710600d556002600e556102ee600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908360028111156200008d576200008c62000531565b5b0217905550731d80ffd75c924bc19f22b21e85a1bc472558184a601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5d89ec5b68e28718105b1c05c18a849e7b82c2cb93e58d194df0839e792aacb360001b6011553480156200011b57600080fd5b50604051620066e1380380620066e18339818101604052810190620001419190620006fd565b6040518060400160405280600d81526020017f28422941504554415645525345000000000000000000000000000000000000008152506040518060400160405280600381526020017f42565300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001c592919062000481565b508060019080519060200190620001de92919062000481565b50505062000201620001f56200023360201b60201c565b6200023b60201b60201c565b60016007819055506200021a826200030160201b60201c565b6200022b81620003ac60201b60201c565b50506200086a565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003116200023360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003376200045760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038790620007e3565b60405180910390fd5b8060099080519060200190620003a892919062000481565b5050565b620003bc6200023360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003e26200045760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200043b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200043290620007e3565b60405180910390fd5b80600b90805190602001906200045392919062000481565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200048f9062000834565b90600052602060002090601f016020900481019282620004b35760008555620004ff565b82601f10620004ce57805160ff1916838001178555620004ff565b82800160010185558215620004ff579182015b82811115620004fe578251825591602001919060010190620004e1565b5b5090506200050e919062000512565b5090565b5b808211156200052d57600081600090555060010162000513565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005c9826200057e565b810181811067ffffffffffffffff82111715620005eb57620005ea6200058f565b5b80604052505050565b60006200060062000560565b90506200060e8282620005be565b919050565b600067ffffffffffffffff8211156200063157620006306200058f565b5b6200063c826200057e565b9050602081019050919050565b60005b83811015620006695780820151818401526020810190506200064c565b8381111562000679576000848401525b50505050565b600062000696620006908462000613565b620005f4565b905082815260208101848484011115620006b557620006b462000579565b5b620006c284828562000649565b509392505050565b600082601f830112620006e257620006e162000574565b5b8151620006f48482602086016200067f565b91505092915050565b600080604083850312156200071757620007166200056a565b5b600083015167ffffffffffffffff8111156200073857620007376200056f565b5b6200074685828601620006ca565b925050602083015167ffffffffffffffff8111156200076a57620007696200056f565b5b6200077885828601620006ca565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620007cb60208362000782565b9150620007d88262000793565b602082019050919050565b60006020820190508181036000830152620007fe81620007bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084d57607f821691505b6020821081141562000864576200086362000805565b5b50919050565b615e67806200087a6000396000f3fe6080604052600436106102ae5760003560e01c80636352211e11610175578063a45ba8e7116100dc578063ccaf1c4b11610095578063e051b4161161006f578063e051b41614610a7a578063e985e9c514610ab7578063f254933d14610af4578063f2fde38b14610b1d576102ae565b8063ccaf1c4b146109e9578063d0eb26b014610a26578063d5abeb0114610a4f576102ae565b8063a45ba8e7146108e6578063b88d4fde14610911578063ba7d2c761461093a578063c4bab46914610965578063c87b56dd14610981578063cafa8dfe146109be576102ae565b8063814c8c551161012e578063814c8c55146107d65780638da5cb5b146107ff57806395d89b411461082a57806397611638146108555780639da3f8fd14610892578063a22cb465146108bd576102ae565b80636352211e146106ca5780636f8b44b01461070757806370a0823114610730578063715018a61461076d5780637cb64759146107845780637ec4a659146107ad576102ae565b80632a55205a116102195780634fdd43cb116101d25780634fdd43cb146105cc57806351830227146105f55780635503a0e8146106205780635b7633d01461064b57806361ba27da1461067657806362b99ad41461069f576102ae565b80632a55205a146104d15780632bf043041461050f5780632eb4a7ab146105385780633ccfd60b1461056357806342842e0e1461057a57806344a0d68a146105a3576102ae565b8063122e04a81161026b578063122e04a8146103d557806313faede61461040057806316ba10e01461042b57806318160ddd1461045457806323b872dd1461047f5780632a3f300c146104a8576102ae565b806301ffc9a7146102b3578063046dc166146102f057806306fdde0314610319578063081812fc14610344578063095ea7b31461038157806309ef6527146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613d0b565b610b46565b6040516102e79190613d53565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613dcc565b610bc0565b005b34801561032557600080fd5b5061032e610c80565b60405161033b9190613e92565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613eea565b610d12565b6040516103789190613f26565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613f41565b610d97565b005b3480156103b657600080fd5b506103bf610eaf565b6040516103cc9190613f90565b60405180910390f35b3480156103e157600080fd5b506103ea610eb4565b6040516103f79190613f26565b60405180910390f35b34801561040c57600080fd5b50610415610ecc565b6040516104229190613f90565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906140e0565b610ed2565b005b34801561046057600080fd5b50610469610f68565b6040516104769190613f90565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190614129565b610f79565b005b3480156104b457600080fd5b506104cf60048036038101906104ca91906141a8565b610fd9565b005b3480156104dd57600080fd5b506104f860048036038101906104f391906141d5565b611072565b604051610506929190614215565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190614306565b6110a9565b005b34801561054457600080fd5b5061054d6111ba565b60405161055a9190614368565b60405180910390f35b34801561056f57600080fd5b506105786111c0565b005b34801561058657600080fd5b506105a1600480360381019061059c9190614129565b611343565b005b3480156105af57600080fd5b506105ca60048036038101906105c59190613eea565b611363565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906140e0565b611422565b005b34801561060157600080fd5b5061060a6114b8565b6040516106179190613d53565b60405180910390f35b34801561062c57600080fd5b506106356114cb565b6040516106429190613e92565b60405180910390f35b34801561065757600080fd5b50610660611559565b60405161066d9190613f26565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190613eea565b61157f565b005b3480156106ab57600080fd5b506106b461163e565b6040516106c19190613e92565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190613eea565b6116cc565b6040516106fe9190613f26565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613eea565b61177e565b005b34801561073c57600080fd5b5061075760048036038101906107529190613dcc565b61183d565b6040516107649190613f90565b60405180910390f35b34801561077957600080fd5b506107826118f5565b005b34801561079057600080fd5b506107ab60048036038101906107a691906143af565b61197d565b005b3480156107b957600080fd5b506107d460048036038101906107cf91906140e0565b611a03565b005b3480156107e257600080fd5b506107fd60048036038101906107f89190614415565b611a99565b005b34801561080b57600080fd5b50610814611b57565b6040516108219190613f26565b60405180910390f35b34801561083657600080fd5b5061083f611b81565b60405161084c9190613e92565b60405180910390f35b34801561086157600080fd5b5061087c60048036038101906108779190614505565b611c13565b6040516108899190613d53565b60405180910390f35b34801561089e57600080fd5b506108a7611c4f565b6040516108b491906145c5565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df91906145e0565b611c62565b005b3480156108f257600080fd5b506108fb611c78565b6040516109089190613e92565b60405180910390f35b34801561091d57600080fd5b50610938600480360381019061093391906146c1565b611d06565b005b34801561094657600080fd5b5061094f611d68565b60405161095c9190613f90565b60405180910390f35b61097f600480360381019061097a9190614744565b611d6e565b005b34801561098d57600080fd5b506109a860048036038101906109a39190613eea565b6120ca565b6040516109b59190613e92565b60405180910390f35b3480156109ca57600080fd5b506109d36121f2565b6040516109e09190613f90565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190613dcc565b6121f8565b604051610a1d9190613d53565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613eea565b61224e565b005b348015610a5b57600080fd5b50610a6461230d565b604051610a719190613f90565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613dcc565b612313565b604051610aae9190613f90565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad991906147cf565b61235c565b604051610aeb9190613d53565b60405180910390f35b348015610b0057600080fd5b50610b1b6004803603810190610b169190613f41565b6123f0565b005b348015610b2957600080fd5b50610b446004803603810190610b3f9190613dcc565b6124d3565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb95750610bb8826125cb565b5b9050919050565b610bc86126ad565b73ffffffffffffffffffffffffffffffffffffffff16610be6611b57565b73ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c339061485b565b60405180910390fd5b80601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610c8f906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906148aa565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b6000610d1d826126b5565b610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d539061494e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610da2826116cc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906149e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e326126ad565b73ffffffffffffffffffffffffffffffffffffffff161480610e615750610e6081610e5b6126ad565b61235c565b5b610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9790614a72565b60405180910390fd5b610eaa8383612721565b505050565b600281565b73fc4bf9d0ab489e7684ab0e06d33b8e2257d8ff6081565b600c5481565b610eda6126ad565b73ffffffffffffffffffffffffffffffffffffffff16610ef8611b57565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061485b565b60405180910390fd5b80600a9080519060200190610f64929190613bfc565b5050565b6000610f7460086127da565b905090565b610f8a610f846126ad565b826127e8565b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614b04565b60405180910390fd5b610fd48383836128c6565b505050565b610fe16126ad565b73ffffffffffffffffffffffffffffffffffffffff16610fff611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061485b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000806000612710600f54856110889190614b53565b6110929190614bdc565b905061109c611b57565b8192509250509250929050565b6110b16126ad565b73ffffffffffffffffffffffffffffffffffffffff166110cf611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c9061485b565b60405180910390fd5b60005b81518110156111b65760016012600084848151811061114a57611149614c0d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111ae90614c3c565b915050611128565b5050565b60115481565b6111c86126ad565b73ffffffffffffffffffffffffffffffffffffffff166111e6611b57565b73ffffffffffffffffffffffffffffffffffffffff161461123c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112339061485b565b60405180910390fd5b6000471415611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614cd1565b60405180910390fd5b600073fc4bf9d0ab489e7684ab0e06d33b8e2257d8ff6073ffffffffffffffffffffffffffffffffffffffff16476040516112ba90614d22565b60006040518083038185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b5050905080611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614d83565b60405180910390fd5b50565b61135e83838360405180602001604052806000815250611d06565b505050565b61136b6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611389611b57565b73ffffffffffffffffffffffffffffffffffffffff16146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d69061485b565b60405180910390fd5b80600c819055507f4f4c3fdb029cc44f6d0275f9173ce78767d49f5cde862d8bde92d65cf62ed592600c546040516114179190613f90565b60405180910390a150565b61142a6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611448611b57565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114959061485b565b60405180910390fd5b80600b90805190602001906114b4929190613bfc565b5050565b601060009054906101000a900460ff1681565b600a80546114d8906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611504906148aa565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b505050505081565b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115876126ad565b73ffffffffffffffffffffffffffffffffffffffff166115a5611b57565b73ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f29061485b565b60405180910390fd5b80600f819055507fda62376b47b7795fe735c385a0302da44a4eddbb8ac2728581dfc85e37475bd7600f546040516116339190613f90565b60405180910390a150565b6009805461164b906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611677906148aa565b80156116c45780601f10611699576101008083540402835291602001916116c4565b820191906000526020600020905b8154815290600101906020018083116116a757829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614e15565b60405180910390fd5b80915050919050565b6117866126ad565b73ffffffffffffffffffffffffffffffffffffffff166117a4611b57565b73ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061485b565b60405180910390fd5b80600d819055507f42b641b1338fdba90b9846a65d4077e4f558cdb3fd273e9ef0469c2ca115e9a3600d546040516118329190613f90565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614ea7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fd6126ad565b73ffffffffffffffffffffffffffffffffffffffff1661191b611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611971576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119689061485b565b60405180910390fd5b61197b6000612b22565b565b6119856126ad565b73ffffffffffffffffffffffffffffffffffffffff166119a3611b57565b73ffffffffffffffffffffffffffffffffffffffff16146119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f09061485b565b60405180910390fd5b8060118190555050565b611a0b6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611a29611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061485b565b60405180910390fd5b8060099080519060200190611a95929190613bfc565b5050565b611aa16126ad565b73ffffffffffffffffffffffffffffffffffffffff16611abf611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c9061485b565b60405180910390fd5b8060ff166002811115611b2b57611b2a61454e565b5b601060016101000a81548160ff02191690836002811115611b4f57611b4e61454e565b5b021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b90906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbc906148aa565b8015611c095780601f10611bde57610100808354040283529160200191611c09565b820191906000526020600020905b815481529060010190602001808311611bec57829003601f168201915b5050505050905090565b6000611c488260115433604051602001611c2d9190614f0f565b60405160208183030381529060405280519060200120612be8565b9050919050565b601060019054906101000a900460ff1681565b611c74611c6d6126ad565b8383612bff565b5050565b600b8054611c85906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb1906148aa565b8015611cfe5780601f10611cd357610100808354040283529160200191611cfe565b820191906000526020600020905b815481529060010190602001808311611ce157829003601f168201915b505050505081565b611d17611d116126ad565b836127e8565b611d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4d90614b04565b60405180910390fd5b611d6284848484612d6c565b50505050565b600e5481565b8260006002811115611d8357611d8261454e565b5b601060019054906101000a900460ff166002811115611da557611da461454e565b5b1415611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614f76565b60405180910390fd5b600d5481611df460086127da565b611dfe9190614f96565b1115611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690615038565b60405180910390fd5b600081118015611e50575060028111155b611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e86906150a4565b60405180910390fd5b80600c54611e9d9190614b53565b341015611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690615110565b60405180910390fd5b600e5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f2d9190614f96565b1115611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f659061517c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd3906151e8565b60405180910390fd5b60026007541415612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990615254565b60405180910390fd5b60026007819055506001600281111561203e5761203d61454e565b5b601060019054906101000a900460ff1660028111156120605761205f61454e565b5b1415612075576120708484612dc8565b6120bc565b6002808111156120885761208761454e565b5b601060019054906101000a900460ff1660028111156120aa576120a961454e565b5b14156120bb576120ba8483612f26565b5b5b600160078190555050505050565b60606120d5826126b5565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906152c0565b60405180910390fd5b60001515601060009054906101000a900460ff1615151415612191576000600b805461213f906148aa565b90501161215b576040518060200160405280600081525061218a565b600b61216683613047565b600a60405160200161217a939291906153b0565b6040516020818303038152906040525b90506121ed565b600061219b6131a8565b905060008151116121bb57604051806020016040528060008152506121e9565b806121c584613047565b600a6040516020016121d9939291906153e1565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6122566126ad565b73ffffffffffffffffffffffffffffffffffffffff16612274611b57565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c19061485b565b60405180910390fd5b80600e819055507f13fc1ba10e9f6a29d6d8caca49e594617194994ef122ec8ee309f3bd09efd450600e546040516123029190613f90565b60405180910390a150565b600d5481565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123f86126ad565b73ffffffffffffffffffffffffffffffffffffffff16612416611b57565b73ffffffffffffffffffffffffffffffffffffffff161461246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061485b565b60405180910390fd5b600d548161247a60086127da565b6124849190614f96565b11156124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90615038565b60405180910390fd5b6124cf828261323a565b5050565b6124db6126ad565b73ffffffffffffffffffffffffffffffffffffffff166124f9611b57565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125469061485b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b690615484565b60405180910390fd5b6125c881612b22565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a657506126a5826132cf565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612794836116cc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006127f3826126b5565b612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990615516565b60405180910390fd5b600061283d836116cc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ac57508373ffffffffffffffffffffffffffffffffffffffff1661289484610d12565b73ffffffffffffffffffffffffffffffffffffffff16145b806128bd57506128bc818561235c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e6826116cc565b73ffffffffffffffffffffffffffffffffffffffff161461293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906155a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39061563a565b60405180910390fd5b6129b7838383613339565b6129c2600082612721565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a12919061565a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a699190614f96565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612bf5858461333e565b1490509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c65906156da565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d5f9190613d53565b60405180910390a3505050565b612d778484846128c6565b612d83848484846133f1565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db99061576c565b60405180910390fd5b50505050565b60016002811115612ddc57612ddb61454e565b5b601060019054906101000a900460ff166002811115612dfe57612dfd61454e565b5b14612e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e35906157d8565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec190615844565b60405180910390fd5b612ed381611c13565b15612ee757612ee2338361323a565b612f22565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f19906158b0565b60405180910390fd5b5050565b600280811115612f3957612f3861454e565b5b601060019054906101000a900460ff166002811115612f5b57612f5a61454e565b5b14612f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f929061591c565b60405180910390fd5b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612fdd82613579565b73ffffffffffffffffffffffffffffffffffffffff16141561300857613003338361323a565b613043565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303a90615988565b60405180910390fd5b5050565b6060600082141561308f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131a3565b600082905060005b600082146130c15780806130aa90614c3c565b915050600a826130ba9190614bdc565b9150613097565b60008167ffffffffffffffff8111156130dd576130dc613fb5565b5b6040519080825280601f01601f19166020018201604052801561310f5781602001600182028036833780820191505090505b5090505b6000851461319c57600182613128919061565a565b9150600a8561313791906159a8565b60306131439190614f96565b60f81b81838151811061315957613158614c0d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131959190614bdc565b9450613113565b8093505050505b919050565b6060600980546131b7906148aa565b80601f01602080910402602001604051908101604052809291908181526020018280546131e3906148aa565b80156132305780601f1061320557610100808354040283529160200191613230565b820191906000526020600020905b81548152906001019060200180831161321357829003601f168201915b5050505050905090565b60005b818110156132ca57601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061329590614c3c565b91905055506132a460086135b2565b6132b7836132b260086127da565b6135c8565b80806132c290614c3c565b91505061323d565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60008082905060005b84518110156133e657600085828151811061336557613364614c0d565b5b602002602001015190508083116133a65782816040516020016133899291906159fa565b6040516020818303038152906040528051906020012092506133d2565b80836040516020016133b99291906159fa565b6040516020818303038152906040528051906020012092505b5080806133de90614c3c565b915050613347565b508091505092915050565b60006134128473ffffffffffffffffffffffffffffffffffffffff166135e6565b1561356c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261343b6126ad565b8786866040518563ffffffff1660e01b815260040161345d9493929190615a7b565b6020604051808303816000875af192505050801561349957506040513d601f19601f820116820180604052508101906134969190615adc565b60015b61351c573d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50600081511415613514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b9061576c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613571565b600190505b949350505050565b60006135ab3360405160200161358f9190613f26565b60405160208183030381529060405280519060200120836135f9565b9050919050565b6001816000016000828254019250508190555050565b6135e2828260405180602001604052806000815250613620565b5050565b600080823b905060008111915050919050565b6000806000613608858561367b565b91509150613615816136fe565b819250505092915050565b61362a83836138d3565b61363760008484846133f1565b613676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366d9061576c565b60405180910390fd5b505050565b6000806041835114156136bd5760008060006020860151925060408601519150606086015160001a90506136b187828585613aa1565b945094505050506136f7565b6040835114156136ee5760008060208501519150604085015190506136e3868383613bae565b9350935050506136f7565b60006002915091505b9250929050565b600060048111156137125761371161454e565b5b8160048111156137255761372461454e565b5b1415613730576138d0565b600160048111156137445761374361454e565b5b8160048111156137575761375661454e565b5b1415613798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378f90615b55565b60405180910390fd5b600260048111156137ac576137ab61454e565b5b8160048111156137bf576137be61454e565b5b1415613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f790615bc1565b60405180910390fd5b600360048111156138145761381361454e565b5b8160048111156138275761382661454e565b5b1415613868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385f90615c53565b60405180910390fd5b60048081111561387b5761387a61454e565b5b81600481111561388e5761388d61454e565b5b14156138cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c690615ce5565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393a90615d51565b60405180910390fd5b61394c816126b5565b1561398c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398390615dbd565b60405180910390fd5b61399860008383613339565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e89190614f96565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613adc576000600391509150613ba5565b601b8560ff1614158015613af45750601c8560ff1614155b15613b06576000600491509150613ba5565b600060018787878760405160008152602001604052604051613b2b9493929190615dec565b6020604051602081039080840390855afa158015613b4d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b9c57600060019250925050613ba5565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bee87828885613aa1565b935093505050935093915050565b828054613c08906148aa565b90600052602060002090601f016020900481019282613c2a5760008555613c71565b82601f10613c4357805160ff1916838001178555613c71565b82800160010185558215613c71579182015b82811115613c70578251825591602001919060010190613c55565b5b509050613c7e9190613c82565b5090565b5b80821115613c9b576000816000905550600101613c83565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ce881613cb3565b8114613cf357600080fd5b50565b600081359050613d0581613cdf565b92915050565b600060208284031215613d2157613d20613ca9565b5b6000613d2f84828501613cf6565b91505092915050565b60008115159050919050565b613d4d81613d38565b82525050565b6000602082019050613d686000830184613d44565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d9982613d6e565b9050919050565b613da981613d8e565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de1613ca9565b5b6000613df084828501613db7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e33578082015181840152602081019050613e18565b83811115613e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e6482613df9565b613e6e8185613e04565b9350613e7e818560208601613e15565b613e8781613e48565b840191505092915050565b60006020820190508181036000830152613eac8184613e59565b905092915050565b6000819050919050565b613ec781613eb4565b8114613ed257600080fd5b50565b600081359050613ee481613ebe565b92915050565b600060208284031215613f0057613eff613ca9565b5b6000613f0e84828501613ed5565b91505092915050565b613f2081613d8e565b82525050565b6000602082019050613f3b6000830184613f17565b92915050565b60008060408385031215613f5857613f57613ca9565b5b6000613f6685828601613db7565b9250506020613f7785828601613ed5565b9150509250929050565b613f8a81613eb4565b82525050565b6000602082019050613fa56000830184613f81565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fed82613e48565b810181811067ffffffffffffffff8211171561400c5761400b613fb5565b5b80604052505050565b600061401f613c9f565b905061402b8282613fe4565b919050565b600067ffffffffffffffff82111561404b5761404a613fb5565b5b61405482613e48565b9050602081019050919050565b82818337600083830152505050565b600061408361407e84614030565b614015565b90508281526020810184848401111561409f5761409e613fb0565b5b6140aa848285614061565b509392505050565b600082601f8301126140c7576140c6613fab565b5b81356140d7848260208601614070565b91505092915050565b6000602082840312156140f6576140f5613ca9565b5b600082013567ffffffffffffffff81111561411457614113613cae565b5b614120848285016140b2565b91505092915050565b60008060006060848603121561414257614141613ca9565b5b600061415086828701613db7565b935050602061416186828701613db7565b925050604061417286828701613ed5565b9150509250925092565b61418581613d38565b811461419057600080fd5b50565b6000813590506141a28161417c565b92915050565b6000602082840312156141be576141bd613ca9565b5b60006141cc84828501614193565b91505092915050565b600080604083850312156141ec576141eb613ca9565b5b60006141fa85828601613ed5565b925050602061420b85828601613ed5565b9150509250929050565b600060408201905061422a6000830185613f17565b6142376020830184613f81565b9392505050565b600067ffffffffffffffff82111561425957614258613fb5565b5b602082029050602081019050919050565b600080fd5b600061428261427d8461423e565b614015565b905080838252602082019050602084028301858111156142a5576142a461426a565b5b835b818110156142ce57806142ba8882613db7565b8452602084019350506020810190506142a7565b5050509392505050565b600082601f8301126142ed576142ec613fab565b5b81356142fd84826020860161426f565b91505092915050565b60006020828403121561431c5761431b613ca9565b5b600082013567ffffffffffffffff81111561433a57614339613cae565b5b614346848285016142d8565b91505092915050565b6000819050919050565b6143628161434f565b82525050565b600060208201905061437d6000830184614359565b92915050565b61438c8161434f565b811461439757600080fd5b50565b6000813590506143a981614383565b92915050565b6000602082840312156143c5576143c4613ca9565b5b60006143d38482850161439a565b91505092915050565b600060ff82169050919050565b6143f2816143dc565b81146143fd57600080fd5b50565b60008135905061440f816143e9565b92915050565b60006020828403121561442b5761442a613ca9565b5b600061443984828501614400565b91505092915050565b600067ffffffffffffffff82111561445d5761445c613fb5565b5b602082029050602081019050919050565b600061448161447c84614442565b614015565b905080838252602082019050602084028301858111156144a4576144a361426a565b5b835b818110156144cd57806144b9888261439a565b8452602084019350506020810190506144a6565b5050509392505050565b600082601f8301126144ec576144eb613fab565b5b81356144fc84826020860161446e565b91505092915050565b60006020828403121561451b5761451a613ca9565b5b600082013567ffffffffffffffff81111561453957614538613cae565b5b614545848285016144d7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061458e5761458d61454e565b5b50565b600081905061459f8261457d565b919050565b60006145af82614591565b9050919050565b6145bf816145a4565b82525050565b60006020820190506145da60008301846145b6565b92915050565b600080604083850312156145f7576145f6613ca9565b5b600061460585828601613db7565b925050602061461685828601614193565b9150509250929050565b600067ffffffffffffffff82111561463b5761463a613fb5565b5b61464482613e48565b9050602081019050919050565b600061466461465f84614620565b614015565b9050828152602081018484840111156146805761467f613fb0565b5b61468b848285614061565b509392505050565b600082601f8301126146a8576146a7613fab565b5b81356146b8848260208601614651565b91505092915050565b600080600080608085870312156146db576146da613ca9565b5b60006146e987828801613db7565b94505060206146fa87828801613db7565b935050604061470b87828801613ed5565b925050606085013567ffffffffffffffff81111561472c5761472b613cae565b5b61473887828801614693565b91505092959194509250565b60008060006060848603121561475d5761475c613ca9565b5b600061476b86828701613ed5565b935050602084013567ffffffffffffffff81111561478c5761478b613cae565b5b614798868287016144d7565b925050604084013567ffffffffffffffff8111156147b9576147b8613cae565b5b6147c586828701614693565b9150509250925092565b600080604083850312156147e6576147e5613ca9565b5b60006147f485828601613db7565b925050602061480585828601613db7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614845602083613e04565b91506148508261480f565b602082019050919050565b6000602082019050818103600083015261487481614838565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148c257607f821691505b602082108114156148d6576148d561487b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614938602c83613e04565b9150614943826148dc565b604082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ca602183613e04565b91506149d58261496e565b604082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614a5c603883613e04565b9150614a6782614a00565b604082019050919050565b60006020820190508181036000830152614a8b81614a4f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614aee603183613e04565b9150614af982614a92565b604082019050919050565b60006020820190508181036000830152614b1d81614ae1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5e82613eb4565b9150614b6983613eb4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba257614ba1614b24565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614be782613eb4565b9150614bf283613eb4565b925082614c0257614c01614bad565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614c4782613eb4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7a57614c79614b24565b5b600182019050919050565b7f42616c616e6365206973207a65726f0000000000000000000000000000000000600082015250565b6000614cbb600f83613e04565b9150614cc682614c85565b602082019050919050565b60006020820190508181036000830152614cea81614cae565b9050919050565b600081905092915050565b50565b6000614d0c600083614cf1565b9150614d1782614cfc565b600082019050919050565b6000614d2d82614cff565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614d6d601183613e04565b9150614d7882614d37565b602082019050919050565b60006020820190508181036000830152614d9c81614d60565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614dff602983613e04565b9150614e0a82614da3565b604082019050919050565b60006020820190508181036000830152614e2e81614df2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e91602a83613e04565b9150614e9c82614e35565b604082019050919050565b60006020820190508181036000830152614ec081614e84565b9050919050565b60008160601b9050919050565b6000614edf82614ec7565b9050919050565b6000614ef182614ed4565b9050919050565b614f09614f0482613d8e565b614ee6565b82525050565b6000614f1b8284614ef8565b60148201915081905092915050565b7f4d696e74696e6720697320636c6f736564000000000000000000000000000000600082015250565b6000614f60601183613e04565b9150614f6b82614f2a565b602082019050919050565b60006020820190508181036000830152614f8f81614f53565b9050919050565b6000614fa182613eb4565b9150614fac83613eb4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fe157614fe0614b24565b5b828201905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000615022601383613e04565b915061502d82614fec565b602082019050919050565b6000602082019050818103600083015261505181615015565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b600061508e601383613e04565b915061509982615058565b602082019050919050565b600060208201905081810360008301526150bd81615081565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006150fa601283613e04565b9150615105826150c4565b602082019050919050565b60006020820190508181036000830152615129816150ed565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000615166601c83613e04565b915061517182615130565b602082019050919050565b6000602082019050818103600083015261519581615159565b9050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b60006151d2601d83613e04565b91506151dd8261519c565b602082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061523e601f83613e04565b915061524982615208565b602082019050919050565b6000602082019050818103600083015261526d81615231565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b60006152aa601f83613e04565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461530d816148aa565b61531781866152e0565b94506001821660008114615332576001811461534357615376565b60ff19831686528186019350615376565b61534c856152eb565b60005b8381101561536e5781548189015260018201915060208101905061534f565b838801955050505b50505092915050565b600061538a82613df9565b61539481856152e0565b93506153a4818560208601613e15565b80840191505092915050565b60006153bc8286615300565b91506153c8828561537f565b91506153d48284615300565b9150819050949350505050565b60006153ed828661537f565b91506153f9828561537f565b91506154058284615300565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061546e602683613e04565b915061547982615412565b604082019050919050565b6000602082019050818103600083015261549d81615461565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615500602c83613e04565b915061550b826154a4565b604082019050919050565b6000602082019050818103600083015261552f816154f3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615592602983613e04565b915061559d82615536565b604082019050919050565b600060208201905081810360008301526155c181615585565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615624602483613e04565b915061562f826155c8565b604082019050919050565b6000602082019050818103600083015261565381615617565b9050919050565b600061566582613eb4565b915061567083613eb4565b92508282101561568357615682614b24565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156c4601983613e04565b91506156cf8261568e565b602082019050919050565b600060208201905081810360008301526156f3816156b7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615756603283613e04565b9150615761826156fa565b604082019050919050565b6000602082019050818103600083015261578581615749565b9050919050565b7f4e6f742070726573616c65000000000000000000000000000000000000000000600082015250565b60006157c2600b83613e04565b91506157cd8261578c565b602082019050919050565b600060208201905081810360008301526157f1816157b5565b9050919050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b600061582e600f83613e04565b9150615839826157f8565b602082019050919050565b6000602082019050818103600083015261585d81615821565b9050919050565b7f50726f6f66206661696c65640000000000000000000000000000000000000000600082015250565b600061589a600c83613e04565b91506158a582615864565b602082019050919050565b600060208201905081810360008301526158c98161588d565b9050919050565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b6000615906600f83613e04565b9150615911826158d0565b602082019050919050565b60006020820190508181036000830152615935816158f9565b9050919050565b7f4e6f7420417574686f7269736564000000000000000000000000000000000000600082015250565b6000615972600e83613e04565b915061597d8261593c565b602082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b60006159b382613eb4565b91506159be83613eb4565b9250826159ce576159cd614bad565b5b828206905092915050565b6000819050919050565b6159f46159ef8261434f565b6159d9565b82525050565b6000615a0682856159e3565b602082019150615a1682846159e3565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615a4d82615a26565b615a578185615a31565b9350615a67818560208601613e15565b615a7081613e48565b840191505092915050565b6000608082019050615a906000830187613f17565b615a9d6020830186613f17565b615aaa6040830185613f81565b8181036060830152615abc8184615a42565b905095945050505050565b600081519050615ad681613cdf565b92915050565b600060208284031215615af257615af1613ca9565b5b6000615b0084828501615ac7565b91505092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615b3f601883613e04565b9150615b4a82615b09565b602082019050919050565b60006020820190508181036000830152615b6e81615b32565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615bab601f83613e04565b9150615bb682615b75565b602082019050919050565b60006020820190508181036000830152615bda81615b9e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c3d602283613e04565b9150615c4882615be1565b604082019050919050565b60006020820190508181036000830152615c6c81615c30565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ccf602283613e04565b9150615cda82615c73565b604082019050919050565b60006020820190508181036000830152615cfe81615cc2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d3b602083613e04565b9150615d4682615d05565b602082019050919050565b60006020820190508181036000830152615d6a81615d2e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615da7601c83613e04565b9150615db282615d71565b602082019050919050565b60006020820190508181036000830152615dd681615d9a565b9050919050565b615de6816143dc565b82525050565b6000608082019050615e016000830187614359565b615e0e6020830186615ddd565b615e1b6040830185614359565b615e286060830184614359565b9594505050505056fea2646970667358221220e4e81af5f0faf78dc79b0ddd6dbbe4dafe3e24a60d4013636535a9b9bc36ca5764736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d696e67736f6f6e2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d696e67736f6f6e2f00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636352211e11610175578063a45ba8e7116100dc578063ccaf1c4b11610095578063e051b4161161006f578063e051b41614610a7a578063e985e9c514610ab7578063f254933d14610af4578063f2fde38b14610b1d576102ae565b8063ccaf1c4b146109e9578063d0eb26b014610a26578063d5abeb0114610a4f576102ae565b8063a45ba8e7146108e6578063b88d4fde14610911578063ba7d2c761461093a578063c4bab46914610965578063c87b56dd14610981578063cafa8dfe146109be576102ae565b8063814c8c551161012e578063814c8c55146107d65780638da5cb5b146107ff57806395d89b411461082a57806397611638146108555780639da3f8fd14610892578063a22cb465146108bd576102ae565b80636352211e146106ca5780636f8b44b01461070757806370a0823114610730578063715018a61461076d5780637cb64759146107845780637ec4a659146107ad576102ae565b80632a55205a116102195780634fdd43cb116101d25780634fdd43cb146105cc57806351830227146105f55780635503a0e8146106205780635b7633d01461064b57806361ba27da1461067657806362b99ad41461069f576102ae565b80632a55205a146104d15780632bf043041461050f5780632eb4a7ab146105385780633ccfd60b1461056357806342842e0e1461057a57806344a0d68a146105a3576102ae565b8063122e04a81161026b578063122e04a8146103d557806313faede61461040057806316ba10e01461042b57806318160ddd1461045457806323b872dd1461047f5780632a3f300c146104a8576102ae565b806301ffc9a7146102b3578063046dc166146102f057806306fdde0314610319578063081812fc14610344578063095ea7b31461038157806309ef6527146103aa575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613d0b565b610b46565b6040516102e79190613d53565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613dcc565b610bc0565b005b34801561032557600080fd5b5061032e610c80565b60405161033b9190613e92565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190613eea565b610d12565b6040516103789190613f26565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190613f41565b610d97565b005b3480156103b657600080fd5b506103bf610eaf565b6040516103cc9190613f90565b60405180910390f35b3480156103e157600080fd5b506103ea610eb4565b6040516103f79190613f26565b60405180910390f35b34801561040c57600080fd5b50610415610ecc565b6040516104229190613f90565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d91906140e0565b610ed2565b005b34801561046057600080fd5b50610469610f68565b6040516104769190613f90565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a19190614129565b610f79565b005b3480156104b457600080fd5b506104cf60048036038101906104ca91906141a8565b610fd9565b005b3480156104dd57600080fd5b506104f860048036038101906104f391906141d5565b611072565b604051610506929190614215565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190614306565b6110a9565b005b34801561054457600080fd5b5061054d6111ba565b60405161055a9190614368565b60405180910390f35b34801561056f57600080fd5b506105786111c0565b005b34801561058657600080fd5b506105a1600480360381019061059c9190614129565b611343565b005b3480156105af57600080fd5b506105ca60048036038101906105c59190613eea565b611363565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906140e0565b611422565b005b34801561060157600080fd5b5061060a6114b8565b6040516106179190613d53565b60405180910390f35b34801561062c57600080fd5b506106356114cb565b6040516106429190613e92565b60405180910390f35b34801561065757600080fd5b50610660611559565b60405161066d9190613f26565b60405180910390f35b34801561068257600080fd5b5061069d60048036038101906106989190613eea565b61157f565b005b3480156106ab57600080fd5b506106b461163e565b6040516106c19190613e92565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190613eea565b6116cc565b6040516106fe9190613f26565b60405180910390f35b34801561071357600080fd5b5061072e60048036038101906107299190613eea565b61177e565b005b34801561073c57600080fd5b5061075760048036038101906107529190613dcc565b61183d565b6040516107649190613f90565b60405180910390f35b34801561077957600080fd5b506107826118f5565b005b34801561079057600080fd5b506107ab60048036038101906107a691906143af565b61197d565b005b3480156107b957600080fd5b506107d460048036038101906107cf91906140e0565b611a03565b005b3480156107e257600080fd5b506107fd60048036038101906107f89190614415565b611a99565b005b34801561080b57600080fd5b50610814611b57565b6040516108219190613f26565b60405180910390f35b34801561083657600080fd5b5061083f611b81565b60405161084c9190613e92565b60405180910390f35b34801561086157600080fd5b5061087c60048036038101906108779190614505565b611c13565b6040516108899190613d53565b60405180910390f35b34801561089e57600080fd5b506108a7611c4f565b6040516108b491906145c5565b60405180910390f35b3480156108c957600080fd5b506108e460048036038101906108df91906145e0565b611c62565b005b3480156108f257600080fd5b506108fb611c78565b6040516109089190613e92565b60405180910390f35b34801561091d57600080fd5b50610938600480360381019061093391906146c1565b611d06565b005b34801561094657600080fd5b5061094f611d68565b60405161095c9190613f90565b60405180910390f35b61097f600480360381019061097a9190614744565b611d6e565b005b34801561098d57600080fd5b506109a860048036038101906109a39190613eea565b6120ca565b6040516109b59190613e92565b60405180910390f35b3480156109ca57600080fd5b506109d36121f2565b6040516109e09190613f90565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b9190613dcc565b6121f8565b604051610a1d9190613d53565b60405180910390f35b348015610a3257600080fd5b50610a4d6004803603810190610a489190613eea565b61224e565b005b348015610a5b57600080fd5b50610a6461230d565b604051610a719190613f90565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613dcc565b612313565b604051610aae9190613f90565b60405180910390f35b348015610ac357600080fd5b50610ade6004803603810190610ad991906147cf565b61235c565b604051610aeb9190613d53565b60405180910390f35b348015610b0057600080fd5b50610b1b6004803603810190610b169190613f41565b6123f0565b005b348015610b2957600080fd5b50610b446004803603810190610b3f9190613dcc565b6124d3565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb95750610bb8826125cb565b5b9050919050565b610bc86126ad565b73ffffffffffffffffffffffffffffffffffffffff16610be6611b57565b73ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c339061485b565b60405180910390fd5b80601060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610c8f906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906148aa565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b6000610d1d826126b5565b610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d539061494e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610da2826116cc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906149e0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e326126ad565b73ffffffffffffffffffffffffffffffffffffffff161480610e615750610e6081610e5b6126ad565b61235c565b5b610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9790614a72565b60405180910390fd5b610eaa8383612721565b505050565b600281565b73fc4bf9d0ab489e7684ab0e06d33b8e2257d8ff6081565b600c5481565b610eda6126ad565b73ffffffffffffffffffffffffffffffffffffffff16610ef8611b57565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061485b565b60405180910390fd5b80600a9080519060200190610f64929190613bfc565b5050565b6000610f7460086127da565b905090565b610f8a610f846126ad565b826127e8565b610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc090614b04565b60405180910390fd5b610fd48383836128c6565b505050565b610fe16126ad565b73ffffffffffffffffffffffffffffffffffffffff16610fff611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104c9061485b565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000806000612710600f54856110889190614b53565b6110929190614bdc565b905061109c611b57565b8192509250509250929050565b6110b16126ad565b73ffffffffffffffffffffffffffffffffffffffff166110cf611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111c9061485b565b60405180910390fd5b60005b81518110156111b65760016012600084848151811061114a57611149614c0d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806111ae90614c3c565b915050611128565b5050565b60115481565b6111c86126ad565b73ffffffffffffffffffffffffffffffffffffffff166111e6611b57565b73ffffffffffffffffffffffffffffffffffffffff161461123c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112339061485b565b60405180910390fd5b6000471415611280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127790614cd1565b60405180910390fd5b600073fc4bf9d0ab489e7684ab0e06d33b8e2257d8ff6073ffffffffffffffffffffffffffffffffffffffff16476040516112ba90614d22565b60006040518083038185875af1925050503d80600081146112f7576040519150601f19603f3d011682016040523d82523d6000602084013e6112fc565b606091505b5050905080611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614d83565b60405180910390fd5b50565b61135e83838360405180602001604052806000815250611d06565b505050565b61136b6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611389611b57565b73ffffffffffffffffffffffffffffffffffffffff16146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d69061485b565b60405180910390fd5b80600c819055507f4f4c3fdb029cc44f6d0275f9173ce78767d49f5cde862d8bde92d65cf62ed592600c546040516114179190613f90565b60405180910390a150565b61142a6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611448611b57565b73ffffffffffffffffffffffffffffffffffffffff161461149e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114959061485b565b60405180910390fd5b80600b90805190602001906114b4929190613bfc565b5050565b601060009054906101000a900460ff1681565b600a80546114d8906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611504906148aa565b80156115515780601f1061152657610100808354040283529160200191611551565b820191906000526020600020905b81548152906001019060200180831161153457829003601f168201915b505050505081565b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115876126ad565b73ffffffffffffffffffffffffffffffffffffffff166115a5611b57565b73ffffffffffffffffffffffffffffffffffffffff16146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f29061485b565b60405180910390fd5b80600f819055507fda62376b47b7795fe735c385a0302da44a4eddbb8ac2728581dfc85e37475bd7600f546040516116339190613f90565b60405180910390a150565b6009805461164b906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611677906148aa565b80156116c45780601f10611699576101008083540402835291602001916116c4565b820191906000526020600020905b8154815290600101906020018083116116a757829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614e15565b60405180910390fd5b80915050919050565b6117866126ad565b73ffffffffffffffffffffffffffffffffffffffff166117a4611b57565b73ffffffffffffffffffffffffffffffffffffffff16146117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f19061485b565b60405180910390fd5b80600d819055507f42b641b1338fdba90b9846a65d4077e4f558cdb3fd273e9ef0469c2ca115e9a3600d546040516118329190613f90565b60405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a590614ea7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fd6126ad565b73ffffffffffffffffffffffffffffffffffffffff1661191b611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611971576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119689061485b565b60405180910390fd5b61197b6000612b22565b565b6119856126ad565b73ffffffffffffffffffffffffffffffffffffffff166119a3611b57565b73ffffffffffffffffffffffffffffffffffffffff16146119f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f09061485b565b60405180910390fd5b8060118190555050565b611a0b6126ad565b73ffffffffffffffffffffffffffffffffffffffff16611a29611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a769061485b565b60405180910390fd5b8060099080519060200190611a95929190613bfc565b5050565b611aa16126ad565b73ffffffffffffffffffffffffffffffffffffffff16611abf611b57565b73ffffffffffffffffffffffffffffffffffffffff1614611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c9061485b565b60405180910390fd5b8060ff166002811115611b2b57611b2a61454e565b5b601060016101000a81548160ff02191690836002811115611b4f57611b4e61454e565b5b021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611b90906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbc906148aa565b8015611c095780601f10611bde57610100808354040283529160200191611c09565b820191906000526020600020905b815481529060010190602001808311611bec57829003601f168201915b5050505050905090565b6000611c488260115433604051602001611c2d9190614f0f565b60405160208183030381529060405280519060200120612be8565b9050919050565b601060019054906101000a900460ff1681565b611c74611c6d6126ad565b8383612bff565b5050565b600b8054611c85906148aa565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb1906148aa565b8015611cfe5780601f10611cd357610100808354040283529160200191611cfe565b820191906000526020600020905b815481529060010190602001808311611ce157829003601f168201915b505050505081565b611d17611d116126ad565b836127e8565b611d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4d90614b04565b60405180910390fd5b611d6284848484612d6c565b50505050565b600e5481565b8260006002811115611d8357611d8261454e565b5b601060019054906101000a900460ff166002811115611da557611da461454e565b5b1415611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614f76565b60405180910390fd5b600d5481611df460086127da565b611dfe9190614f96565b1115611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690615038565b60405180910390fd5b600081118015611e50575060028111155b611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e86906150a4565b60405180910390fd5b80600c54611e9d9190614b53565b341015611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690615110565b60405180910390fd5b600e5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f2d9190614f96565b1115611f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f659061517c565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd3906151e8565b60405180910390fd5b60026007541415612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990615254565b60405180910390fd5b60026007819055506001600281111561203e5761203d61454e565b5b601060019054906101000a900460ff1660028111156120605761205f61454e565b5b1415612075576120708484612dc8565b6120bc565b6002808111156120885761208761454e565b5b601060019054906101000a900460ff1660028111156120aa576120a961454e565b5b14156120bb576120ba8483612f26565b5b5b600160078190555050505050565b60606120d5826126b5565b612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b906152c0565b60405180910390fd5b60001515601060009054906101000a900460ff1615151415612191576000600b805461213f906148aa565b90501161215b576040518060200160405280600081525061218a565b600b61216683613047565b600a60405160200161217a939291906153b0565b6040516020818303038152906040525b90506121ed565b600061219b6131a8565b905060008151116121bb57604051806020016040528060008152506121e9565b806121c584613047565b600a6040516020016121d9939291906153e1565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6122566126ad565b73ffffffffffffffffffffffffffffffffffffffff16612274611b57565b73ffffffffffffffffffffffffffffffffffffffff16146122ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c19061485b565b60405180910390fd5b80600e819055507f13fc1ba10e9f6a29d6d8caca49e594617194994ef122ec8ee309f3bd09efd450600e546040516123029190613f90565b60405180910390a150565b600d5481565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123f86126ad565b73ffffffffffffffffffffffffffffffffffffffff16612416611b57565b73ffffffffffffffffffffffffffffffffffffffff161461246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061485b565b60405180910390fd5b600d548161247a60086127da565b6124849190614f96565b11156124c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bc90615038565b60405180910390fd5b6124cf828261323a565b5050565b6124db6126ad565b73ffffffffffffffffffffffffffffffffffffffff166124f9611b57565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125469061485b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b690615484565b60405180910390fd5b6125c881612b22565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061269657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806126a657506126a5826132cf565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612794836116cc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006127f3826126b5565b612832576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282990615516565b60405180910390fd5b600061283d836116cc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ac57508373ffffffffffffffffffffffffffffffffffffffff1661289484610d12565b73ffffffffffffffffffffffffffffffffffffffff16145b806128bd57506128bc818561235c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128e6826116cc565b73ffffffffffffffffffffffffffffffffffffffff161461293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906155a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39061563a565b60405180910390fd5b6129b7838383613339565b6129c2600082612721565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a12919061565a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a699190614f96565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600082612bf5858461333e565b1490509392505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c65906156da565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d5f9190613d53565b60405180910390a3505050565b612d778484846128c6565b612d83848484846133f1565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db99061576c565b60405180910390fd5b50505050565b60016002811115612ddc57612ddb61454e565b5b601060019054906101000a900460ff166002811115612dfe57612dfd61454e565b5b14612e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e35906157d8565b60405180910390fd5b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec190615844565b60405180910390fd5b612ed381611c13565b15612ee757612ee2338361323a565b612f22565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f19906158b0565b60405180910390fd5b5050565b600280811115612f3957612f3861454e565b5b601060019054906101000a900460ff166002811115612f5b57612f5a61454e565b5b14612f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f929061591c565b60405180910390fd5b601060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612fdd82613579565b73ffffffffffffffffffffffffffffffffffffffff16141561300857613003338361323a565b613043565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303a90615988565b60405180910390fd5b5050565b6060600082141561308f576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131a3565b600082905060005b600082146130c15780806130aa90614c3c565b915050600a826130ba9190614bdc565b9150613097565b60008167ffffffffffffffff8111156130dd576130dc613fb5565b5b6040519080825280601f01601f19166020018201604052801561310f5781602001600182028036833780820191505090505b5090505b6000851461319c57600182613128919061565a565b9150600a8561313791906159a8565b60306131439190614f96565b60f81b81838151811061315957613158614c0d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131959190614bdc565b9450613113565b8093505050505b919050565b6060600980546131b7906148aa565b80601f01602080910402602001604051908101604052809291908181526020018280546131e3906148aa565b80156132305780601f1061320557610100808354040283529160200191613230565b820191906000526020600020905b81548152906001019060200180831161321357829003601f168201915b5050505050905090565b60005b818110156132ca57601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061329590614c3c565b91905055506132a460086135b2565b6132b7836132b260086127da565b6135c8565b80806132c290614c3c565b91505061323d565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60008082905060005b84518110156133e657600085828151811061336557613364614c0d565b5b602002602001015190508083116133a65782816040516020016133899291906159fa565b6040516020818303038152906040528051906020012092506133d2565b80836040516020016133b99291906159fa565b6040516020818303038152906040528051906020012092505b5080806133de90614c3c565b915050613347565b508091505092915050565b60006134128473ffffffffffffffffffffffffffffffffffffffff166135e6565b1561356c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261343b6126ad565b8786866040518563ffffffff1660e01b815260040161345d9493929190615a7b565b6020604051808303816000875af192505050801561349957506040513d601f19601f820116820180604052508101906134969190615adc565b60015b61351c573d80600081146134c9576040519150601f19603f3d011682016040523d82523d6000602084013e6134ce565b606091505b50600081511415613514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350b9061576c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613571565b600190505b949350505050565b60006135ab3360405160200161358f9190613f26565b60405160208183030381529060405280519060200120836135f9565b9050919050565b6001816000016000828254019250508190555050565b6135e2828260405180602001604052806000815250613620565b5050565b600080823b905060008111915050919050565b6000806000613608858561367b565b91509150613615816136fe565b819250505092915050565b61362a83836138d3565b61363760008484846133f1565b613676576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366d9061576c565b60405180910390fd5b505050565b6000806041835114156136bd5760008060006020860151925060408601519150606086015160001a90506136b187828585613aa1565b945094505050506136f7565b6040835114156136ee5760008060208501519150604085015190506136e3868383613bae565b9350935050506136f7565b60006002915091505b9250929050565b600060048111156137125761371161454e565b5b8160048111156137255761372461454e565b5b1415613730576138d0565b600160048111156137445761374361454e565b5b8160048111156137575761375661454e565b5b1415613798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161378f90615b55565b60405180910390fd5b600260048111156137ac576137ab61454e565b5b8160048111156137bf576137be61454e565b5b1415613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f790615bc1565b60405180910390fd5b600360048111156138145761381361454e565b5b8160048111156138275761382661454e565b5b1415613868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385f90615c53565b60405180910390fd5b60048081111561387b5761387a61454e565b5b81600481111561388e5761388d61454e565b5b14156138cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138c690615ce5565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161393a90615d51565b60405180910390fd5b61394c816126b5565b1561398c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161398390615dbd565b60405180910390fd5b61399860008383613339565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e89190614f96565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613adc576000600391509150613ba5565b601b8560ff1614158015613af45750601c8560ff1614155b15613b06576000600491509150613ba5565b600060018787878760405160008152602001604052604051613b2b9493929190615dec565b6020604051602081039080840390855afa158015613b4d573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b9c57600060019250925050613ba5565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613bee87828885613aa1565b935093505050935093915050565b828054613c08906148aa565b90600052602060002090601f016020900481019282613c2a5760008555613c71565b82601f10613c4357805160ff1916838001178555613c71565b82800160010185558215613c71579182015b82811115613c70578251825591602001919060010190613c55565b5b509050613c7e9190613c82565b5090565b5b80821115613c9b576000816000905550600101613c83565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ce881613cb3565b8114613cf357600080fd5b50565b600081359050613d0581613cdf565b92915050565b600060208284031215613d2157613d20613ca9565b5b6000613d2f84828501613cf6565b91505092915050565b60008115159050919050565b613d4d81613d38565b82525050565b6000602082019050613d686000830184613d44565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d9982613d6e565b9050919050565b613da981613d8e565b8114613db457600080fd5b50565b600081359050613dc681613da0565b92915050565b600060208284031215613de257613de1613ca9565b5b6000613df084828501613db7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e33578082015181840152602081019050613e18565b83811115613e42576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e6482613df9565b613e6e8185613e04565b9350613e7e818560208601613e15565b613e8781613e48565b840191505092915050565b60006020820190508181036000830152613eac8184613e59565b905092915050565b6000819050919050565b613ec781613eb4565b8114613ed257600080fd5b50565b600081359050613ee481613ebe565b92915050565b600060208284031215613f0057613eff613ca9565b5b6000613f0e84828501613ed5565b91505092915050565b613f2081613d8e565b82525050565b6000602082019050613f3b6000830184613f17565b92915050565b60008060408385031215613f5857613f57613ca9565b5b6000613f6685828601613db7565b9250506020613f7785828601613ed5565b9150509250929050565b613f8a81613eb4565b82525050565b6000602082019050613fa56000830184613f81565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fed82613e48565b810181811067ffffffffffffffff8211171561400c5761400b613fb5565b5b80604052505050565b600061401f613c9f565b905061402b8282613fe4565b919050565b600067ffffffffffffffff82111561404b5761404a613fb5565b5b61405482613e48565b9050602081019050919050565b82818337600083830152505050565b600061408361407e84614030565b614015565b90508281526020810184848401111561409f5761409e613fb0565b5b6140aa848285614061565b509392505050565b600082601f8301126140c7576140c6613fab565b5b81356140d7848260208601614070565b91505092915050565b6000602082840312156140f6576140f5613ca9565b5b600082013567ffffffffffffffff81111561411457614113613cae565b5b614120848285016140b2565b91505092915050565b60008060006060848603121561414257614141613ca9565b5b600061415086828701613db7565b935050602061416186828701613db7565b925050604061417286828701613ed5565b9150509250925092565b61418581613d38565b811461419057600080fd5b50565b6000813590506141a28161417c565b92915050565b6000602082840312156141be576141bd613ca9565b5b60006141cc84828501614193565b91505092915050565b600080604083850312156141ec576141eb613ca9565b5b60006141fa85828601613ed5565b925050602061420b85828601613ed5565b9150509250929050565b600060408201905061422a6000830185613f17565b6142376020830184613f81565b9392505050565b600067ffffffffffffffff82111561425957614258613fb5565b5b602082029050602081019050919050565b600080fd5b600061428261427d8461423e565b614015565b905080838252602082019050602084028301858111156142a5576142a461426a565b5b835b818110156142ce57806142ba8882613db7565b8452602084019350506020810190506142a7565b5050509392505050565b600082601f8301126142ed576142ec613fab565b5b81356142fd84826020860161426f565b91505092915050565b60006020828403121561431c5761431b613ca9565b5b600082013567ffffffffffffffff81111561433a57614339613cae565b5b614346848285016142d8565b91505092915050565b6000819050919050565b6143628161434f565b82525050565b600060208201905061437d6000830184614359565b92915050565b61438c8161434f565b811461439757600080fd5b50565b6000813590506143a981614383565b92915050565b6000602082840312156143c5576143c4613ca9565b5b60006143d38482850161439a565b91505092915050565b600060ff82169050919050565b6143f2816143dc565b81146143fd57600080fd5b50565b60008135905061440f816143e9565b92915050565b60006020828403121561442b5761442a613ca9565b5b600061443984828501614400565b91505092915050565b600067ffffffffffffffff82111561445d5761445c613fb5565b5b602082029050602081019050919050565b600061448161447c84614442565b614015565b905080838252602082019050602084028301858111156144a4576144a361426a565b5b835b818110156144cd57806144b9888261439a565b8452602084019350506020810190506144a6565b5050509392505050565b600082601f8301126144ec576144eb613fab565b5b81356144fc84826020860161446e565b91505092915050565b60006020828403121561451b5761451a613ca9565b5b600082013567ffffffffffffffff81111561453957614538613cae565b5b614545848285016144d7565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061458e5761458d61454e565b5b50565b600081905061459f8261457d565b919050565b60006145af82614591565b9050919050565b6145bf816145a4565b82525050565b60006020820190506145da60008301846145b6565b92915050565b600080604083850312156145f7576145f6613ca9565b5b600061460585828601613db7565b925050602061461685828601614193565b9150509250929050565b600067ffffffffffffffff82111561463b5761463a613fb5565b5b61464482613e48565b9050602081019050919050565b600061466461465f84614620565b614015565b9050828152602081018484840111156146805761467f613fb0565b5b61468b848285614061565b509392505050565b600082601f8301126146a8576146a7613fab565b5b81356146b8848260208601614651565b91505092915050565b600080600080608085870312156146db576146da613ca9565b5b60006146e987828801613db7565b94505060206146fa87828801613db7565b935050604061470b87828801613ed5565b925050606085013567ffffffffffffffff81111561472c5761472b613cae565b5b61473887828801614693565b91505092959194509250565b60008060006060848603121561475d5761475c613ca9565b5b600061476b86828701613ed5565b935050602084013567ffffffffffffffff81111561478c5761478b613cae565b5b614798868287016144d7565b925050604084013567ffffffffffffffff8111156147b9576147b8613cae565b5b6147c586828701614693565b9150509250925092565b600080604083850312156147e6576147e5613ca9565b5b60006147f485828601613db7565b925050602061480585828601613db7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614845602083613e04565b91506148508261480f565b602082019050919050565b6000602082019050818103600083015261487481614838565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806148c257607f821691505b602082108114156148d6576148d561487b565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614938602c83613e04565b9150614943826148dc565b604082019050919050565b600060208201905081810360008301526149678161492b565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149ca602183613e04565b91506149d58261496e565b604082019050919050565b600060208201905081810360008301526149f9816149bd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614a5c603883613e04565b9150614a6782614a00565b604082019050919050565b60006020820190508181036000830152614a8b81614a4f565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614aee603183613e04565b9150614af982614a92565b604082019050919050565b60006020820190508181036000830152614b1d81614ae1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5e82613eb4565b9150614b6983613eb4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ba257614ba1614b24565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614be782613eb4565b9150614bf283613eb4565b925082614c0257614c01614bad565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614c4782613eb4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7a57614c79614b24565b5b600182019050919050565b7f42616c616e6365206973207a65726f0000000000000000000000000000000000600082015250565b6000614cbb600f83613e04565b9150614cc682614c85565b602082019050919050565b60006020820190508181036000830152614cea81614cae565b9050919050565b600081905092915050565b50565b6000614d0c600083614cf1565b9150614d1782614cfc565b600082019050919050565b6000614d2d82614cff565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614d6d601183613e04565b9150614d7882614d37565b602082019050919050565b60006020820190508181036000830152614d9c81614d60565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614dff602983613e04565b9150614e0a82614da3565b604082019050919050565b60006020820190508181036000830152614e2e81614df2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614e91602a83613e04565b9150614e9c82614e35565b604082019050919050565b60006020820190508181036000830152614ec081614e84565b9050919050565b60008160601b9050919050565b6000614edf82614ec7565b9050919050565b6000614ef182614ed4565b9050919050565b614f09614f0482613d8e565b614ee6565b82525050565b6000614f1b8284614ef8565b60148201915081905092915050565b7f4d696e74696e6720697320636c6f736564000000000000000000000000000000600082015250565b6000614f60601183613e04565b9150614f6b82614f2a565b602082019050919050565b60006020820190508181036000830152614f8f81614f53565b9050919050565b6000614fa182613eb4565b9150614fac83613eb4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fe157614fe0614b24565b5b828201905092915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000615022601383613e04565b915061502d82614fec565b602082019050919050565b6000602082019050818103600083015261505181615015565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b600061508e601383613e04565b915061509982615058565b602082019050919050565b600060208201905081810360008301526150bd81615081565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006150fa601283613e04565b9150615105826150c4565b602082019050919050565b60006020820190508181036000830152615129816150ed565b9050919050565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b6000615166601c83613e04565b915061517182615130565b602082019050919050565b6000602082019050818103600083015261519581615159565b9050919050565b7f436f6e747261637473206e6f7420616c6c6f77656420746f206d696e74000000600082015250565b60006151d2601d83613e04565b91506151dd8261519c565b602082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061523e601f83613e04565b915061524982615208565b602082019050919050565b6000602082019050818103600083015261526d81615231565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b60006152aa601f83613e04565b91506152b582615274565b602082019050919050565b600060208201905081810360008301526152d98161529d565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461530d816148aa565b61531781866152e0565b94506001821660008114615332576001811461534357615376565b60ff19831686528186019350615376565b61534c856152eb565b60005b8381101561536e5781548189015260018201915060208101905061534f565b838801955050505b50505092915050565b600061538a82613df9565b61539481856152e0565b93506153a4818560208601613e15565b80840191505092915050565b60006153bc8286615300565b91506153c8828561537f565b91506153d48284615300565b9150819050949350505050565b60006153ed828661537f565b91506153f9828561537f565b91506154058284615300565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061546e602683613e04565b915061547982615412565b604082019050919050565b6000602082019050818103600083015261549d81615461565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615500602c83613e04565b915061550b826154a4565b604082019050919050565b6000602082019050818103600083015261552f816154f3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000615592602983613e04565b915061559d82615536565b604082019050919050565b600060208201905081810360008301526155c181615585565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615624602483613e04565b915061562f826155c8565b604082019050919050565b6000602082019050818103600083015261565381615617565b9050919050565b600061566582613eb4565b915061567083613eb4565b92508282101561568357615682614b24565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156c4601983613e04565b91506156cf8261568e565b602082019050919050565b600060208201905081810360008301526156f3816156b7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615756603283613e04565b9150615761826156fa565b604082019050919050565b6000602082019050818103600083015261578581615749565b9050919050565b7f4e6f742070726573616c65000000000000000000000000000000000000000000600082015250565b60006157c2600b83613e04565b91506157cd8261578c565b602082019050919050565b600060208201905081810360008301526157f1816157b5565b9050919050565b7f4e6f742057686974656c69737465640000000000000000000000000000000000600082015250565b600061582e600f83613e04565b9150615839826157f8565b602082019050919050565b6000602082019050818103600083015261585d81615821565b9050919050565b7f50726f6f66206661696c65640000000000000000000000000000000000000000600082015250565b600061589a600c83613e04565b91506158a582615864565b602082019050919050565b600060208201905081810360008301526158c98161588d565b9050919050565b7f4e6f74207075626c69632073616c650000000000000000000000000000000000600082015250565b6000615906600f83613e04565b9150615911826158d0565b602082019050919050565b60006020820190508181036000830152615935816158f9565b9050919050565b7f4e6f7420417574686f7269736564000000000000000000000000000000000000600082015250565b6000615972600e83613e04565b915061597d8261593c565b602082019050919050565b600060208201905081810360008301526159a181615965565b9050919050565b60006159b382613eb4565b91506159be83613eb4565b9250826159ce576159cd614bad565b5b828206905092915050565b6000819050919050565b6159f46159ef8261434f565b6159d9565b82525050565b6000615a0682856159e3565b602082019150615a1682846159e3565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000615a4d82615a26565b615a578185615a31565b9350615a67818560208601613e15565b615a7081613e48565b840191505092915050565b6000608082019050615a906000830187613f17565b615a9d6020830186613f17565b615aaa6040830185613f81565b8181036060830152615abc8184615a42565b905095945050505050565b600081519050615ad681613cdf565b92915050565b600060208284031215615af257615af1613ca9565b5b6000615b0084828501615ac7565b91505092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615b3f601883613e04565b9150615b4a82615b09565b602082019050919050565b60006020820190508181036000830152615b6e81615b32565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000615bab601f83613e04565b9150615bb682615b75565b602082019050919050565b60006020820190508181036000830152615bda81615b9e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615c3d602283613e04565b9150615c4882615be1565b604082019050919050565b60006020820190508181036000830152615c6c81615c30565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615ccf602283613e04565b9150615cda82615c73565b604082019050919050565b60006020820190508181036000830152615cfe81615cc2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d3b602083613e04565b9150615d4682615d05565b602082019050919050565b60006020820190508181036000830152615d6a81615d2e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615da7601c83613e04565b9150615db282615d71565b602082019050919050565b60006020820190508181036000830152615dd681615d9a565b9050919050565b615de6816143dc565b82525050565b6000608082019050615e016000830187614359565b615e0e6020830186615ddd565b615e1b6040830185614359565b615e286060830184614359565b9594505050505056fea2646970667358221220e4e81af5f0faf78dc79b0ddd6dbbe4dafe3e24a60d4013636535a9b9bc36ca5764736f6c634300080c0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d696e67736f6f6e2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002768747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d696e67736f6f6e2f00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initUriPrefix (string): https://bapetaverse.com/api/comingsoon/
Arg [1] : _initHiddenMetadataUri (string): https://bapetaverse.com/api/comingsoon/

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [3] : 68747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d69
Arg [4] : 6e67736f6f6e2f00000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [6] : 68747470733a2f2f62617065746176657273652e636f6d2f6170692f636f6d69
Arg [7] : 6e67736f6f6e2f00000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52261:7145:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54706:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58404:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26253:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27812:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27335:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52752:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52971:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52595:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57985:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56670:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28562:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58865:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54462:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;58227:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53060:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59050:233;;;;;;;;;;;;;:::i;:::-;;28972:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57627:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58093:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52808:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52526;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52894:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57281:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52499:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25947:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57740:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25677:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5984:103;;;;;;;;;;;;;:::i;:::-;;58763:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57877:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58946:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5333:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26422:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56476:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52840:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28105:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52558:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29228:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52667:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55962:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56761:500;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52708:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58522:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57462:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52631:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28331:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54909:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6242:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54706:198;54800:4;54833:26;54818:41;;;:11;:41;;;;:81;;;;54863:36;54887:11;54863:23;:36::i;:::-;54818:81;54811:88;;54706:198;;;:::o;58404:113::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58495:17:::1;58479:13;;:33;;;;;;;;;;;;;;;;;;58404:113:::0;:::o;26253:100::-;26307:13;26340:5;26333:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26253:100;:::o;27812:221::-;27888:7;27916:16;27924:7;27916;:16::i;:::-;27908:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28001:15;:24;28017:7;28001:24;;;;;;;;;;;;;;;;;;;;;27994:31;;27812:221;;;:::o;27335:411::-;27416:13;27432:23;27447:7;27432:14;:23::i;:::-;27416:39;;27480:5;27474:11;;:2;:11;;;;27466:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27574:5;27558:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27583:37;27600:5;27607:12;:10;:12::i;:::-;27583:16;:37::i;:::-;27558:62;27536:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27717:21;27726:2;27730:7;27717:8;:21::i;:::-;27405:341;27335:411;;:::o;52752:50::-;52801:1;52752:50;:::o;52971:85::-;53014:42;52971:85;:::o;52595:32::-;;;;:::o;57985:103::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58070:13:::1;58058:9;:25;;;;;;;;;;;;:::i;:::-;;57985:103:::0;:::o;56670:86::-;56714:7;56735:16;:6;:14;:16::i;:::-;56728:23;;56670:86;:::o;28562:339::-;28757:41;28776:12;:10;:12::i;:::-;28790:7;28757:18;:41::i;:::-;28749:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28865:28;28875:4;28881:2;28885:7;28865:9;:28::i;:::-;28562:339;;;:::o;58865:76::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58930:6:::1;58919:8;;:17;;;;;;;;;;;;;;;;;;58865:76:::0;:::o;54462:227::-;54544:16;54562:21;54590:17;54647:5;54624:19;;54611:10;:32;;;;:::i;:::-;54610:42;;;;:::i;:::-;54590:62;;54665:7;:5;:7::i;:::-;54674:9;54657:27;;;;;54462:227;;;;;:::o;58227:172::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58313:9:::1;58308:87;58328:10;:17;58324:1;:21;58308:87;;;58385:4;58358:9;:24;58368:10;58379:1;58368:13;;;;;;;;:::i;:::-;;;;;;;;58358:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;58347:3;;;;;:::i;:::-;;;;58308:87;;;;58227:172:::0;:::o;53060:94::-;;;;:::o;59050:233::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59125:1:::1;59100:21;:26;;59092:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;59152:12;53014:42;59170:30;;59209:21;59170:66;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59151:85;;;59249:7;59241:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;59087:196;59050:233::o:0;28972:185::-;29110:39;29127:4;29133:2;29137:7;29110:39;;;;;;;;;;;;:16;:39::i;:::-;28972:185;;;:::o;57627:108::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57691:8:::1;57684:4;:15;;;;57715;57725:4;;57715:15;;;;;;:::i;:::-;;;;;;;;57627:108:::0;:::o;58093:129::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58199:18:::1;58179:17;:38;;;;;;;;;;;;:::i;:::-;;58093:129:::0;:::o;52808:28::-;;;;;;;;;;;;;:::o;52526:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52894:73::-;;;;;;;;;;;;;:::o;57281:176::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57379:14:::1;57357:19;:36;;;;57409:43;57432:19;;57409:43;;;;;;:::i;:::-;;;;;;;;57281:176:::0;:::o;52499:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25947:239::-;26019:7;26039:13;26055:7;:16;26063:7;26055:16;;;;;;;;;;;;;;;;;;;;;26039:32;;26107:1;26090:19;;:5;:19;;;;26082:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26173:5;26166:12;;;25947:239;;;:::o;57740:132::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57816:10:::1;57804:9;:22;;;;57842:25;57857:9;;57842:25;;;;;;:::i;:::-;;;;;;;;57740:132:::0;:::o;25677:208::-;25749:7;25794:1;25777:19;;:5;:19;;;;25769:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25861:9;:16;25871:5;25861:16;;;;;;;;;;;;;;;;25854:23;;25677:208;;;:::o;5984:103::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6049:30:::1;6076:1;6049:18;:30::i;:::-;5984:103::o:0;58763:97::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58844:11:::1;58831:10;:24;;;;58763:97:::0;:::o;57877:103::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57962:13:::1;57950:9;:25;;;;;;;;;;;;:::i;:::-;;57877:103:::0;:::o;58946:99::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59032:7:::1;59021:19;;;;;;;;;;:::i;:::-;;59008:10;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;58946:99:::0;:::o;5333:87::-;5379:7;5406:6;;;;;;;;;;;5399:13;;5333:87;:::o;26422:104::-;26478:13;26511:7;26504:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26422:104;:::o;56476:189::-;56538:4;56560:100;56585:6;56598:10;;56642;56625:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56615:39;;;;;;56560:18;:100::i;:::-;56549:111;;56476:189;;;:::o;52840:48::-;;;;;;;;;;;;;:::o;28105:155::-;28200:52;28219:12;:10;:12::i;:::-;28233:8;28243;28200:18;:52::i;:::-;28105:155;;:::o;52558:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29228:328::-;29403:41;29422:12;:10;:12::i;:::-;29436:7;29403:18;:41::i;:::-;29395:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29509:39;29523:4;29529:2;29533:7;29542:5;29509:13;:39::i;:::-;29228:328;;;;:::o;52667:37::-;;;;:::o;55962:350::-;56090:11;54039:17;54025:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;;54017:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54125:9;;54110:11;54091:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;54083:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54185:1;54171:11;:15;:56;;;;;52801:1;54190:11;:37;;54171:56;54163:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;54284:11;54277:4;;:18;;;;:::i;:::-;54264:9;:31;;54256:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54381:18;;54366:11;54331:20;:32;54352:10;54331:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:68;;54323:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;53908:9:::1;53894:23;;:10;:23;;;53886:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39554:1:::2;40152:7;;:19;;40144:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39554:1;40285:7;:18;;;;56152::::3;56138:32;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:32;;;;;;;;:::i;:::-;;;56134:174;;;56178:33;56191:11;56204:6;56178:12;:33::i;:::-;56134:174;;;56241:17;56227:31:::0;::::3;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;56223:85;;;56266:36;56278:11;56291:10;56266:11;:36::i;:::-;56223:85;56134:174;39510:1:::2;40464:7;:22;;;;55962:350:::0;;;;:::o;56761:500::-;56834:13;56862:16;56870:7;56862;:16::i;:::-;56854:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;56937:5;56925:17;;:8;;;;;;;;;;;:17;;;56921:159;;;56991:1;56963:17;56957:31;;;;;:::i;:::-;;;:35;:117;;;;;;;;;;;;;;;;;57019:17;57038:18;:7;:16;:18::i;:::-;57058:9;57002:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56957:117;56950:124;;;;56921:159;57086:30;57119:10;:8;:10::i;:::-;57086:43;;57174:1;57147:16;57141:30;:34;:115;;;;;;;;;;;;;;;;;57202:16;57220:18;:7;:16;:18::i;:::-;57240:9;57185:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57141:115;57134:122;;;56761:500;;;;:::o;52708:40::-;;;;:::o;58522:108::-;58588:4;58606:9;:19;58616:8;58606:19;;;;;;;;;;;;;;;;;;;;;;;;;58599:26;;58522:108;;;:::o;57462:160::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57552:6:::1;57531:18;:27;;;;57574:43;57598:18;;57574:43;;;;;;:::i;:::-;;;;;;;;57462:160:::0;:::o;52631:32::-;;;;:::o;58638:120::-;58702:7;58723:20;:30;58744:8;58723:30;;;;;;;;;;;;;;;;58716:37;;58638:120;;;:::o;28331:164::-;28428:4;28452:18;:25;28471:5;28452:25;;;;;;;;;;;;;;;:35;28478:8;28452:35;;;;;;;;;;;;;;;;;;;;;;;;;28445:42;;28331:164;;;;:::o;54909:210::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55043:9:::1;;55028:11;55009:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;55001:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55081:33;55091:9;55102:11;55081:9;:33::i;:::-;54909:210:::0;;:::o;6242:201::-;5564:12;:10;:12::i;:::-;5553:23;;:7;:5;:7::i;:::-;:23;;;5545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6351:1:::1;6331:22;;:8;:22;;;;6323:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6407:28;6426:8;6407:18;:28::i;:::-;6242:201:::0;:::o;25308:305::-;25410:4;25462:25;25447:40;;;:11;:40;;;;:105;;;;25519:33;25504:48;;;:11;:48;;;;25447:105;:158;;;;25569:36;25593:11;25569:23;:36::i;:::-;25447:158;25427:178;;25308:305;;;:::o;4120:98::-;4173:7;4200:10;4193:17;;4120:98;:::o;31066:127::-;31131:4;31183:1;31155:30;;:7;:16;31163:7;31155:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31148:37;;31066:127;;;:::o;35048:174::-;35150:2;35123:15;:24;35139:7;35123:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35206:7;35202:2;35168:46;;35177:23;35192:7;35177:14;:23::i;:::-;35168:46;;;;;;;;;;;;35048:174;;:::o;844:114::-;909:7;936;:14;;;929:21;;844:114;;;:::o;31360:348::-;31453:4;31478:16;31486:7;31478;:16::i;:::-;31470:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31554:13;31570:23;31585:7;31570:14;:23::i;:::-;31554:39;;31623:5;31612:16;;:7;:16;;;:51;;;;31656:7;31632:31;;:20;31644:7;31632:11;:20::i;:::-;:31;;;31612:51;:87;;;;31667:32;31684:5;31691:7;31667:16;:32::i;:::-;31612:87;31604:96;;;31360:348;;;;:::o;34352:578::-;34511:4;34484:31;;:23;34499:7;34484:14;:23::i;:::-;:31;;;34476:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34594:1;34580:16;;:2;:16;;;;34572:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34650:39;34671:4;34677:2;34681:7;34650:20;:39::i;:::-;34754:29;34771:1;34775:7;34754:8;:29::i;:::-;34815:1;34796:9;:15;34806:4;34796:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34844:1;34827:9;:13;34837:2;34827:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34875:2;34856:7;:16;34864:7;34856:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34914:7;34910:2;34895:27;;34904:4;34895:27;;;;;;;;;;;;34352:578;;;:::o;6603:191::-;6677:16;6696:6;;;;;;;;;;;6677:25;;6722:8;6713:6;;:17;;;;;;;;;;;;;;;;;;6777:8;6746:40;;6767:8;6746:40;;;;;;;;;;;;6666:128;6603:191;:::o;50896:190::-;51021:4;51074;51045:25;51058:5;51065:4;51045:12;:25::i;:::-;:33;51038:40;;50896:190;;;;;:::o;35364:315::-;35519:8;35510:17;;:5;:17;;;;35502:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35606:8;35568:18;:25;35587:5;35568:25;;;;;;;;;;;;;;;:35;35594:8;35568:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35652:8;35630:41;;35645:5;35630:41;;;35662:8;35630:41;;;;;;:::i;:::-;;;;;;;;35364:315;;;:::o;30438:::-;30595:28;30605:4;30611:2;30615:7;30595:9;:28::i;:::-;30642:48;30665:4;30671:2;30675:7;30684:5;30642:22;:48::i;:::-;30634:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30438:315;;;;:::o;55360:308::-;55463:18;55449:32;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:32;;;;;;;;:::i;:::-;;;55441:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;55510:9;:21;55520:10;55510:21;;;;;;;;;;;;;;;;;;;;;;;;;55502:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55562:14;55569:6;55562;:14::i;:::-;55558:106;;;55584:34;55594:10;55606:11;55584:9;:34::i;:::-;55558:106;;;55636:22;;;;;;;;;;:::i;:::-;;;;;;;;55558:106;55360:308;;:::o;55673:284::-;55775:17;55761:31;;;;;;;;:::i;:::-;;:10;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;55753:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55850:13;;;;;;;;;;;55823:40;;:23;55835:10;55823:11;:23::i;:::-;:40;;;55819:134;;;55871:34;55881:10;55893:11;55871:9;:34::i;:::-;55819:134;;;55923:24;;;;;;;;;;:::i;:::-;;;;;;;;55819:134;55673:284;;:::o;1742:723::-;1798:13;2028:1;2019:5;:10;2015:53;;;2046:10;;;;;;;;;;;;;;;;;;;;;2015:53;2078:12;2093:5;2078:20;;2109:14;2134:78;2149:1;2141:4;:9;2134:78;;2167:8;;;;;:::i;:::-;;;;2198:2;2190:10;;;;;:::i;:::-;;;2134:78;;;2222:19;2254:6;2244:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2222:39;;2272:154;2288:1;2279:5;:10;2272:154;;2316:1;2306:11;;;;;:::i;:::-;;;2383:2;2375:5;:10;;;;:::i;:::-;2362:2;:24;;;;:::i;:::-;2349:39;;2332:6;2339;2332:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2412:2;2403:11;;;;;:::i;:::-;;;2272:154;;;2450:6;2436:21;;;;;1742:723;;;;:::o;59302:101::-;59362:13;59389:9;59382:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59302:101;:::o;55124:231::-;55201:9;55196:155;55220:11;55216:1;:15;55196:155;;;55244:20;:31;55265:9;55244:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;55283:18;:6;:16;:18::i;:::-;55307:38;55317:9;55328:16;:6;:14;:16::i;:::-;55307:9;:38::i;:::-;55233:3;;;;;:::i;:::-;;;;55196:155;;;;55124:231;;:::o;18314:157::-;18399:4;18438:25;18423:40;;;:11;:40;;;;18416:47;;18314:157;;;:::o;37615:126::-;;;;:::o;51448:701::-;51531:7;51551:20;51574:4;51551:27;;51594:9;51589:523;51613:5;:12;51609:1;:16;51589:523;;;51647:20;51670:5;51676:1;51670:8;;;;;;;;:::i;:::-;;;;;;;;51647:31;;51713:12;51697;:28;51693:408;;51867:12;51881;51850:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51840:55;;;;;;51825:70;;51693:408;;;52057:12;52071;52040:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52030:55;;;;;;52015:70;;51693:408;51632:480;51627:3;;;;;:::i;:::-;;;;51589:523;;;;52129:12;52122:19;;;51448:701;;;;:::o;36244:799::-;36399:4;36420:15;:2;:13;;;:15::i;:::-;36416:620;;;36472:2;36456:36;;;36493:12;:10;:12::i;:::-;36507:4;36513:7;36522:5;36456:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36452:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36715:1;36698:6;:13;:18;36694:272;;;36741:60;;;;;;;;;;:::i;:::-;;;;;;;;36694:272;36916:6;36910:13;36901:6;36897:2;36893:15;36886:38;36452:529;36589:41;;;36579:51;;;:6;:51;;;;36572:58;;;;;36416:620;37020:4;37013:11;;36244:799;;;;;;;:::o;56317:154::-;56385:7;56406:60;56441:10;56430:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;56420:33;;;;;;56455:10;56406:13;:60::i;:::-;56399:67;;56317:154;;;:::o;966:127::-;1073:1;1055:7;:14;;;:19;;;;;;;;;;;966:127;:::o;32050:110::-;32126:26;32136:2;32140:7;32126:26;;;;;;;;;;;;:9;:26::i;:::-;32050:110;;:::o;7561:387::-;7621:4;7829:12;7896:7;7884:20;7876:28;;7939:1;7932:4;:8;7925:15;;;7561:387;;;:::o;44830:231::-;44908:7;44929:17;44948:18;44970:27;44981:4;44987:9;44970:10;:27::i;:::-;44928:69;;;;45008:18;45020:5;45008:11;:18::i;:::-;45044:9;45037:16;;;;44830:231;;;;:::o;32387:321::-;32517:18;32523:2;32527:7;32517:5;:18::i;:::-;32568:54;32599:1;32603:2;32607:7;32616:5;32568:22;:54::i;:::-;32546:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32387:321;;;:::o;42720:1308::-;42801:7;42810:12;43055:2;43035:9;:16;:22;43031:990;;;43074:9;43098;43122:7;43331:4;43320:9;43316:20;43310:27;43305:32;;43381:4;43370:9;43366:20;43360:27;43355:32;;43439:4;43428:9;43424:20;43418:27;43415:1;43410:36;43405:41;;43482:25;43493:4;43499:1;43502;43505;43482:10;:25::i;:::-;43475:32;;;;;;;;;43031:990;43549:2;43529:9;:16;:22;43525:496;;;43568:9;43592:10;43804:4;43793:9;43789:20;43783:27;43778:32;;43855:4;43844:9;43840:20;43834:27;43828:33;;43897:23;43908:4;43914:1;43917:2;43897:10;:23::i;:::-;43890:30;;;;;;;;43525:496;43969:1;43973:35;43953:56;;;;42720:1308;;;;;;:::o;40991:643::-;41069:20;41060:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;41056:571;;;41106:7;;41056:571;41167:29;41158:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;41154:473;;;41213:34;;;;;;;;;;:::i;:::-;;;;;;;;41154:473;41278:35;41269:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;41265:362;;;41330:41;;;;;;;;;;:::i;:::-;;;;;;;;41265:362;41402:30;41393:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;41389:238;;;41449:44;;;;;;;;;;:::i;:::-;;;;;;;;41389:238;41524:30;41515:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;41511:116;;;41571:44;;;;;;;;;;:::i;:::-;;;;;;;;41511:116;40991:643;;:::o;33044:382::-;33138:1;33124:16;;:2;:16;;;;33116:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33197:16;33205:7;33197;:16::i;:::-;33196:17;33188:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33259:45;33288:1;33292:2;33296:7;33259:20;:45::i;:::-;33334:1;33317:9;:13;33327:2;33317:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33365:2;33346:7;:16;33354:7;33346:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33410:7;33406:2;33385:33;;33402:1;33385:33;;;;;;;;;;;;33044:382;;:::o;46329:1632::-;46460:7;46469:12;47394:66;47389:1;47381:10;;:79;47377:163;;;47493:1;47497:30;47477:51;;;;;;47377:163;47559:2;47554:1;:7;;;;:18;;;;;47570:2;47565:1;:7;;;;47554:18;47550:102;;;47605:1;47609:30;47589:51;;;;;;47550:102;47749:14;47766:24;47776:4;47782:1;47785;47788;47766:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47749:41;;47823:1;47805:20;;:6;:20;;;47801:103;;;47858:1;47862:29;47842:50;;;;;;;47801:103;47924:6;47932:20;47916:37;;;;;46329:1632;;;;;;;;:::o;45324:391::-;45438:7;45447:12;45472:9;45492:7;45547:66;45543:2;45539:75;45534:80;;45651:2;45646;45641:3;45637:12;45633:21;45628:26;;45682:25;45693:4;45699:1;45702;45705;45682:10;:25::i;:::-;45675:32;;;;;;45324:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:117;5857:1;5854;5847:12;5871:180;5919:77;5916:1;5909:88;6016:4;6013:1;6006:15;6040:4;6037:1;6030:15;6057:281;6140:27;6162:4;6140:27;:::i;:::-;6132:6;6128:40;6270:6;6258:10;6255:22;6234:18;6222:10;6219:34;6216:62;6213:88;;;6281:18;;:::i;:::-;6213:88;6321:10;6317:2;6310:22;6100:238;6057:281;;:::o;6344:129::-;6378:6;6405:20;;:::i;:::-;6395:30;;6434:33;6462:4;6454:6;6434:33;:::i;:::-;6344:129;;;:::o;6479:308::-;6541:4;6631:18;6623:6;6620:30;6617:56;;;6653:18;;:::i;:::-;6617:56;6691:29;6713:6;6691:29;:::i;:::-;6683:37;;6775:4;6769;6765:15;6757:23;;6479:308;;;:::o;6793:154::-;6877:6;6872:3;6867;6854:30;6939:1;6930:6;6925:3;6921:16;6914:27;6793:154;;;:::o;6953:412::-;7031:5;7056:66;7072:49;7114:6;7072:49;:::i;:::-;7056:66;:::i;:::-;7047:75;;7145:6;7138:5;7131:21;7183:4;7176:5;7172:16;7221:3;7212:6;7207:3;7203:16;7200:25;7197:112;;;7228:79;;:::i;:::-;7197:112;7318:41;7352:6;7347:3;7342;7318:41;:::i;:::-;7037:328;6953:412;;;;;:::o;7385:340::-;7441:5;7490:3;7483:4;7475:6;7471:17;7467:27;7457:122;;7498:79;;:::i;:::-;7457:122;7615:6;7602:20;7640:79;7715:3;7707:6;7700:4;7692:6;7688:17;7640:79;:::i;:::-;7631:88;;7447:278;7385:340;;;;:::o;7731:509::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;8003:1;7992:9;7988:17;7975:31;8033:18;8025:6;8022:30;8019:117;;;8055:79;;:::i;:::-;8019:117;8160:63;8215:7;8206:6;8195:9;8191:22;8160:63;:::i;:::-;8150:73;;7946:287;7731:509;;;;:::o;8246:619::-;8323:6;8331;8339;8388:2;8376:9;8367:7;8363:23;8359:32;8356:119;;;8394:79;;:::i;:::-;8356:119;8514:1;8539:53;8584:7;8575:6;8564:9;8560:22;8539:53;:::i;:::-;8529:63;;8485:117;8641:2;8667:53;8712:7;8703:6;8692:9;8688:22;8667:53;:::i;:::-;8657:63;;8612:118;8769:2;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8740:118;8246:619;;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:323::-;9188:6;9237:2;9225:9;9216:7;9212:23;9208:32;9205:119;;;9243:79;;:::i;:::-;9205:119;9363:1;9388:50;9430:7;9421:6;9410:9;9406:22;9388:50;:::i;:::-;9378:60;;9334:114;9132:323;;;;:::o;9461:474::-;9529:6;9537;9586:2;9574:9;9565:7;9561:23;9557:32;9554:119;;;9592:79;;:::i;:::-;9554:119;9712:1;9737:53;9782:7;9773:6;9762:9;9758:22;9737:53;:::i;:::-;9727:63;;9683:117;9839:2;9865:53;9910:7;9901:6;9890:9;9886:22;9865:53;:::i;:::-;9855:63;;9810:118;9461:474;;;;;:::o;9941:332::-;10062:4;10100:2;10089:9;10085:18;10077:26;;10113:71;10181:1;10170:9;10166:17;10157:6;10113:71;:::i;:::-;10194:72;10262:2;10251:9;10247:18;10238:6;10194:72;:::i;:::-;9941:332;;;;;:::o;10279:311::-;10356:4;10446:18;10438:6;10435:30;10432:56;;;10468:18;;:::i;:::-;10432:56;10518:4;10510:6;10506:17;10498:25;;10578:4;10572;10568:15;10560:23;;10279:311;;;:::o;10596:117::-;10705:1;10702;10695:12;10736:710;10832:5;10857:81;10873:64;10930:6;10873:64;:::i;:::-;10857:81;:::i;:::-;10848:90;;10958:5;10987:6;10980:5;10973:21;11021:4;11014:5;11010:16;11003:23;;11074:4;11066:6;11062:17;11054:6;11050:30;11103:3;11095:6;11092:15;11089:122;;;11122:79;;:::i;:::-;11089:122;11237:6;11220:220;11254:6;11249:3;11246:15;11220:220;;;11329:3;11358:37;11391:3;11379:10;11358:37;:::i;:::-;11353:3;11346:50;11425:4;11420:3;11416:14;11409:21;;11296:144;11280:4;11275:3;11271:14;11264:21;;11220:220;;;11224:21;10838:608;;10736:710;;;;;:::o;11469:370::-;11540:5;11589:3;11582:4;11574:6;11570:17;11566:27;11556:122;;11597:79;;:::i;:::-;11556:122;11714:6;11701:20;11739:94;11829:3;11821:6;11814:4;11806:6;11802:17;11739:94;:::i;:::-;11730:103;;11546:293;11469:370;;;;:::o;11845:539::-;11929:6;11978:2;11966:9;11957:7;11953:23;11949:32;11946:119;;;11984:79;;:::i;:::-;11946:119;12132:1;12121:9;12117:17;12104:31;12162:18;12154:6;12151:30;12148:117;;;12184:79;;:::i;:::-;12148:117;12289:78;12359:7;12350:6;12339:9;12335:22;12289:78;:::i;:::-;12279:88;;12075:302;11845:539;;;;:::o;12390:77::-;12427:7;12456:5;12445:16;;12390:77;;;:::o;12473:118::-;12560:24;12578:5;12560:24;:::i;:::-;12555:3;12548:37;12473:118;;:::o;12597:222::-;12690:4;12728:2;12717:9;12713:18;12705:26;;12741:71;12809:1;12798:9;12794:17;12785:6;12741:71;:::i;:::-;12597:222;;;;:::o;12825:122::-;12898:24;12916:5;12898:24;:::i;:::-;12891:5;12888:35;12878:63;;12937:1;12934;12927:12;12878:63;12825:122;:::o;12953:139::-;12999:5;13037:6;13024:20;13015:29;;13053:33;13080:5;13053:33;:::i;:::-;12953:139;;;;:::o;13098:329::-;13157:6;13206:2;13194:9;13185:7;13181:23;13177:32;13174:119;;;13212:79;;:::i;:::-;13174:119;13332:1;13357:53;13402:7;13393:6;13382:9;13378:22;13357:53;:::i;:::-;13347:63;;13303:117;13098:329;;;;:::o;13433:86::-;13468:7;13508:4;13501:5;13497:16;13486:27;;13433:86;;;:::o;13525:118::-;13596:22;13612:5;13596:22;:::i;:::-;13589:5;13586:33;13576:61;;13633:1;13630;13623:12;13576:61;13525:118;:::o;13649:135::-;13693:5;13731:6;13718:20;13709:29;;13747:31;13772:5;13747:31;:::i;:::-;13649:135;;;;:::o;13790:325::-;13847:6;13896:2;13884:9;13875:7;13871:23;13867:32;13864:119;;;13902:79;;:::i;:::-;13864:119;14022:1;14047:51;14090:7;14081:6;14070:9;14066:22;14047:51;:::i;:::-;14037:61;;13993:115;13790:325;;;;:::o;14121:311::-;14198:4;14288:18;14280:6;14277:30;14274:56;;;14310:18;;:::i;:::-;14274:56;14360:4;14352:6;14348:17;14340:25;;14420:4;14414;14410:15;14402:23;;14121:311;;;:::o;14455:710::-;14551:5;14576:81;14592:64;14649:6;14592:64;:::i;:::-;14576:81;:::i;:::-;14567:90;;14677:5;14706:6;14699:5;14692:21;14740:4;14733:5;14729:16;14722:23;;14793:4;14785:6;14781:17;14773:6;14769:30;14822:3;14814:6;14811:15;14808:122;;;14841:79;;:::i;:::-;14808:122;14956:6;14939:220;14973:6;14968:3;14965:15;14939:220;;;15048:3;15077:37;15110:3;15098:10;15077:37;:::i;:::-;15072:3;15065:50;15144:4;15139:3;15135:14;15128:21;;15015:144;14999:4;14994:3;14990:14;14983:21;;14939:220;;;14943:21;14557:608;;14455:710;;;;;:::o;15188:370::-;15259:5;15308:3;15301:4;15293:6;15289:17;15285:27;15275:122;;15316:79;;:::i;:::-;15275:122;15433:6;15420:20;15458:94;15548:3;15540:6;15533:4;15525:6;15521:17;15458:94;:::i;:::-;15449:103;;15265:293;15188:370;;;;:::o;15564:539::-;15648:6;15697:2;15685:9;15676:7;15672:23;15668:32;15665:119;;;15703:79;;:::i;:::-;15665:119;15851:1;15840:9;15836:17;15823:31;15881:18;15873:6;15870:30;15867:117;;;15903:79;;:::i;:::-;15867:117;16008:78;16078:7;16069:6;16058:9;16054:22;16008:78;:::i;:::-;15998:88;;15794:302;15564:539;;;;:::o;16109:180::-;16157:77;16154:1;16147:88;16254:4;16251:1;16244:15;16278:4;16275:1;16268:15;16295:120;16383:1;16376:5;16373:12;16363:46;;16389:18;;:::i;:::-;16363:46;16295:120;:::o;16421:141::-;16473:7;16502:5;16491:16;;16508:48;16550:5;16508:48;:::i;:::-;16421:141;;;:::o;16568:::-;16631:9;16664:39;16697:5;16664:39;:::i;:::-;16651:52;;16568:141;;;:::o;16715:157::-;16815:50;16859:5;16815:50;:::i;:::-;16810:3;16803:63;16715:157;;:::o;16878:248::-;16984:4;17022:2;17011:9;17007:18;16999:26;;17035:84;17116:1;17105:9;17101:17;17092:6;17035:84;:::i;:::-;16878:248;;;;:::o;17132:468::-;17197:6;17205;17254:2;17242:9;17233:7;17229:23;17225:32;17222:119;;;17260:79;;:::i;:::-;17222:119;17380:1;17405:53;17450:7;17441:6;17430:9;17426:22;17405:53;:::i;:::-;17395:63;;17351:117;17507:2;17533:50;17575:7;17566:6;17555:9;17551:22;17533:50;:::i;:::-;17523:60;;17478:115;17132:468;;;;;:::o;17606:307::-;17667:4;17757:18;17749:6;17746:30;17743:56;;;17779:18;;:::i;:::-;17743:56;17817:29;17839:6;17817:29;:::i;:::-;17809:37;;17901:4;17895;17891:15;17883:23;;17606:307;;;:::o;17919:410::-;17996:5;18021:65;18037:48;18078:6;18037:48;:::i;:::-;18021:65;:::i;:::-;18012:74;;18109:6;18102:5;18095:21;18147:4;18140:5;18136:16;18185:3;18176:6;18171:3;18167:16;18164:25;18161:112;;;18192:79;;:::i;:::-;18161:112;18282:41;18316:6;18311:3;18306;18282:41;:::i;:::-;18002:327;17919:410;;;;;:::o;18348:338::-;18403:5;18452:3;18445:4;18437:6;18433:17;18429:27;18419:122;;18460:79;;:::i;:::-;18419:122;18577:6;18564:20;18602:78;18676:3;18668:6;18661:4;18653:6;18649:17;18602:78;:::i;:::-;18593:87;;18409:277;18348:338;;;;:::o;18692:943::-;18787:6;18795;18803;18811;18860:3;18848:9;18839:7;18835:23;18831:33;18828:120;;;18867:79;;:::i;:::-;18828:120;18987:1;19012:53;19057:7;19048:6;19037:9;19033:22;19012:53;:::i;:::-;19002:63;;18958:117;19114:2;19140:53;19185:7;19176:6;19165:9;19161:22;19140:53;:::i;:::-;19130:63;;19085:118;19242:2;19268:53;19313:7;19304:6;19293:9;19289:22;19268:53;:::i;:::-;19258:63;;19213:118;19398:2;19387:9;19383:18;19370:32;19429:18;19421:6;19418:30;19415:117;;;19451:79;;:::i;:::-;19415:117;19556:62;19610:7;19601:6;19590:9;19586:22;19556:62;:::i;:::-;19546:72;;19341:287;18692:943;;;;;;;:::o;19641:1007::-;19752:6;19760;19768;19817:2;19805:9;19796:7;19792:23;19788:32;19785:119;;;19823:79;;:::i;:::-;19785:119;19943:1;19968:53;20013:7;20004:6;19993:9;19989:22;19968:53;:::i;:::-;19958:63;;19914:117;20098:2;20087:9;20083:18;20070:32;20129:18;20121:6;20118:30;20115:117;;;20151:79;;:::i;:::-;20115:117;20256:78;20326:7;20317:6;20306:9;20302:22;20256:78;:::i;:::-;20246:88;;20041:303;20411:2;20400:9;20396:18;20383:32;20442:18;20434:6;20431:30;20428:117;;;20464:79;;:::i;:::-;20428:117;20569:62;20623:7;20614:6;20603:9;20599:22;20569:62;:::i;:::-;20559:72;;20354:287;19641:1007;;;;;:::o;20654:474::-;20722:6;20730;20779:2;20767:9;20758:7;20754:23;20750:32;20747:119;;;20785:79;;:::i;:::-;20747:119;20905:1;20930:53;20975:7;20966:6;20955:9;20951:22;20930:53;:::i;:::-;20920:63;;20876:117;21032:2;21058:53;21103:7;21094:6;21083:9;21079:22;21058:53;:::i;:::-;21048:63;;21003:118;20654:474;;;;;:::o;21134:182::-;21274:34;21270:1;21262:6;21258:14;21251:58;21134:182;:::o;21322:366::-;21464:3;21485:67;21549:2;21544:3;21485:67;:::i;:::-;21478:74;;21561:93;21650:3;21561:93;:::i;:::-;21679:2;21674:3;21670:12;21663:19;;21322:366;;;:::o;21694:419::-;21860:4;21898:2;21887:9;21883:18;21875:26;;21947:9;21941:4;21937:20;21933:1;21922:9;21918:17;21911:47;21975:131;22101:4;21975:131;:::i;:::-;21967:139;;21694:419;;;:::o;22119:180::-;22167:77;22164:1;22157:88;22264:4;22261:1;22254:15;22288:4;22285:1;22278:15;22305:320;22349:6;22386:1;22380:4;22376:12;22366:22;;22433:1;22427:4;22423:12;22454:18;22444:81;;22510:4;22502:6;22498:17;22488:27;;22444:81;22572:2;22564:6;22561:14;22541:18;22538:38;22535:84;;;22591:18;;:::i;:::-;22535:84;22356:269;22305:320;;;:::o;22631:231::-;22771:34;22767:1;22759:6;22755:14;22748:58;22840:14;22835:2;22827:6;22823:15;22816:39;22631:231;:::o;22868:366::-;23010:3;23031:67;23095:2;23090:3;23031:67;:::i;:::-;23024:74;;23107:93;23196:3;23107:93;:::i;:::-;23225:2;23220:3;23216:12;23209:19;;22868:366;;;:::o;23240:419::-;23406:4;23444:2;23433:9;23429:18;23421:26;;23493:9;23487:4;23483:20;23479:1;23468:9;23464:17;23457:47;23521:131;23647:4;23521:131;:::i;:::-;23513:139;;23240:419;;;:::o;23665:220::-;23805:34;23801:1;23793:6;23789:14;23782:58;23874:3;23869:2;23861:6;23857:15;23850:28;23665:220;:::o;23891:366::-;24033:3;24054:67;24118:2;24113:3;24054:67;:::i;:::-;24047:74;;24130:93;24219:3;24130:93;:::i;:::-;24248:2;24243:3;24239:12;24232:19;;23891:366;;;:::o;24263:419::-;24429:4;24467:2;24456:9;24452:18;24444:26;;24516:9;24510:4;24506:20;24502:1;24491:9;24487:17;24480:47;24544:131;24670:4;24544:131;:::i;:::-;24536:139;;24263:419;;;:::o;24688:243::-;24828:34;24824:1;24816:6;24812:14;24805:58;24897:26;24892:2;24884:6;24880:15;24873:51;24688:243;:::o;24937:366::-;25079:3;25100:67;25164:2;25159:3;25100:67;:::i;:::-;25093:74;;25176:93;25265:3;25176:93;:::i;:::-;25294:2;25289:3;25285:12;25278:19;;24937:366;;;:::o;25309:419::-;25475:4;25513:2;25502:9;25498:18;25490:26;;25562:9;25556:4;25552:20;25548:1;25537:9;25533:17;25526:47;25590:131;25716:4;25590:131;:::i;:::-;25582:139;;25309:419;;;:::o;25734:236::-;25874:34;25870:1;25862:6;25858:14;25851:58;25943:19;25938:2;25930:6;25926:15;25919:44;25734:236;:::o;25976:366::-;26118:3;26139:67;26203:2;26198:3;26139:67;:::i;:::-;26132:74;;26215:93;26304:3;26215:93;:::i;:::-;26333:2;26328:3;26324:12;26317:19;;25976:366;;;:::o;26348:419::-;26514:4;26552:2;26541:9;26537:18;26529:26;;26601:9;26595:4;26591:20;26587:1;26576:9;26572:17;26565:47;26629:131;26755:4;26629:131;:::i;:::-;26621:139;;26348:419;;;:::o;26773:180::-;26821:77;26818:1;26811:88;26918:4;26915:1;26908:15;26942:4;26939:1;26932:15;26959:348;26999:7;27022:20;27040:1;27022:20;:::i;:::-;27017:25;;27056:20;27074:1;27056:20;:::i;:::-;27051:25;;27244:1;27176:66;27172:74;27169:1;27166:81;27161:1;27154:9;27147:17;27143:105;27140:131;;;27251:18;;:::i;:::-;27140:131;27299:1;27296;27292:9;27281:20;;26959:348;;;;:::o;27313:180::-;27361:77;27358:1;27351:88;27458:4;27455:1;27448:15;27482:4;27479:1;27472:15;27499:185;27539:1;27556:20;27574:1;27556:20;:::i;:::-;27551:25;;27590:20;27608:1;27590:20;:::i;:::-;27585:25;;27629:1;27619:35;;27634:18;;:::i;:::-;27619:35;27676:1;27673;27669:9;27664:14;;27499:185;;;;:::o;27690:180::-;27738:77;27735:1;27728:88;27835:4;27832:1;27825:15;27859:4;27856:1;27849:15;27876:233;27915:3;27938:24;27956:5;27938:24;:::i;:::-;27929:33;;27984:66;27977:5;27974:77;27971:103;;;28054:18;;:::i;:::-;27971:103;28101:1;28094:5;28090:13;28083:20;;27876:233;;;:::o;28115:165::-;28255:17;28251:1;28243:6;28239:14;28232:41;28115:165;:::o;28286:366::-;28428:3;28449:67;28513:2;28508:3;28449:67;:::i;:::-;28442:74;;28525:93;28614:3;28525:93;:::i;:::-;28643:2;28638:3;28634:12;28627:19;;28286:366;;;:::o;28658:419::-;28824:4;28862:2;28851:9;28847:18;28839:26;;28911:9;28905:4;28901:20;28897:1;28886:9;28882:17;28875:47;28939:131;29065:4;28939:131;:::i;:::-;28931:139;;28658:419;;;:::o;29083:147::-;29184:11;29221:3;29206:18;;29083:147;;;;:::o;29236:114::-;;:::o;29356:398::-;29515:3;29536:83;29617:1;29612:3;29536:83;:::i;:::-;29529:90;;29628:93;29717:3;29628:93;:::i;:::-;29746:1;29741:3;29737:11;29730:18;;29356:398;;;:::o;29760:379::-;29944:3;29966:147;30109:3;29966:147;:::i;:::-;29959:154;;30130:3;30123:10;;29760:379;;;:::o;30145:167::-;30285:19;30281:1;30273:6;30269:14;30262:43;30145:167;:::o;30318:366::-;30460:3;30481:67;30545:2;30540:3;30481:67;:::i;:::-;30474:74;;30557:93;30646:3;30557:93;:::i;:::-;30675:2;30670:3;30666:12;30659:19;;30318:366;;;:::o;30690:419::-;30856:4;30894:2;30883:9;30879:18;30871:26;;30943:9;30937:4;30933:20;30929:1;30918:9;30914:17;30907:47;30971:131;31097:4;30971:131;:::i;:::-;30963:139;;30690:419;;;:::o;31115:228::-;31255:34;31251:1;31243:6;31239:14;31232:58;31324:11;31319:2;31311:6;31307:15;31300:36;31115:228;:::o;31349:366::-;31491:3;31512:67;31576:2;31571:3;31512:67;:::i;:::-;31505:74;;31588:93;31677:3;31588:93;:::i;:::-;31706:2;31701:3;31697:12;31690:19;;31349:366;;;:::o;31721:419::-;31887:4;31925:2;31914:9;31910:18;31902:26;;31974:9;31968:4;31964:20;31960:1;31949:9;31945:17;31938:47;32002:131;32128:4;32002:131;:::i;:::-;31994:139;;31721:419;;;:::o;32146:229::-;32286:34;32282:1;32274:6;32270:14;32263:58;32355:12;32350:2;32342:6;32338:15;32331:37;32146:229;:::o;32381:366::-;32523:3;32544:67;32608:2;32603:3;32544:67;:::i;:::-;32537:74;;32620:93;32709:3;32620:93;:::i;:::-;32738:2;32733:3;32729:12;32722:19;;32381:366;;;:::o;32753:419::-;32919:4;32957:2;32946:9;32942:18;32934:26;;33006:9;33000:4;32996:20;32992:1;32981:9;32977:17;32970:47;33034:131;33160:4;33034:131;:::i;:::-;33026:139;;32753:419;;;:::o;33178:94::-;33211:8;33259:5;33255:2;33251:14;33230:35;;33178:94;;;:::o;33278:::-;33317:7;33346:20;33360:5;33346:20;:::i;:::-;33335:31;;33278:94;;;:::o;33378:100::-;33417:7;33446:26;33466:5;33446:26;:::i;:::-;33435:37;;33378:100;;;:::o;33484:157::-;33589:45;33609:24;33627:5;33609:24;:::i;:::-;33589:45;:::i;:::-;33584:3;33577:58;33484:157;;:::o;33647:256::-;33759:3;33774:75;33845:3;33836:6;33774:75;:::i;:::-;33874:2;33869:3;33865:12;33858:19;;33894:3;33887:10;;33647:256;;;;:::o;33909:167::-;34049:19;34045:1;34037:6;34033:14;34026:43;33909:167;:::o;34082:366::-;34224:3;34245:67;34309:2;34304:3;34245:67;:::i;:::-;34238:74;;34321:93;34410:3;34321:93;:::i;:::-;34439:2;34434:3;34430:12;34423:19;;34082:366;;;:::o;34454:419::-;34620:4;34658:2;34647:9;34643:18;34635:26;;34707:9;34701:4;34697:20;34693:1;34682:9;34678:17;34671:47;34735:131;34861:4;34735:131;:::i;:::-;34727:139;;34454:419;;;:::o;34879:305::-;34919:3;34938:20;34956:1;34938:20;:::i;:::-;34933:25;;34972:20;34990:1;34972:20;:::i;:::-;34967:25;;35126:1;35058:66;35054:74;35051:1;35048:81;35045:107;;;35132:18;;:::i;:::-;35045:107;35176:1;35173;35169:9;35162:16;;34879:305;;;;:::o;35190:169::-;35330:21;35326:1;35318:6;35314:14;35307:45;35190:169;:::o;35365:366::-;35507:3;35528:67;35592:2;35587:3;35528:67;:::i;:::-;35521:74;;35604:93;35693:3;35604:93;:::i;:::-;35722:2;35717:3;35713:12;35706:19;;35365:366;;;:::o;35737:419::-;35903:4;35941:2;35930:9;35926:18;35918:26;;35990:9;35984:4;35980:20;35976:1;35965:9;35961:17;35954:47;36018:131;36144:4;36018:131;:::i;:::-;36010:139;;35737:419;;;:::o;36162:169::-;36302:21;36298:1;36290:6;36286:14;36279:45;36162:169;:::o;36337:366::-;36479:3;36500:67;36564:2;36559:3;36500:67;:::i;:::-;36493:74;;36576:93;36665:3;36576:93;:::i;:::-;36694:2;36689:3;36685:12;36678:19;;36337:366;;;:::o;36709:419::-;36875:4;36913:2;36902:9;36898:18;36890:26;;36962:9;36956:4;36952:20;36948:1;36937:9;36933:17;36926:47;36990:131;37116:4;36990:131;:::i;:::-;36982:139;;36709:419;;;:::o;37134:168::-;37274:20;37270:1;37262:6;37258:14;37251:44;37134:168;:::o;37308:366::-;37450:3;37471:67;37535:2;37530:3;37471:67;:::i;:::-;37464:74;;37547:93;37636:3;37547:93;:::i;:::-;37665:2;37660:3;37656:12;37649:19;;37308:366;;;:::o;37680:419::-;37846:4;37884:2;37873:9;37869:18;37861:26;;37933:9;37927:4;37923:20;37919:1;37908:9;37904:17;37897:47;37961:131;38087:4;37961:131;:::i;:::-;37953:139;;37680:419;;;:::o;38105:178::-;38245:30;38241:1;38233:6;38229:14;38222:54;38105:178;:::o;38289:366::-;38431:3;38452:67;38516:2;38511:3;38452:67;:::i;:::-;38445:74;;38528:93;38617:3;38528:93;:::i;:::-;38646:2;38641:3;38637:12;38630:19;;38289:366;;;:::o;38661:419::-;38827:4;38865:2;38854:9;38850:18;38842:26;;38914:9;38908:4;38904:20;38900:1;38889:9;38885:17;38878:47;38942:131;39068:4;38942:131;:::i;:::-;38934:139;;38661:419;;;:::o;39086:179::-;39226:31;39222:1;39214:6;39210:14;39203:55;39086:179;:::o;39271:366::-;39413:3;39434:67;39498:2;39493:3;39434:67;:::i;:::-;39427:74;;39510:93;39599:3;39510:93;:::i;:::-;39628:2;39623:3;39619:12;39612:19;;39271:366;;;:::o;39643:419::-;39809:4;39847:2;39836:9;39832:18;39824:26;;39896:9;39890:4;39886:20;39882:1;39871:9;39867:17;39860:47;39924:131;40050:4;39924:131;:::i;:::-;39916:139;;39643:419;;;:::o;40068:181::-;40208:33;40204:1;40196:6;40192:14;40185:57;40068:181;:::o;40255:366::-;40397:3;40418:67;40482:2;40477:3;40418:67;:::i;:::-;40411:74;;40494:93;40583:3;40494:93;:::i;:::-;40612:2;40607:3;40603:12;40596:19;;40255:366;;;:::o;40627:419::-;40793:4;40831:2;40820:9;40816:18;40808:26;;40880:9;40874:4;40870:20;40866:1;40855:9;40851:17;40844:47;40908:131;41034:4;40908:131;:::i;:::-;40900:139;;40627:419;;;:::o;41052:181::-;41192:33;41188:1;41180:6;41176:14;41169:57;41052:181;:::o;41239:366::-;41381:3;41402:67;41466:2;41461:3;41402:67;:::i;:::-;41395:74;;41478:93;41567:3;41478:93;:::i;:::-;41596:2;41591:3;41587:12;41580:19;;41239:366;;;:::o;41611:419::-;41777:4;41815:2;41804:9;41800:18;41792:26;;41864:9;41858:4;41854:20;41850:1;41839:9;41835:17;41828:47;41892:131;42018:4;41892:131;:::i;:::-;41884:139;;41611:419;;;:::o;42036:148::-;42138:11;42175:3;42160:18;;42036:148;;;;:::o;42190:141::-;42239:4;42262:3;42254:11;;42285:3;42282:1;42275:14;42319:4;42316:1;42306:18;42298:26;;42190:141;;;:::o;42361:845::-;42464:3;42501:5;42495:12;42530:36;42556:9;42530:36;:::i;:::-;42582:89;42664:6;42659:3;42582:89;:::i;:::-;42575:96;;42702:1;42691:9;42687:17;42718:1;42713:137;;;;42864:1;42859:341;;;;42680:520;;42713:137;42797:4;42793:9;42782;42778:25;42773:3;42766:38;42833:6;42828:3;42824:16;42817:23;;42713:137;;42859:341;42926:38;42958:5;42926:38;:::i;:::-;42986:1;43000:154;43014:6;43011:1;43008:13;43000:154;;;43088:7;43082:14;43078:1;43073:3;43069:11;43062:35;43138:1;43129:7;43125:15;43114:26;;43036:4;43033:1;43029:12;43024:17;;43000:154;;;43183:6;43178:3;43174:16;43167:23;;42866:334;;42680:520;;42468:738;;42361:845;;;;:::o;43212:377::-;43318:3;43346:39;43379:5;43346:39;:::i;:::-;43401:89;43483:6;43478:3;43401:89;:::i;:::-;43394:96;;43499:52;43544:6;43539:3;43532:4;43525:5;43521:16;43499:52;:::i;:::-;43576:6;43571:3;43567:16;43560:23;;43322:267;43212:377;;;;:::o;43595:583::-;43817:3;43839:92;43927:3;43918:6;43839:92;:::i;:::-;43832:99;;43948:95;44039:3;44030:6;43948:95;:::i;:::-;43941:102;;44060:92;44148:3;44139:6;44060:92;:::i;:::-;44053:99;;44169:3;44162:10;;43595:583;;;;;;:::o;44184:589::-;44409:3;44431:95;44522:3;44513:6;44431:95;:::i;:::-;44424:102;;44543:95;44634:3;44625:6;44543:95;:::i;:::-;44536:102;;44655:92;44743:3;44734:6;44655:92;:::i;:::-;44648:99;;44764:3;44757:10;;44184:589;;;;;;:::o;44779:225::-;44919:34;44915:1;44907:6;44903:14;44896:58;44988:8;44983:2;44975:6;44971:15;44964:33;44779:225;:::o;45010:366::-;45152:3;45173:67;45237:2;45232:3;45173:67;:::i;:::-;45166:74;;45249:93;45338:3;45249:93;:::i;:::-;45367:2;45362:3;45358:12;45351:19;;45010:366;;;:::o;45382:419::-;45548:4;45586:2;45575:9;45571:18;45563:26;;45635:9;45629:4;45625:20;45621:1;45610:9;45606:17;45599:47;45663:131;45789:4;45663:131;:::i;:::-;45655:139;;45382:419;;;:::o;45807:231::-;45947:34;45943:1;45935:6;45931:14;45924:58;46016:14;46011:2;46003:6;45999:15;45992:39;45807:231;:::o;46044:366::-;46186:3;46207:67;46271:2;46266:3;46207:67;:::i;:::-;46200:74;;46283:93;46372:3;46283:93;:::i;:::-;46401:2;46396:3;46392:12;46385:19;;46044:366;;;:::o;46416:419::-;46582:4;46620:2;46609:9;46605:18;46597:26;;46669:9;46663:4;46659:20;46655:1;46644:9;46640:17;46633:47;46697:131;46823:4;46697:131;:::i;:::-;46689:139;;46416:419;;;:::o;46841:228::-;46981:34;46977:1;46969:6;46965:14;46958:58;47050:11;47045:2;47037:6;47033:15;47026:36;46841:228;:::o;47075:366::-;47217:3;47238:67;47302:2;47297:3;47238:67;:::i;:::-;47231:74;;47314:93;47403:3;47314:93;:::i;:::-;47432:2;47427:3;47423:12;47416:19;;47075:366;;;:::o;47447:419::-;47613:4;47651:2;47640:9;47636:18;47628:26;;47700:9;47694:4;47690:20;47686:1;47675:9;47671:17;47664:47;47728:131;47854:4;47728:131;:::i;:::-;47720:139;;47447:419;;;:::o;47872:223::-;48012:34;48008:1;48000:6;47996:14;47989:58;48081:6;48076:2;48068:6;48064:15;48057:31;47872:223;:::o;48101:366::-;48243:3;48264:67;48328:2;48323:3;48264:67;:::i;:::-;48257:74;;48340:93;48429:3;48340:93;:::i;:::-;48458:2;48453:3;48449:12;48442:19;;48101:366;;;:::o;48473:419::-;48639:4;48677:2;48666:9;48662:18;48654:26;;48726:9;48720:4;48716:20;48712:1;48701:9;48697:17;48690:47;48754:131;48880:4;48754:131;:::i;:::-;48746:139;;48473:419;;;:::o;48898:191::-;48938:4;48958:20;48976:1;48958:20;:::i;:::-;48953:25;;48992:20;49010:1;48992:20;:::i;:::-;48987:25;;49031:1;49028;49025:8;49022:34;;;49036:18;;:::i;:::-;49022:34;49081:1;49078;49074:9;49066:17;;48898:191;;;;:::o;49095:175::-;49235:27;49231:1;49223:6;49219:14;49212:51;49095:175;:::o;49276:366::-;49418:3;49439:67;49503:2;49498:3;49439:67;:::i;:::-;49432:74;;49515:93;49604:3;49515:93;:::i;:::-;49633:2;49628:3;49624:12;49617:19;;49276:366;;;:::o;49648:419::-;49814:4;49852:2;49841:9;49837:18;49829:26;;49901:9;49895:4;49891:20;49887:1;49876:9;49872:17;49865:47;49929:131;50055:4;49929:131;:::i;:::-;49921:139;;49648:419;;;:::o;50073:237::-;50213:34;50209:1;50201:6;50197:14;50190:58;50282:20;50277:2;50269:6;50265:15;50258:45;50073:237;:::o;50316:366::-;50458:3;50479:67;50543:2;50538:3;50479:67;:::i;:::-;50472:74;;50555:93;50644:3;50555:93;:::i;:::-;50673:2;50668:3;50664:12;50657:19;;50316:366;;;:::o;50688:419::-;50854:4;50892:2;50881:9;50877:18;50869:26;;50941:9;50935:4;50931:20;50927:1;50916:9;50912:17;50905:47;50969:131;51095:4;50969:131;:::i;:::-;50961:139;;50688:419;;;:::o;51113:161::-;51253:13;51249:1;51241:6;51237:14;51230:37;51113:161;:::o;51280:366::-;51422:3;51443:67;51507:2;51502:3;51443:67;:::i;:::-;51436:74;;51519:93;51608:3;51519:93;:::i;:::-;51637:2;51632:3;51628:12;51621:19;;51280:366;;;:::o;51652:419::-;51818:4;51856:2;51845:9;51841:18;51833:26;;51905:9;51899:4;51895:20;51891:1;51880:9;51876:17;51869:47;51933:131;52059:4;51933:131;:::i;:::-;51925:139;;51652:419;;;:::o;52077:165::-;52217:17;52213:1;52205:6;52201:14;52194:41;52077:165;:::o;52248:366::-;52390:3;52411:67;52475:2;52470:3;52411:67;:::i;:::-;52404:74;;52487:93;52576:3;52487:93;:::i;:::-;52605:2;52600:3;52596:12;52589:19;;52248:366;;;:::o;52620:419::-;52786:4;52824:2;52813:9;52809:18;52801:26;;52873:9;52867:4;52863:20;52859:1;52848:9;52844:17;52837:47;52901:131;53027:4;52901:131;:::i;:::-;52893:139;;52620:419;;;:::o;53045:162::-;53185:14;53181:1;53173:6;53169:14;53162:38;53045:162;:::o;53213:366::-;53355:3;53376:67;53440:2;53435:3;53376:67;:::i;:::-;53369:74;;53452:93;53541:3;53452:93;:::i;:::-;53570:2;53565:3;53561:12;53554:19;;53213:366;;;:::o;53585:419::-;53751:4;53789:2;53778:9;53774:18;53766:26;;53838:9;53832:4;53828:20;53824:1;53813:9;53809:17;53802:47;53866:131;53992:4;53866:131;:::i;:::-;53858:139;;53585:419;;;:::o;54010:165::-;54150:17;54146:1;54138:6;54134:14;54127:41;54010:165;:::o;54181:366::-;54323:3;54344:67;54408:2;54403:3;54344:67;:::i;:::-;54337:74;;54420:93;54509:3;54420:93;:::i;:::-;54538:2;54533:3;54529:12;54522:19;;54181:366;;;:::o;54553:419::-;54719:4;54757:2;54746:9;54742:18;54734:26;;54806:9;54800:4;54796:20;54792:1;54781:9;54777:17;54770:47;54834:131;54960:4;54834:131;:::i;:::-;54826:139;;54553:419;;;:::o;54978:164::-;55118:16;55114:1;55106:6;55102:14;55095:40;54978:164;:::o;55148:366::-;55290:3;55311:67;55375:2;55370:3;55311:67;:::i;:::-;55304:74;;55387:93;55476:3;55387:93;:::i;:::-;55505:2;55500:3;55496:12;55489:19;;55148:366;;;:::o;55520:419::-;55686:4;55724:2;55713:9;55709:18;55701:26;;55773:9;55767:4;55763:20;55759:1;55748:9;55744:17;55737:47;55801:131;55927:4;55801:131;:::i;:::-;55793:139;;55520:419;;;:::o;55945:176::-;55977:1;55994:20;56012:1;55994:20;:::i;:::-;55989:25;;56028:20;56046:1;56028:20;:::i;:::-;56023:25;;56067:1;56057:35;;56072:18;;:::i;:::-;56057:35;56113:1;56110;56106:9;56101:14;;55945:176;;;;:::o;56127:79::-;56166:7;56195:5;56184:16;;56127:79;;;:::o;56212:157::-;56317:45;56337:24;56355:5;56337:24;:::i;:::-;56317:45;:::i;:::-;56312:3;56305:58;56212:157;;:::o;56375:397::-;56515:3;56530:75;56601:3;56592:6;56530:75;:::i;:::-;56630:2;56625:3;56621:12;56614:19;;56643:75;56714:3;56705:6;56643:75;:::i;:::-;56743:2;56738:3;56734:12;56727:19;;56763:3;56756:10;;56375:397;;;;;:::o;56778:98::-;56829:6;56863:5;56857:12;56847:22;;56778:98;;;:::o;56882:168::-;56965:11;56999:6;56994:3;56987:19;57039:4;57034:3;57030:14;57015:29;;56882:168;;;;:::o;57056:360::-;57142:3;57170:38;57202:5;57170:38;:::i;:::-;57224:70;57287:6;57282:3;57224:70;:::i;:::-;57217:77;;57303:52;57348:6;57343:3;57336:4;57329:5;57325:16;57303:52;:::i;:::-;57380:29;57402:6;57380:29;:::i;:::-;57375:3;57371:39;57364:46;;57146:270;57056:360;;;;:::o;57422:640::-;57617:4;57655:3;57644:9;57640:19;57632:27;;57669:71;57737:1;57726:9;57722:17;57713:6;57669:71;:::i;:::-;57750:72;57818:2;57807:9;57803:18;57794:6;57750:72;:::i;:::-;57832;57900:2;57889:9;57885:18;57876:6;57832:72;:::i;:::-;57951:9;57945:4;57941:20;57936:2;57925:9;57921:18;57914:48;57979:76;58050:4;58041:6;57979:76;:::i;:::-;57971:84;;57422:640;;;;;;;:::o;58068:141::-;58124:5;58155:6;58149:13;58140:22;;58171:32;58197:5;58171:32;:::i;:::-;58068:141;;;;:::o;58215:349::-;58284:6;58333:2;58321:9;58312:7;58308:23;58304:32;58301:119;;;58339:79;;:::i;:::-;58301:119;58459:1;58484:63;58539:7;58530:6;58519:9;58515:22;58484:63;:::i;:::-;58474:73;;58430:127;58215:349;;;;:::o;58570:174::-;58710:26;58706:1;58698:6;58694:14;58687:50;58570:174;:::o;58750:366::-;58892:3;58913:67;58977:2;58972:3;58913:67;:::i;:::-;58906:74;;58989:93;59078:3;58989:93;:::i;:::-;59107:2;59102:3;59098:12;59091:19;;58750:366;;;:::o;59122:419::-;59288:4;59326:2;59315:9;59311:18;59303:26;;59375:9;59369:4;59365:20;59361:1;59350:9;59346:17;59339:47;59403:131;59529:4;59403:131;:::i;:::-;59395:139;;59122:419;;;:::o;59547:181::-;59687:33;59683:1;59675:6;59671:14;59664:57;59547:181;:::o;59734:366::-;59876:3;59897:67;59961:2;59956:3;59897:67;:::i;:::-;59890:74;;59973:93;60062:3;59973:93;:::i;:::-;60091:2;60086:3;60082:12;60075:19;;59734:366;;;:::o;60106:419::-;60272:4;60310:2;60299:9;60295:18;60287:26;;60359:9;60353:4;60349:20;60345:1;60334:9;60330:17;60323:47;60387:131;60513:4;60387:131;:::i;:::-;60379:139;;60106:419;;;:::o;60531:221::-;60671:34;60667:1;60659:6;60655:14;60648:58;60740:4;60735:2;60727:6;60723:15;60716:29;60531:221;:::o;60758:366::-;60900:3;60921:67;60985:2;60980:3;60921:67;:::i;:::-;60914:74;;60997:93;61086:3;60997:93;:::i;:::-;61115:2;61110:3;61106:12;61099:19;;60758:366;;;:::o;61130:419::-;61296:4;61334:2;61323:9;61319:18;61311:26;;61383:9;61377:4;61373:20;61369:1;61358:9;61354:17;61347:47;61411:131;61537:4;61411:131;:::i;:::-;61403:139;;61130:419;;;:::o;61555:221::-;61695:34;61691:1;61683:6;61679:14;61672:58;61764:4;61759:2;61751:6;61747:15;61740:29;61555:221;:::o;61782:366::-;61924:3;61945:67;62009:2;62004:3;61945:67;:::i;:::-;61938:74;;62021:93;62110:3;62021:93;:::i;:::-;62139:2;62134:3;62130:12;62123:19;;61782:366;;;:::o;62154:419::-;62320:4;62358:2;62347:9;62343:18;62335:26;;62407:9;62401:4;62397:20;62393:1;62382:9;62378:17;62371:47;62435:131;62561:4;62435:131;:::i;:::-;62427:139;;62154:419;;;:::o;62579:182::-;62719:34;62715:1;62707:6;62703:14;62696:58;62579:182;:::o;62767:366::-;62909:3;62930:67;62994:2;62989:3;62930:67;:::i;:::-;62923:74;;63006:93;63095:3;63006:93;:::i;:::-;63124:2;63119:3;63115:12;63108:19;;62767:366;;;:::o;63139:419::-;63305:4;63343:2;63332:9;63328:18;63320:26;;63392:9;63386:4;63382:20;63378:1;63367:9;63363:17;63356:47;63420:131;63546:4;63420:131;:::i;:::-;63412:139;;63139:419;;;:::o;63564:178::-;63704:30;63700:1;63692:6;63688:14;63681:54;63564:178;:::o;63748:366::-;63890:3;63911:67;63975:2;63970:3;63911:67;:::i;:::-;63904:74;;63987:93;64076:3;63987:93;:::i;:::-;64105:2;64100:3;64096:12;64089:19;;63748:366;;;:::o;64120:419::-;64286:4;64324:2;64313:9;64309:18;64301:26;;64373:9;64367:4;64363:20;64359:1;64348:9;64344:17;64337:47;64401:131;64527:4;64401:131;:::i;:::-;64393:139;;64120:419;;;:::o;64545:112::-;64628:22;64644:5;64628:22;:::i;:::-;64623:3;64616:35;64545:112;;:::o;64663:545::-;64836:4;64874:3;64863:9;64859:19;64851:27;;64888:71;64956:1;64945:9;64941:17;64932:6;64888:71;:::i;:::-;64969:68;65033:2;65022:9;65018:18;65009:6;64969:68;:::i;:::-;65047:72;65115:2;65104:9;65100:18;65091:6;65047:72;:::i;:::-;65129;65197:2;65186:9;65182:18;65173:6;65129:72;:::i;:::-;64663:545;;;;;;;:::o

Swarm Source

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