ETH Price: $3,323.44 (-3.36%)

Token

The Divine (DIVI)
 

Overview

Max Total Supply

4,476 DIVI

Holders

1,851

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nftbuzz.eth
Balance
2 DIVI
0x47320b27870c9f7549180aa77b0f3bed292a8b1f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Divine is a collection of 8,888 hand-drawn, cosmic, angelic warriors that protect and nurture all that is good in the observable universe of their realm.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheDivine

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-22
*/

/**
 *Submitted for verification at Etherscan.io on 2021-10-13
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

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/[email protected]

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

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;
        // solhint-disable-next-line no-inline-assembly
        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');

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File @openzeppelin/contracts/utils/[email protected]

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = '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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, 'Strings: hex length insufficient');
        return string(buffer);
    }
}

// File @openzeppelin/contracts/utils/introspection/[email protected]

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/[email protected]

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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721: transfer to non ERC721Receiver implementer');
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), 'ERC721Enumerable: owner index out of bounds');
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), 'ERC721Enumerable: global index out of bounds');
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), 'ERC721URIStorage: URI set of nonexistent token');
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File @openzeppelin/contracts/security/[email protected]

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), 'Pausable: paused');
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), 'Pausable: not paused');
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File @openzeppelin/contracts/access/[email protected]

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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), 'ERC721Burnable: caller is not owner nor approved');
        _burn(tokenId);
    }
}

// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. 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;
        }
    }
}

pragma solidity ^0.8.0;

contract TheDivine is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 public maxSupply = 8888;
    uint256 public price = 80000000000000000;
    bool public saleOpen = false;
    bool public presaleOpen = false;
    string public baseURI;

    mapping(address => uint256) public Whitelist;

    receive() external payable {}

    constructor() ERC721('The Divine', 'DIVI') {}

    function reserveMints(address to) public onlyOwner {
        for (uint256 i = 0; i < 35; i++) internalMint(to);
    }

    function whitelistAddress(address[] memory who, uint256 amount) public onlyOwner {
        for (uint256 i = 0; i < who.length; i++) Whitelist[who[i]] = amount;
    }

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

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function toggleSale() public onlyOwner {
        saleOpen = !saleOpen;
    }

    function togglePresale() public onlyOwner {
        presaleOpen = !presaleOpen;
    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

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

    function internalMint(address to) internal {
        require(totalSupply() < maxSupply, 'supply depleted');
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(address to) public onlyOwner {
        internalMint(to);
    }

    function mint(uint256 amount) public payable {
        require(msg.value >= price * amount, 'not enough was paid');

        if (!saleOpen) {
            require(presaleOpen == true, 'presale is not open');
            uint256 who = Whitelist[msg.sender];
            require(who > 0, 'this address is not whitelisted for the presale');
            require(amount <= who, 'this address is not allowed to mint that many during the presale');
            for (uint256 i = 0; i < amount; i++) internalMint(msg.sender);
            Whitelist[msg.sender] = who - amount;
            return;
        }

        require(amount <= 12, 'only 12 per transaction allowed');
        for (uint256 i = 0; i < amount; i++) internalMint(msg.sender);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserveMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"who","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526122b8600d5567011c37937e080000600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055503480156200005957600080fd5b506040518060400160405280600a81526020017f54686520446976696e65000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f44495649000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000de929190620001d4565b508060019080519060200190620000f7929190620001d4565b5050506000600b60006101000a81548160ff021916908315150217905550600062000127620001cc60201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002e9565b600033905090565b828054620001e29062000284565b90600052602060002090601f01602090048101928262000206576000855562000252565b82601f106200022157805160ff191683800117855562000252565b8280016001018555821562000252579182015b828111156200025157825182559160200191906001019062000234565b5b50905062000261919062000265565b5090565b5b808211156200028057600081600090555060010162000266565b5090565b600060028204905060018216806200029d57607f821691505b60208210811415620002b457620002b3620002ba565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e8480620002f96000396000f3fe6080604052600436106102295760003560e01c806370a0823111610123578063a0712d68116100ab578063d5abeb011161006f578063d5abeb01146107a3578063da5f6843146107ce578063e985e9c5146107f7578063eb73900b14610834578063f2fde38b1461087157610230565b8063a0712d68146106cd578063a22cb465146106e9578063b88d4fde14610712578063bee6348a1461073b578063c87b56dd1461076657610230565b80638da5cb5b116100f25780638da5cb5b146105f857806391b7f5ed1461062357806395d89b411461064c57806399288dbb14610677578063a035b1fe146106a257610230565b806370a0823114610576578063715018a6146105b35780637d8966e4146105ca5780638456cb59146105e157610230565b80633f4ba83a116101b157806355f804b31161017557806355f804b3146104915780635c975abb146104ba5780636352211e146104e55780636b6384db146105225780636c0360eb1461054b57610230565b80633f4ba83a146103c257806340d097c3146103d957806342842e0e1461040257806342966c681461042b5780634f6ccce71461045457610230565b806318160ddd116101f857806318160ddd1461030357806323b872dd1461032e5780632f745c591461035757806334393743146103945780633ccfd60b146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da57610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a13565b61089a565b60405161026991906145d6565b60405180910390f35b34801561027e57600080fd5b506102876108ac565b60405161029491906145f1565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613aa6565b61093e565b6040516102d1919061456f565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613983565b6109c3565b005b34801561030f57600080fd5b50610318610adb565b6040516103259190614993565b60405180910390f35b34801561033a57600080fd5b506103556004803603810190610350919061387d565b610ae8565b005b34801561036357600080fd5b5061037e60048036038101906103799190613983565b610b48565b60405161038b9190614993565b60405180910390f35b3480156103a057600080fd5b506103a9610bed565b005b3480156103b757600080fd5b506103c0610c95565b005b3480156103ce57600080fd5b506103d7610d58565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613818565b610dde565b005b34801561040e57600080fd5b506104296004803603810190610424919061387d565b610e66565b005b34801561043757600080fd5b50610452600480360381019061044d9190613aa6565b610e86565b005b34801561046057600080fd5b5061047b60048036038101906104769190613aa6565b610ee2565b6040516104889190614993565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613a65565b610f79565b005b3480156104c657600080fd5b506104cf61100f565b6040516104dc91906145d6565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613aa6565b611026565b604051610519919061456f565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906139bf565b6110d8565b005b34801561055757600080fd5b506105606111fc565b60405161056d91906145f1565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613818565b61128a565b6040516105aa9190614993565b60405180910390f35b3480156105bf57600080fd5b506105c8611342565b005b3480156105d657600080fd5b506105df61147f565b005b3480156105ed57600080fd5b506105f6611527565b005b34801561060457600080fd5b5061060d6115ad565b60405161061a919061456f565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190613aa6565b6115d7565b005b34801561065857600080fd5b5061066161165d565b60405161066e91906145f1565b60405180910390f35b34801561068357600080fd5b5061068c6116ef565b60405161069991906145d6565b60405180910390f35b3480156106ae57600080fd5b506106b7611702565b6040516106c49190614993565b60405180910390f35b6106e760048036038101906106e29190613aa6565b611708565b005b3480156106f557600080fd5b50610710600480360381019061070b9190613947565b611979565b005b34801561071e57600080fd5b50610739600480360381019061073491906138cc565b611afa565b005b34801561074757600080fd5b50610750611b5c565b60405161075d91906145d6565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613aa6565b611b6f565b60405161079a91906145f1565b60405180910390f35b3480156107af57600080fd5b506107b8611b81565b6040516107c59190614993565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190613818565b611b87565b005b34801561080357600080fd5b5061081e60048036038101906108199190613841565b611c2f565b60405161082b91906145d6565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613818565b611cc3565b6040516108689190614993565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613818565b611cdb565b005b60006108a582611e87565b9050919050565b6060600080546108bb90614c79565b80601f01602080910402602001604051908101604052809291908181526020018280546108e790614c79565b80156109345780601f1061090957610100808354040283529160200191610934565b820191906000526020600020905b81548152906001019060200180831161091757829003601f168201915b5050505050905090565b600061094982611f01565b610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90614833565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ce82611026565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906148b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5e611f6d565b73ffffffffffffffffffffffffffffffffffffffff161480610a8d5750610a8c81610a87611f6d565b611c2f565b5b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614753565b60405180910390fd5b610ad68383611f75565b505050565b6000600880549050905090565b610af9610af3611f6d565b8261202e565b610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f906148f3565b60405180910390fd5b610b4383838361210c565b505050565b6000610b538361128a565b8210610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90614653565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bf5611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610c136115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090614853565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610c9d611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610cbb6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614853565b60405180910390fd5b610d19611f6d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610d5657600080fd5b565b610d60611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614853565b60405180910390fd5b610ddc612368565b565b610de6611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610e046115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5190614853565b60405180910390fd5b610e638161240a565b50565b610e8183838360405180602001604052806000815250611afa565b505050565b610e97610e91611f6d565b8261202e565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614973565b60405180910390fd5b610edf81612475565b50565b6000610eec610adb565b8210610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2490614933565b60405180910390fd5b60088281548110610f67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f81611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610f9f6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90614853565b60405180910390fd5b806010908051906020019061100b929190613566565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c6906147d3565b60405180910390fd5b80915050919050565b6110e0611f6d565b73ffffffffffffffffffffffffffffffffffffffff166110fe6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90614853565b60405180910390fd5b60005b82518110156111f757816011600085848151811061119e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806111ef90614cab565b915050611157565b505050565b6010805461120990614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461123590614c79565b80156112825780601f1061125757610100808354040283529160200191611282565b820191906000526020600020905b81548152906001019060200180831161126557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f2906147b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61134a611f6d565b73ffffffffffffffffffffffffffffffffffffffff166113686115ad565b73ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590614853565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611487611f6d565b73ffffffffffffffffffffffffffffffffffffffff166114a56115ad565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614853565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61152f611f6d565b73ffffffffffffffffffffffffffffffffffffffff1661154d6115ad565b73ffffffffffffffffffffffffffffffffffffffff16146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614853565b60405180910390fd5b6115ab612481565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115df611f6d565b73ffffffffffffffffffffffffffffffffffffffff166115fd6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90614853565b60405180910390fd5b80600e8190555050565b60606001805461166c90614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461169890614c79565b80156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1681565b600e5481565b80600e546117169190614b35565b341015611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906148d3565b60405180910390fd5b600f60009054906101000a900460ff166119095760011515600f60019054906101000a900460ff161515146117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614913565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614953565b60405180910390fd5b8082111561188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614773565b60405180910390fd5b60005b828110156118b3576118a03361240a565b80806118ab90614cab565b91505061188f565b5081816118c09190614b8f565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050611976565b600c81111561194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490614793565b60405180910390fd5b60005b81811015611974576119613361240a565b808061196c90614cab565b915050611950565b505b50565b611981611f6d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e6906146f3565b60405180910390fd5b80600560006119fc611f6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aa9611f6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aee91906145d6565b60405180910390a35050565b611b0b611b05611f6d565b8361202e565b611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906148f3565b60405180910390fd5b611b5684848484612524565b50505050565b600f60019054906101000a900460ff1681565b6060611b7a82612580565b9050919050565b600d5481565b611b8f611f6d565b73ffffffffffffffffffffffffffffffffffffffff16611bad6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90614853565b60405180910390fd5b60005b6023811015611c2b57611c188261240a565b8080611c2390614cab565b915050611c06565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60116020528060005260406000206000915090505481565b611ce3611f6d565b73ffffffffffffffffffffffffffffffffffffffff16611d016115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614853565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614693565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611efa5750611ef9826126d2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fe883611026565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061203982611f01565b612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90614713565b60405180910390fd5b600061208383611026565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f257508373ffffffffffffffffffffffffffffffffffffffff166120da8461093e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210357506121028185611c2f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661212c82611026565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e9906146d3565b60405180910390fd5b6121fd8383836127b4565b612208600082611f75565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122589190614b8f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122af9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61237061100f565b6123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690614613565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123f3611f6d565b604051612400919061456f565b60405180910390a1565b600d54612415610adb565b10612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90614633565b60405180910390fd5b61246881612463600c61280c565b61281a565b612472600c612838565b50565b61247e8161284e565b50565b61248961100f565b156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c090614733565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861250d611f6d565b60405161251a919061456f565b60405180910390a1565b61252f84848461210c565b61253b848484846128a1565b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257190614673565b60405180910390fd5b50505050565b606061258b82611f01565b6125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c190614813565b60405180910390fd5b6000600a600084815260200190815260200160002080546125ea90614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461261690614c79565b80156126635780601f1061263857610100808354040283529160200191612663565b820191906000526020600020905b81548152906001019060200180831161264657829003601f168201915b505050505090506000612674612a38565b905060008151141561268a5781925050506126cd565b6000825111156126bf5780826040516020016126a792919061454b565b604051602081830303815290604052925050506126cd565b6126c884612aca565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061279d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127ad57506127ac82612b71565b5b9050919050565b6127bc61100f565b156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390614733565b60405180910390fd5b612807838383612bdb565b505050565b600081600001549050919050565b612834828260405180602001604052806000815250612cef565b5050565b6001816000016000828254019250508190555050565b61285781612d4a565b6000600a6000838152602001908152602001600020805461287790614c79565b90501461289e57600a6000828152602001908152602001600020600061289d91906135ec565b5b50565b60006128c28473ffffffffffffffffffffffffffffffffffffffff16612e5b565b15612a2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128eb611f6d565b8786866040518563ffffffff1660e01b815260040161290d949392919061458a565b602060405180830381600087803b15801561292757600080fd5b505af192505050801561295857506040513d601f19601f820116820180604052508101906129559190613a3c565b60015b6129db573d8060008114612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b506000815114156129d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ca90614673565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a30565b600190505b949350505050565b606060108054612a4790614c79565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7390614c79565b8015612ac05780601f10612a9557610100808354040283529160200191612ac0565b820191906000526020600020905b815481529060010190602001808311612aa357829003601f168201915b5050505050905090565b6060612ad582611f01565b612b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0b90614893565b60405180910390fd5b6000612b1e612a38565b90506000815111612b3e5760405180602001604052806000815250612b69565b80612b4884612e6e565b604051602001612b5992919061454b565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612be683838361301b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c2957612c2481613020565b612c68565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c6757612c668382613069565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cab57612ca6816131d6565b612cea565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ce957612ce88282613319565b5b5b505050565b612cf98383613398565b612d0660008484846128a1565b612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c90614673565b60405180910390fd5b505050565b6000612d5582611026565b9050612d63816000846127b4565b612d6e600083611f75565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dbe9190614b8f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612eb6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613016565b600082905060005b60008214612ee8578080612ed190614cab565b915050600a82612ee19190614b04565b9150612ebe565b60008167ffffffffffffffff811115612f2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f5c5781602001600182028036833780820191505090505b5090505b6000851461300f57600182612f759190614b8f565b9150600a85612f849190614cf4565b6030612f909190614aae565b60f81b818381518110612fcc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130089190614b04565b9450612f60565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130768461128a565b6130809190614b8f565b9050600060076000848152602001908152602001600020549050818114613165576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131ea9190614b8f565b9050600060096000848152602001908152602001600020549050600060088381548110613240577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133248361128a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ff906147f3565b60405180910390fd5b61341181611f01565b15613451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613448906146b3565b60405180910390fd5b61345d600083836127b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134ad9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461357290614c79565b90600052602060002090601f01602090048101928261359457600085556135db565b82601f106135ad57805160ff19168380011785556135db565b828001600101855582156135db579182015b828111156135da5782518255916020019190600101906135bf565b5b5090506135e8919061362c565b5090565b5080546135f890614c79565b6000825580601f1061360a5750613629565b601f016020900490600052602060002090810190613628919061362c565b5b50565b5b8082111561364557600081600090555060010161362d565b5090565b600061365c613657846149df565b6149ae565b9050808382526020820190508285602086028201111561367b57600080fd5b60005b858110156136ab57816136918882613731565b84526020840193506020830192505060018101905061367e565b5050509392505050565b60006136c86136c384614a0b565b6149ae565b9050828152602081018484840111156136e057600080fd5b6136eb848285614c37565b509392505050565b600061370661370184614a3b565b6149ae565b90508281526020810184848401111561371e57600080fd5b613729848285614c37565b509392505050565b60008135905061374081614df2565b92915050565b600082601f83011261375757600080fd5b8135613767848260208601613649565b91505092915050565b60008135905061377f81614e09565b92915050565b60008135905061379481614e20565b92915050565b6000815190506137a981614e20565b92915050565b600082601f8301126137c057600080fd5b81356137d08482602086016136b5565b91505092915050565b600082601f8301126137ea57600080fd5b81356137fa8482602086016136f3565b91505092915050565b60008135905061381281614e37565b92915050565b60006020828403121561382a57600080fd5b600061383884828501613731565b91505092915050565b6000806040838503121561385457600080fd5b600061386285828601613731565b925050602061387385828601613731565b9150509250929050565b60008060006060848603121561389257600080fd5b60006138a086828701613731565b93505060206138b186828701613731565b92505060406138c286828701613803565b9150509250925092565b600080600080608085870312156138e257600080fd5b60006138f087828801613731565b945050602061390187828801613731565b935050604061391287828801613803565b925050606085013567ffffffffffffffff81111561392f57600080fd5b61393b878288016137af565b91505092959194509250565b6000806040838503121561395a57600080fd5b600061396885828601613731565b925050602061397985828601613770565b9150509250929050565b6000806040838503121561399657600080fd5b60006139a485828601613731565b92505060206139b585828601613803565b9150509250929050565b600080604083850312156139d257600080fd5b600083013567ffffffffffffffff8111156139ec57600080fd5b6139f885828601613746565b9250506020613a0985828601613803565b9150509250929050565b600060208284031215613a2557600080fd5b6000613a3384828501613785565b91505092915050565b600060208284031215613a4e57600080fd5b6000613a5c8482850161379a565b91505092915050565b600060208284031215613a7757600080fd5b600082013567ffffffffffffffff811115613a9157600080fd5b613a9d848285016137d9565b91505092915050565b600060208284031215613ab857600080fd5b6000613ac684828501613803565b91505092915050565b613ad881614bc3565b82525050565b613ae781614bd5565b82525050565b6000613af882614a6b565b613b028185614a81565b9350613b12818560208601614c46565b613b1b81614de1565b840191505092915050565b6000613b3182614a76565b613b3b8185614a92565b9350613b4b818560208601614c46565b613b5481614de1565b840191505092915050565b6000613b6a82614a76565b613b748185614aa3565b9350613b84818560208601614c46565b80840191505092915050565b6000613b9d601483614a92565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613bdd600f83614a92565b91507f737570706c79206465706c6574656400000000000000000000000000000000006000830152602082019050919050565b6000613c1d602b83614a92565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c83603283614a92565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ce9602683614a92565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d4f601c83614a92565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d8f602483614a92565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613df5601983614a92565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e35602c83614a92565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613e9b601083614a92565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613edb603883614a92565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f41604083614a92565b91507f746869732061646472657373206973206e6f7420616c6c6f77656420746f206d60008301527f696e742074686174206d616e7920647572696e67207468652070726573616c656020830152604082019050919050565b6000613fa7601f83614a92565b91507f6f6e6c7920313220706572207472616e73616374696f6e20616c6c6f776564006000830152602082019050919050565b6000613fe7602a83614a92565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061404d602983614a92565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b3602083614a92565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140f3603183614a92565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000614159602c83614a92565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141bf602083614a92565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141ff602983614a92565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614265602f83614a92565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142cb602183614a92565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614331601383614a92565b91507f6e6f7420656e6f756768207761732070616964000000000000000000000000006000830152602082019050919050565b6000614371603183614a92565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143d7601383614a92565b91507f70726573616c65206973206e6f74206f70656e000000000000000000000000006000830152602082019050919050565b6000614417602c83614a92565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061447d602f83614a92565b91507f746869732061646472657373206973206e6f742077686974656c69737465642060008301527f666f72207468652070726573616c6500000000000000000000000000000000006020830152604082019050919050565b60006144e3603083614a92565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b61454581614c2d565b82525050565b60006145578285613b5f565b91506145638284613b5f565b91508190509392505050565b60006020820190506145846000830184613acf565b92915050565b600060808201905061459f6000830187613acf565b6145ac6020830186613acf565b6145b9604083018561453c565b81810360608301526145cb8184613aed565b905095945050505050565b60006020820190506145eb6000830184613ade565b92915050565b6000602082019050818103600083015261460b8184613b26565b905092915050565b6000602082019050818103600083015261462c81613b90565b9050919050565b6000602082019050818103600083015261464c81613bd0565b9050919050565b6000602082019050818103600083015261466c81613c10565b9050919050565b6000602082019050818103600083015261468c81613c76565b9050919050565b600060208201905081810360008301526146ac81613cdc565b9050919050565b600060208201905081810360008301526146cc81613d42565b9050919050565b600060208201905081810360008301526146ec81613d82565b9050919050565b6000602082019050818103600083015261470c81613de8565b9050919050565b6000602082019050818103600083015261472c81613e28565b9050919050565b6000602082019050818103600083015261474c81613e8e565b9050919050565b6000602082019050818103600083015261476c81613ece565b9050919050565b6000602082019050818103600083015261478c81613f34565b9050919050565b600060208201905081810360008301526147ac81613f9a565b9050919050565b600060208201905081810360008301526147cc81613fda565b9050919050565b600060208201905081810360008301526147ec81614040565b9050919050565b6000602082019050818103600083015261480c816140a6565b9050919050565b6000602082019050818103600083015261482c816140e6565b9050919050565b6000602082019050818103600083015261484c8161414c565b9050919050565b6000602082019050818103600083015261486c816141b2565b9050919050565b6000602082019050818103600083015261488c816141f2565b9050919050565b600060208201905081810360008301526148ac81614258565b9050919050565b600060208201905081810360008301526148cc816142be565b9050919050565b600060208201905081810360008301526148ec81614324565b9050919050565b6000602082019050818103600083015261490c81614364565b9050919050565b6000602082019050818103600083015261492c816143ca565b9050919050565b6000602082019050818103600083015261494c8161440a565b9050919050565b6000602082019050818103600083015261496c81614470565b9050919050565b6000602082019050818103600083015261498c816144d6565b9050919050565b60006020820190506149a8600083018461453c565b92915050565b6000604051905081810181811067ffffffffffffffff821117156149d5576149d4614db2565b5b8060405250919050565b600067ffffffffffffffff8211156149fa576149f9614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a2657614a25614db2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5657614a55614db2565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ab982614c2d565b9150614ac483614c2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af957614af8614d25565b5b828201905092915050565b6000614b0f82614c2d565b9150614b1a83614c2d565b925082614b2a57614b29614d54565b5b828204905092915050565b6000614b4082614c2d565b9150614b4b83614c2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8457614b83614d25565b5b828202905092915050565b6000614b9a82614c2d565b9150614ba583614c2d565b925082821015614bb857614bb7614d25565b5b828203905092915050565b6000614bce82614c0d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c64578082015181840152602081019050614c49565b83811115614c73576000848401525b50505050565b60006002820490506001821680614c9157607f821691505b60208210811415614ca557614ca4614d83565b5b50919050565b6000614cb682614c2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce957614ce8614d25565b5b600182019050919050565b6000614cff82614c2d565b9150614d0a83614c2d565b925082614d1a57614d19614d54565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614dfb81614bc3565b8114614e0657600080fd5b50565b614e1281614bd5565b8114614e1d57600080fd5b50565b614e2981614be1565b8114614e3457600080fd5b50565b614e4081614c2d565b8114614e4b57600080fd5b5056fea26469706673582212200fe8977c23899a464d4f8ff5344a6ffb1a5be040be1f6e1a5bc0244c76ed4e1964736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102295760003560e01c806370a0823111610123578063a0712d68116100ab578063d5abeb011161006f578063d5abeb01146107a3578063da5f6843146107ce578063e985e9c5146107f7578063eb73900b14610834578063f2fde38b1461087157610230565b8063a0712d68146106cd578063a22cb465146106e9578063b88d4fde14610712578063bee6348a1461073b578063c87b56dd1461076657610230565b80638da5cb5b116100f25780638da5cb5b146105f857806391b7f5ed1461062357806395d89b411461064c57806399288dbb14610677578063a035b1fe146106a257610230565b806370a0823114610576578063715018a6146105b35780637d8966e4146105ca5780638456cb59146105e157610230565b80633f4ba83a116101b157806355f804b31161017557806355f804b3146104915780635c975abb146104ba5780636352211e146104e55780636b6384db146105225780636c0360eb1461054b57610230565b80633f4ba83a146103c257806340d097c3146103d957806342842e0e1461040257806342966c681461042b5780634f6ccce71461045457610230565b806318160ddd116101f857806318160ddd1461030357806323b872dd1461032e5780632f745c591461035757806334393743146103945780633ccfd60b146103ab57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da57610230565b3661023057005b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a13565b61089a565b60405161026991906145d6565b60405180910390f35b34801561027e57600080fd5b506102876108ac565b60405161029491906145f1565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613aa6565b61093e565b6040516102d1919061456f565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc9190613983565b6109c3565b005b34801561030f57600080fd5b50610318610adb565b6040516103259190614993565b60405180910390f35b34801561033a57600080fd5b506103556004803603810190610350919061387d565b610ae8565b005b34801561036357600080fd5b5061037e60048036038101906103799190613983565b610b48565b60405161038b9190614993565b60405180910390f35b3480156103a057600080fd5b506103a9610bed565b005b3480156103b757600080fd5b506103c0610c95565b005b3480156103ce57600080fd5b506103d7610d58565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190613818565b610dde565b005b34801561040e57600080fd5b506104296004803603810190610424919061387d565b610e66565b005b34801561043757600080fd5b50610452600480360381019061044d9190613aa6565b610e86565b005b34801561046057600080fd5b5061047b60048036038101906104769190613aa6565b610ee2565b6040516104889190614993565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613a65565b610f79565b005b3480156104c657600080fd5b506104cf61100f565b6040516104dc91906145d6565b60405180910390f35b3480156104f157600080fd5b5061050c60048036038101906105079190613aa6565b611026565b604051610519919061456f565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906139bf565b6110d8565b005b34801561055757600080fd5b506105606111fc565b60405161056d91906145f1565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613818565b61128a565b6040516105aa9190614993565b60405180910390f35b3480156105bf57600080fd5b506105c8611342565b005b3480156105d657600080fd5b506105df61147f565b005b3480156105ed57600080fd5b506105f6611527565b005b34801561060457600080fd5b5061060d6115ad565b60405161061a919061456f565b60405180910390f35b34801561062f57600080fd5b5061064a60048036038101906106459190613aa6565b6115d7565b005b34801561065857600080fd5b5061066161165d565b60405161066e91906145f1565b60405180910390f35b34801561068357600080fd5b5061068c6116ef565b60405161069991906145d6565b60405180910390f35b3480156106ae57600080fd5b506106b7611702565b6040516106c49190614993565b60405180910390f35b6106e760048036038101906106e29190613aa6565b611708565b005b3480156106f557600080fd5b50610710600480360381019061070b9190613947565b611979565b005b34801561071e57600080fd5b50610739600480360381019061073491906138cc565b611afa565b005b34801561074757600080fd5b50610750611b5c565b60405161075d91906145d6565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613aa6565b611b6f565b60405161079a91906145f1565b60405180910390f35b3480156107af57600080fd5b506107b8611b81565b6040516107c59190614993565b60405180910390f35b3480156107da57600080fd5b506107f560048036038101906107f09190613818565b611b87565b005b34801561080357600080fd5b5061081e60048036038101906108199190613841565b611c2f565b60405161082b91906145d6565b60405180910390f35b34801561084057600080fd5b5061085b60048036038101906108569190613818565b611cc3565b6040516108689190614993565b60405180910390f35b34801561087d57600080fd5b5061089860048036038101906108939190613818565b611cdb565b005b60006108a582611e87565b9050919050565b6060600080546108bb90614c79565b80601f01602080910402602001604051908101604052809291908181526020018280546108e790614c79565b80156109345780601f1061090957610100808354040283529160200191610934565b820191906000526020600020905b81548152906001019060200180831161091757829003601f168201915b5050505050905090565b600061094982611f01565b610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90614833565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ce82611026565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a36906148b3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5e611f6d565b73ffffffffffffffffffffffffffffffffffffffff161480610a8d5750610a8c81610a87611f6d565b611c2f565b5b610acc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac390614753565b60405180910390fd5b610ad68383611f75565b505050565b6000600880549050905090565b610af9610af3611f6d565b8261202e565b610b38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2f906148f3565b60405180910390fd5b610b4383838361210c565b505050565b6000610b538361128a565b8210610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90614653565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bf5611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610c136115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090614853565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610c9d611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610cbb6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614853565b60405180910390fd5b610d19611f6d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610d5657600080fd5b565b610d60611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610d7e6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90614853565b60405180910390fd5b610ddc612368565b565b610de6611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610e046115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5190614853565b60405180910390fd5b610e638161240a565b50565b610e8183838360405180602001604052806000815250611afa565b505050565b610e97610e91611f6d565b8261202e565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90614973565b60405180910390fd5b610edf81612475565b50565b6000610eec610adb565b8210610f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2490614933565b60405180910390fd5b60088281548110610f67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f81611f6d565b73ffffffffffffffffffffffffffffffffffffffff16610f9f6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90614853565b60405180910390fd5b806010908051906020019061100b929190613566565b5050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c6906147d3565b60405180910390fd5b80915050919050565b6110e0611f6d565b73ffffffffffffffffffffffffffffffffffffffff166110fe6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b90614853565b60405180910390fd5b60005b82518110156111f757816011600085848151811061119e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806111ef90614cab565b915050611157565b505050565b6010805461120990614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461123590614c79565b80156112825780601f1061125757610100808354040283529160200191611282565b820191906000526020600020905b81548152906001019060200180831161126557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f2906147b3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61134a611f6d565b73ffffffffffffffffffffffffffffffffffffffff166113686115ad565b73ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b590614853565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611487611f6d565b73ffffffffffffffffffffffffffffffffffffffff166114a56115ad565b73ffffffffffffffffffffffffffffffffffffffff16146114fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f290614853565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61152f611f6d565b73ffffffffffffffffffffffffffffffffffffffff1661154d6115ad565b73ffffffffffffffffffffffffffffffffffffffff16146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614853565b60405180910390fd5b6115ab612481565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115df611f6d565b73ffffffffffffffffffffffffffffffffffffffff166115fd6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90614853565b60405180910390fd5b80600e8190555050565b60606001805461166c90614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461169890614c79565b80156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1681565b600e5481565b80600e546117169190614b35565b341015611758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174f906148d3565b60405180910390fd5b600f60009054906101000a900460ff166119095760011515600f60019054906101000a900460ff161515146117c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b990614913565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184090614953565b60405180910390fd5b8082111561188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188390614773565b60405180910390fd5b60005b828110156118b3576118a03361240a565b80806118ab90614cab565b91505061188f565b5081816118c09190614b8f565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050611976565b600c81111561194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490614793565b60405180910390fd5b60005b81811015611974576119613361240a565b808061196c90614cab565b915050611950565b505b50565b611981611f6d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e6906146f3565b60405180910390fd5b80600560006119fc611f6d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aa9611f6d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611aee91906145d6565b60405180910390a35050565b611b0b611b05611f6d565b8361202e565b611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b41906148f3565b60405180910390fd5b611b5684848484612524565b50505050565b600f60019054906101000a900460ff1681565b6060611b7a82612580565b9050919050565b600d5481565b611b8f611f6d565b73ffffffffffffffffffffffffffffffffffffffff16611bad6115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90614853565b60405180910390fd5b60005b6023811015611c2b57611c188261240a565b8080611c2390614cab565b915050611c06565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60116020528060005260406000206000915090505481565b611ce3611f6d565b73ffffffffffffffffffffffffffffffffffffffff16611d016115ad565b73ffffffffffffffffffffffffffffffffffffffff1614611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e90614853565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbe90614693565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611efa5750611ef9826126d2565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611fe883611026565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061203982611f01565b612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90614713565b60405180910390fd5b600061208383611026565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120f257508373ffffffffffffffffffffffffffffffffffffffff166120da8461093e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210357506121028185611c2f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661212c82611026565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990614873565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e9906146d3565b60405180910390fd5b6121fd8383836127b4565b612208600082611f75565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122589190614b8f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122af9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61237061100f565b6123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690614613565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123f3611f6d565b604051612400919061456f565b60405180910390a1565b600d54612415610adb565b10612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90614633565b60405180910390fd5b61246881612463600c61280c565b61281a565b612472600c612838565b50565b61247e8161284e565b50565b61248961100f565b156124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c090614733565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861250d611f6d565b60405161251a919061456f565b60405180910390a1565b61252f84848461210c565b61253b848484846128a1565b61257a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257190614673565b60405180910390fd5b50505050565b606061258b82611f01565b6125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c190614813565b60405180910390fd5b6000600a600084815260200190815260200160002080546125ea90614c79565b80601f016020809104026020016040519081016040528092919081815260200182805461261690614c79565b80156126635780601f1061263857610100808354040283529160200191612663565b820191906000526020600020905b81548152906001019060200180831161264657829003601f168201915b505050505090506000612674612a38565b905060008151141561268a5781925050506126cd565b6000825111156126bf5780826040516020016126a792919061454b565b604051602081830303815290604052925050506126cd565b6126c884612aca565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061279d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127ad57506127ac82612b71565b5b9050919050565b6127bc61100f565b156127fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f390614733565b60405180910390fd5b612807838383612bdb565b505050565b600081600001549050919050565b612834828260405180602001604052806000815250612cef565b5050565b6001816000016000828254019250508190555050565b61285781612d4a565b6000600a6000838152602001908152602001600020805461287790614c79565b90501461289e57600a6000828152602001908152602001600020600061289d91906135ec565b5b50565b60006128c28473ffffffffffffffffffffffffffffffffffffffff16612e5b565b15612a2b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128eb611f6d565b8786866040518563ffffffff1660e01b815260040161290d949392919061458a565b602060405180830381600087803b15801561292757600080fd5b505af192505050801561295857506040513d601f19601f820116820180604052508101906129559190613a3c565b60015b6129db573d8060008114612988576040519150601f19603f3d011682016040523d82523d6000602084013e61298d565b606091505b506000815114156129d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ca90614673565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a30565b600190505b949350505050565b606060108054612a4790614c79565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7390614c79565b8015612ac05780601f10612a9557610100808354040283529160200191612ac0565b820191906000526020600020905b815481529060010190602001808311612aa357829003601f168201915b5050505050905090565b6060612ad582611f01565b612b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0b90614893565b60405180910390fd5b6000612b1e612a38565b90506000815111612b3e5760405180602001604052806000815250612b69565b80612b4884612e6e565b604051602001612b5992919061454b565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612be683838361301b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c2957612c2481613020565b612c68565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c6757612c668382613069565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cab57612ca6816131d6565b612cea565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ce957612ce88282613319565b5b5b505050565b612cf98383613398565b612d0660008484846128a1565b612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c90614673565b60405180910390fd5b505050565b6000612d5582611026565b9050612d63816000846127b4565b612d6e600083611f75565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dbe9190614b8f565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612eb6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613016565b600082905060005b60008214612ee8578080612ed190614cab565b915050600a82612ee19190614b04565b9150612ebe565b60008167ffffffffffffffff811115612f2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f5c5781602001600182028036833780820191505090505b5090505b6000851461300f57600182612f759190614b8f565b9150600a85612f849190614cf4565b6030612f909190614aae565b60f81b818381518110612fcc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130089190614b04565b9450612f60565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130768461128a565b6130809190614b8f565b9050600060076000848152602001908152602001600020549050818114613165576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131ea9190614b8f565b9050600060096000848152602001908152602001600020549050600060088381548110613240577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133248361128a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ff906147f3565b60405180910390fd5b61341181611f01565b15613451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613448906146b3565b60405180910390fd5b61345d600083836127b4565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134ad9190614aae565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461357290614c79565b90600052602060002090601f01602090048101928261359457600085556135db565b82601f106135ad57805160ff19168380011785556135db565b828001600101855582156135db579182015b828111156135da5782518255916020019190600101906135bf565b5b5090506135e8919061362c565b5090565b5080546135f890614c79565b6000825580601f1061360a5750613629565b601f016020900490600052602060002090810190613628919061362c565b5b50565b5b8082111561364557600081600090555060010161362d565b5090565b600061365c613657846149df565b6149ae565b9050808382526020820190508285602086028201111561367b57600080fd5b60005b858110156136ab57816136918882613731565b84526020840193506020830192505060018101905061367e565b5050509392505050565b60006136c86136c384614a0b565b6149ae565b9050828152602081018484840111156136e057600080fd5b6136eb848285614c37565b509392505050565b600061370661370184614a3b565b6149ae565b90508281526020810184848401111561371e57600080fd5b613729848285614c37565b509392505050565b60008135905061374081614df2565b92915050565b600082601f83011261375757600080fd5b8135613767848260208601613649565b91505092915050565b60008135905061377f81614e09565b92915050565b60008135905061379481614e20565b92915050565b6000815190506137a981614e20565b92915050565b600082601f8301126137c057600080fd5b81356137d08482602086016136b5565b91505092915050565b600082601f8301126137ea57600080fd5b81356137fa8482602086016136f3565b91505092915050565b60008135905061381281614e37565b92915050565b60006020828403121561382a57600080fd5b600061383884828501613731565b91505092915050565b6000806040838503121561385457600080fd5b600061386285828601613731565b925050602061387385828601613731565b9150509250929050565b60008060006060848603121561389257600080fd5b60006138a086828701613731565b93505060206138b186828701613731565b92505060406138c286828701613803565b9150509250925092565b600080600080608085870312156138e257600080fd5b60006138f087828801613731565b945050602061390187828801613731565b935050604061391287828801613803565b925050606085013567ffffffffffffffff81111561392f57600080fd5b61393b878288016137af565b91505092959194509250565b6000806040838503121561395a57600080fd5b600061396885828601613731565b925050602061397985828601613770565b9150509250929050565b6000806040838503121561399657600080fd5b60006139a485828601613731565b92505060206139b585828601613803565b9150509250929050565b600080604083850312156139d257600080fd5b600083013567ffffffffffffffff8111156139ec57600080fd5b6139f885828601613746565b9250506020613a0985828601613803565b9150509250929050565b600060208284031215613a2557600080fd5b6000613a3384828501613785565b91505092915050565b600060208284031215613a4e57600080fd5b6000613a5c8482850161379a565b91505092915050565b600060208284031215613a7757600080fd5b600082013567ffffffffffffffff811115613a9157600080fd5b613a9d848285016137d9565b91505092915050565b600060208284031215613ab857600080fd5b6000613ac684828501613803565b91505092915050565b613ad881614bc3565b82525050565b613ae781614bd5565b82525050565b6000613af882614a6b565b613b028185614a81565b9350613b12818560208601614c46565b613b1b81614de1565b840191505092915050565b6000613b3182614a76565b613b3b8185614a92565b9350613b4b818560208601614c46565b613b5481614de1565b840191505092915050565b6000613b6a82614a76565b613b748185614aa3565b9350613b84818560208601614c46565b80840191505092915050565b6000613b9d601483614a92565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613bdd600f83614a92565b91507f737570706c79206465706c6574656400000000000000000000000000000000006000830152602082019050919050565b6000613c1d602b83614a92565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c83603283614a92565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613ce9602683614a92565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d4f601c83614a92565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d8f602483614a92565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613df5601983614a92565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e35602c83614a92565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613e9b601083614a92565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000613edb603883614a92565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f41604083614a92565b91507f746869732061646472657373206973206e6f7420616c6c6f77656420746f206d60008301527f696e742074686174206d616e7920647572696e67207468652070726573616c656020830152604082019050919050565b6000613fa7601f83614a92565b91507f6f6e6c7920313220706572207472616e73616374696f6e20616c6c6f776564006000830152602082019050919050565b6000613fe7602a83614a92565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061404d602983614a92565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140b3602083614a92565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006140f3603183614a92565b91507f45524337323155524953746f726167653a2055524920717565727920666f722060008301527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006020830152604082019050919050565b6000614159602c83614a92565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141bf602083614a92565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006141ff602983614a92565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614265602f83614a92565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142cb602183614a92565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614331601383614a92565b91507f6e6f7420656e6f756768207761732070616964000000000000000000000000006000830152602082019050919050565b6000614371603183614a92565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143d7601383614a92565b91507f70726573616c65206973206e6f74206f70656e000000000000000000000000006000830152602082019050919050565b6000614417602c83614a92565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b600061447d602f83614a92565b91507f746869732061646472657373206973206e6f742077686974656c69737465642060008301527f666f72207468652070726573616c6500000000000000000000000000000000006020830152604082019050919050565b60006144e3603083614a92565b91507f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f766564000000000000000000000000000000006020830152604082019050919050565b61454581614c2d565b82525050565b60006145578285613b5f565b91506145638284613b5f565b91508190509392505050565b60006020820190506145846000830184613acf565b92915050565b600060808201905061459f6000830187613acf565b6145ac6020830186613acf565b6145b9604083018561453c565b81810360608301526145cb8184613aed565b905095945050505050565b60006020820190506145eb6000830184613ade565b92915050565b6000602082019050818103600083015261460b8184613b26565b905092915050565b6000602082019050818103600083015261462c81613b90565b9050919050565b6000602082019050818103600083015261464c81613bd0565b9050919050565b6000602082019050818103600083015261466c81613c10565b9050919050565b6000602082019050818103600083015261468c81613c76565b9050919050565b600060208201905081810360008301526146ac81613cdc565b9050919050565b600060208201905081810360008301526146cc81613d42565b9050919050565b600060208201905081810360008301526146ec81613d82565b9050919050565b6000602082019050818103600083015261470c81613de8565b9050919050565b6000602082019050818103600083015261472c81613e28565b9050919050565b6000602082019050818103600083015261474c81613e8e565b9050919050565b6000602082019050818103600083015261476c81613ece565b9050919050565b6000602082019050818103600083015261478c81613f34565b9050919050565b600060208201905081810360008301526147ac81613f9a565b9050919050565b600060208201905081810360008301526147cc81613fda565b9050919050565b600060208201905081810360008301526147ec81614040565b9050919050565b6000602082019050818103600083015261480c816140a6565b9050919050565b6000602082019050818103600083015261482c816140e6565b9050919050565b6000602082019050818103600083015261484c8161414c565b9050919050565b6000602082019050818103600083015261486c816141b2565b9050919050565b6000602082019050818103600083015261488c816141f2565b9050919050565b600060208201905081810360008301526148ac81614258565b9050919050565b600060208201905081810360008301526148cc816142be565b9050919050565b600060208201905081810360008301526148ec81614324565b9050919050565b6000602082019050818103600083015261490c81614364565b9050919050565b6000602082019050818103600083015261492c816143ca565b9050919050565b6000602082019050818103600083015261494c8161440a565b9050919050565b6000602082019050818103600083015261496c81614470565b9050919050565b6000602082019050818103600083015261498c816144d6565b9050919050565b60006020820190506149a8600083018461453c565b92915050565b6000604051905081810181811067ffffffffffffffff821117156149d5576149d4614db2565b5b8060405250919050565b600067ffffffffffffffff8211156149fa576149f9614db2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614a2657614a25614db2565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614a5657614a55614db2565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ab982614c2d565b9150614ac483614c2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614af957614af8614d25565b5b828201905092915050565b6000614b0f82614c2d565b9150614b1a83614c2d565b925082614b2a57614b29614d54565b5b828204905092915050565b6000614b4082614c2d565b9150614b4b83614c2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b8457614b83614d25565b5b828202905092915050565b6000614b9a82614c2d565b9150614ba583614c2d565b925082821015614bb857614bb7614d25565b5b828203905092915050565b6000614bce82614c0d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c64578082015181840152602081019050614c49565b83811115614c73576000848401525b50505050565b60006002820490506001821680614c9157607f821691505b60208210811415614ca557614ca4614d83565b5b50919050565b6000614cb682614c2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ce957614ce8614d25565b5b600182019050919050565b6000614cff82614c2d565b9150614d0a83614c2d565b925082614d1a57614d19614d54565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614dfb81614bc3565b8114614e0657600080fd5b50565b614e1281614bd5565b8114614e1d57600080fd5b50565b614e2981614be1565b8114614e3457600080fd5b50565b614e4081614c2d565b8114614e4b57600080fd5b5056fea26469706673582212200fe8977c23899a464d4f8ff5344a6ffb1a5be040be1f6e1a5bc0244c76ed4e1964736f6c63430008000033

Deployed Bytecode Sourcemap

49716:3421:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52963:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22006:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23417:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22977:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35672:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24307:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35340:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50897:87;;;;;;;;;;;;;:::i;:::-;;50547:114;;;;;;;;;;;;;:::i;:::-;;50738:65;;;;;;;;;;;;;:::i;:::-;;51518:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24717:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48119:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35862:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50992:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44178:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21700:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50372:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50072:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21430:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47110:148;;;;;;;;;;;;;:::i;:::-;;50811:78;;;;;;;;;;;;;:::i;:::-;;50669:61;;;;;;;;;;;;;:::i;:::-;;46459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51102:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22175:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49999:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49952:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51608:754;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23710:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24973:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50034:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52800:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49914:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50245:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24076:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50102:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47413:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52963:171;53066:4;53090:36;53114:11;53090:23;:36::i;:::-;53083:43;;52963:171;;;:::o;22006:100::-;22060:13;22093:5;22086:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22006:100;:::o;23417:221::-;23493:7;23521:16;23529:7;23521;:16::i;:::-;23513:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23606:15;:24;23622:7;23606:24;;;;;;;;;;;;;;;;;;;;;23599:31;;23417:221;;;:::o;22977:374::-;23058:13;23074:23;23089:7;23074:14;:23::i;:::-;23058:39;;23122:5;23116:11;;:2;:11;;;;23108:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23202:5;23186:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23211:37;23228:5;23235:12;:10;:12::i;:::-;23211:16;:37::i;:::-;23186:62;23178:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;23322:21;23331:2;23335:7;23322:8;:21::i;:::-;22977:374;;;:::o;35672:113::-;35733:7;35760:10;:17;;;;35753:24;;35672:113;:::o;24307:339::-;24502:41;24521:12;:10;:12::i;:::-;24535:7;24502:18;:41::i;:::-;24494:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24610:28;24620:4;24626:2;24630:7;24610:9;:28::i;:::-;24307:339;;;:::o;35340:256::-;35437:7;35473:23;35490:5;35473:16;:23::i;:::-;35465:5;:31;35457:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35562:12;:19;35575:5;35562:19;;;;;;;;;;;;;;;:26;35582:5;35562:26;;;;;;;;;;;;35555:33;;35340:256;;;;:::o;50897:87::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50965:11:::1;;;;;;;;;;;50964:12;50950:11;;:26;;;;;;;;;;;;;;;;;;50897:87::o:0;50547:114::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50611:12:::1;:10;:12::i;:::-;50603:26;;:49;50630:21;50603:49;;;;;;;;;;;;;;;;;;;;;;;50595:58;;;::::0;::::1;;50547:114::o:0;50738:65::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50785:10:::1;:8;:10::i;:::-;50738:65::o:0;51518:82::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51576:16:::1;51589:2;51576:12;:16::i;:::-;51518:82:::0;:::o;24717:185::-;24855:39;24872:4;24878:2;24882:7;24855:39;;;;;;;;;;;;:16;:39::i;:::-;24717:185;;;:::o;48119:245::-;48237:41;48256:12;:10;:12::i;:::-;48270:7;48237:18;:41::i;:::-;48229:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;48342:14;48348:7;48342:5;:14::i;:::-;48119:245;:::o;35862:233::-;35937:7;35973:30;:28;:30::i;:::-;35965:5;:38;35957:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:10;36081:5;36070:17;;;;;;;;;;;;;;;;;;;;;;;;36063:24;;35862:233;;;:::o;50992:102::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51076:10:::1;51066:7;:20;;;;;;;;;;;;:::i;:::-;;50992:102:::0;:::o;44178:86::-;44225:4;44249:7;;;;;;;;;;;44242:14;;44178:86;:::o;21700:239::-;21772:7;21792:13;21808:7;:16;21816:7;21808:16;;;;;;;;;;;;;;;;;;;;;21792:32;;21860:1;21843:19;;:5;:19;;;;21835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21926:5;21919:12;;;21700:239;;;:::o;50372:167::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50469:9:::1;50464:67;50488:3;:10;50484:1;:14;50464:67;;;50525:6;50505:9;:17;50515:3;50519:1;50515:6;;;;;;;;;;;;;;;;;;;;;;50505:17;;;;;;;;;;;;;;;:26;;;;50500:3;;;;;:::i;:::-;;;;50464:67;;;;50372:167:::0;;:::o;50072:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21430:208::-;21502:7;21547:1;21530:19;;:5;:19;;;;21522:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21614:9;:16;21624:5;21614:16;;;;;;;;;;;;;;;;21607:23;;21430:208;;;:::o;47110:148::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47217:1:::1;47180:40;;47201:6;;;;;;;;;;;47180:40;;;;;;;;;;;;47248:1;47231:6;;:19;;;;;;;;;;;;;;;;;;47110:148::o:0;50811:78::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50873:8:::1;;;;;;;;;;;50872:9;50861:8;;:20;;;;;;;;;;;;;;;;;;50811:78::o:0;50669:61::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50714:8:::1;:6;:8::i;:::-;50669:61::o:0;46459:87::-;46505:7;46532:6;;;;;;;;;;;46525:13;;46459:87;:::o;51102:88::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51174:8:::1;51166:5;:16;;;;51102:88:::0;:::o;22175:104::-;22231:13;22264:7;22257:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22175:104;:::o;49999:28::-;;;;;;;;;;;;;:::o;49952:40::-;;;;:::o;51608:754::-;51693:6;51685:5;;:14;;;;:::i;:::-;51672:9;:27;;51664:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;51741:8;;;;;;;;;;;51736:478;;51789:4;51774:19;;:11;;;;;;;;;;;:19;;;51766:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;51832:11;51846:9;:21;51856:10;51846:21;;;;;;;;;;;;;;;;51832:35;;51896:1;51890:3;:7;51882:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;51982:3;51972:6;:13;;51964:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;52074:9;52069:61;52093:6;52089:1;:10;52069:61;;;52106:24;52119:10;52106:12;:24::i;:::-;52101:3;;;;;:::i;:::-;;;;52069:61;;;;52175:6;52169:3;:12;;;;:::i;:::-;52145:9;:21;52155:10;52145:21;;;;;;;;;;;;;;;:36;;;;52196:7;;;51736:478;52244:2;52234:6;:12;;52226:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;52298:9;52293:61;52317:6;52313:1;:10;52293:61;;;52330:24;52343:10;52330:12;:24::i;:::-;52325:3;;;;;:::i;:::-;;;;52293:61;;;;51608:754;;:::o;23710:295::-;23825:12;:10;:12::i;:::-;23813:24;;:8;:24;;;;23805:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23925:8;23880:18;:32;23899:12;:10;:12::i;:::-;23880:32;;;;;;;;;;;;;;;:42;23913:8;23880:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23978:8;23949:48;;23964:12;:10;:12::i;:::-;23949:48;;;23988:8;23949:48;;;;;;:::i;:::-;;;;;;;;23710:295;;:::o;24973:328::-;25148:41;25167:12;:10;:12::i;:::-;25181:7;25148:18;:41::i;:::-;25140:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25254:39;25268:4;25274:2;25278:7;25287:5;25254:13;:39::i;:::-;24973:328;;;;:::o;50034:31::-;;;;;;;;;;;;;:::o;52800:155::-;52891:13;52924:23;52939:7;52924:14;:23::i;:::-;52917:30;;52800:155;;;:::o;49914:31::-;;;;:::o;50245:119::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50312:9:::1;50307:49;50331:2;50327:1;:6;50307:49;;;50340:16;50353:2;50340:12;:16::i;:::-;50335:3;;;;;:::i;:::-;;;;50307:49;;;;50245:119:::0;:::o;24076:164::-;24173:4;24197:18;:25;24216:5;24197:25;;;;;;;;;;;;;;;:35;24223:8;24197:35;;;;;;;;;;;;;;;;;;;;;;;;;24190:42;;24076:164;;;;:::o;50102:44::-;;;;;;;;;;;;;;;;;:::o;47413:244::-;46690:12;:10;:12::i;:::-;46679:23;;:7;:5;:7::i;:::-;:23;;;46671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47522:1:::1;47502:22;;:8;:22;;;;47494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47612:8;47583:38;;47604:6;;;;;;;;;;;47583:38;;;;;;;;;;;;47641:8;47632:6;;:17;;;;;;;;;;;;;;;;;;47413:244:::0;:::o;35032:224::-;35134:4;35173:35;35158:50;;;:11;:50;;;;:90;;;;35212:36;35236:11;35212:23;:36::i;:::-;35158:90;35151:97;;35032:224;;;:::o;26811:127::-;26876:4;26928:1;26900:30;;:7;:16;26908:7;26900:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26893:37;;26811:127;;;:::o;16406:98::-;16459:7;16486:10;16479:17;;16406:98;:::o;30756:174::-;30858:2;30831:15;:24;30847:7;30831:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30914:7;30910:2;30876:46;;30885:23;30900:7;30885:14;:23::i;:::-;30876:46;;;;;;;;;;;;30756:174;;:::o;27105:348::-;27198:4;27223:16;27231:7;27223;:16::i;:::-;27215:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27299:13;27315:23;27330:7;27315:14;:23::i;:::-;27299:39;;27368:5;27357:16;;:7;:16;;;:51;;;;27401:7;27377:31;;:20;27389:7;27377:11;:20::i;:::-;:31;;;27357:51;:87;;;;27412:32;27429:5;27436:7;27412:16;:32::i;:::-;27357:87;27349:96;;;27105:348;;;;:::o;30060:578::-;30219:4;30192:31;;:23;30207:7;30192:14;:23::i;:::-;:31;;;30184:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30302:1;30288:16;;:2;:16;;;;30280:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30358:39;30379:4;30385:2;30389:7;30358:20;:39::i;:::-;30462:29;30479:1;30483:7;30462:8;:29::i;:::-;30523:1;30504:9;:15;30514:4;30504:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30552:1;30535:9;:13;30545:2;30535:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30583:2;30564:7;:16;30572:7;30564:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30622:7;30618:2;30603:27;;30612:4;30603:27;;;;;;;;;;;;30060:578;;;:::o;45237:120::-;44781:8;:6;:8::i;:::-;44773:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45306:5:::1;45296:7;;:15;;;;;;;;;;;;;;;;;;45327:22;45336:12;:10;:12::i;:::-;45327:22;;;;;;:::i;:::-;;;;;;;;45237:120::o:0;51306:204::-;51384:9;;51368:13;:11;:13::i;:::-;:25;51360:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51424:40;51434:2;51438:25;:15;:23;:25::i;:::-;51424:9;:40::i;:::-;51475:27;:15;:25;:27::i;:::-;51306:204;:::o;52677:115::-;52764:20;52776:7;52764:11;:20::i;:::-;52677:115;:::o;44978:118::-;44504:8;:6;:8::i;:::-;44503:9;44495:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45048:4:::1;45038:7;;:14;;;;;;;;;;;;;;;;;;45068:20;45075:12;:10;:12::i;:::-;45068:20;;;;;;:::i;:::-;;;;;;;;44978:118::o:0;26183:315::-;26340:28;26350:4;26356:2;26360:7;26340:9;:28::i;:::-;26387:48;26410:4;26416:2;26420:7;26429:5;26387:22;:48::i;:::-;26379:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26183:315;;;;:::o;41610:679::-;41683:13;41717:16;41725:7;41717;:16::i;:::-;41709:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;41800:23;41826:10;:19;41837:7;41826:19;;;;;;;;;;;41800:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41856:18;41877:10;:8;:10::i;:::-;41856:31;;41985:1;41969:4;41963:18;:23;41959:72;;;42010:9;42003:16;;;;;;41959:72;42161:1;42141:9;42135:23;:27;42131:108;;;42210:4;42216:9;42193:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42179:48;;;;;;42131:108;42258:23;42273:7;42258:14;:23::i;:::-;42251:30;;;;41610:679;;;;:::o;21100:266::-;21202:4;21241:25;21226:40;;;:11;:40;;;;:92;;;;21285:33;21270:48;;;:11;:48;;;;21226:92;:132;;;;21322:36;21346:11;21322:23;:36::i;:::-;21226:132;21219:139;;21100:266;;;:::o;52370:229::-;44504:8;:6;:8::i;:::-;44503:9;44495:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52546:45:::1;52573:4;52579:2;52583:7;52546:26;:45::i;:::-;52370:229:::0;;;:::o;49190:114::-;49255:7;49282;:14;;;49275:21;;49190:114;;;:::o;27795:110::-;27871:26;27881:2;27885:7;27871:26;;;;;;;;;;;;:9;:26::i;:::-;27795:110;;:::o;49312:127::-;49419:1;49401:7;:14;;;:19;;;;;;;;;;;49312:127;:::o;42891:206::-;42960:20;42972:7;42960:11;:20::i;:::-;43034:1;43003:10;:19;43014:7;43003:19;;;;;;;;;;;42997:33;;;;;:::i;:::-;;;:38;42993:97;;43059:10;:19;43070:7;43059:19;;;;;;;;;;;;43052:26;;;;:::i;:::-;42993:97;42891:206;:::o;31495:872::-;31650:4;31671:15;:2;:13;;;:15::i;:::-;31667:693;;;31723:2;31707:36;;;31744:12;:10;:12::i;:::-;31758:4;31764:7;31773:5;31707:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31703:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31970:1;31953:6;:13;:18;31949:341;;;31996:60;;;;;;;;;;:::i;:::-;;;;;;;;31949:341;32240:6;32234:13;32225:6;32221:2;32217:15;32210:38;31703:602;31840:45;;;31830:55;;;:6;:55;;;;31823:62;;;;;31667:693;32344:4;32337:11;;31495:872;;;;;;;:::o;51198:100::-;51250:13;51283:7;51276:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51198:100;:::o;22350:334::-;22423:13;22457:16;22465:7;22457;:16::i;:::-;22449:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22538:21;22562:10;:8;:10::i;:::-;22538:34;;22614:1;22596:7;22590:21;:25;:86;;;;;;;;;;;;;;;;;22642:7;22651:18;:7;:16;:18::i;:::-;22625:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22590:86;22583:93;;;22350:334;;;:::o;19616:157::-;19701:4;19740:25;19725:40;;;:11;:40;;;;19718:47;;19616:157;;;:::o;36708:589::-;36852:45;36879:4;36885:2;36889:7;36852:26;:45::i;:::-;36930:1;36914:18;;:4;:18;;;36910:187;;;36949:40;36981:7;36949:31;:40::i;:::-;36910:187;;;37019:2;37011:10;;:4;:10;;;37007:90;;37038:47;37071:4;37077:7;37038:32;:47::i;:::-;37007:90;36910:187;37125:1;37111:16;;:2;:16;;;37107:183;;;37144:45;37181:7;37144:36;:45::i;:::-;37107:183;;;37217:4;37211:10;;:2;:10;;;37207:83;;37238:40;37266:2;37270:7;37238:27;:40::i;:::-;37207:83;37107:183;36708:589;;;:::o;28132:284::-;28262:18;28268:2;28272:7;28262:5;:18::i;:::-;28299:54;28330:1;28334:2;28338:7;28347:5;28299:22;:54::i;:::-;28291:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;28132:284;;;:::o;29363:360::-;29423:13;29439:23;29454:7;29439:14;:23::i;:::-;29423:39;;29475:48;29496:5;29511:1;29515:7;29475:20;:48::i;:::-;29564:29;29581:1;29585:7;29564:8;:29::i;:::-;29626:1;29606:9;:16;29616:5;29606:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29645:7;:16;29653:7;29645:16;;;;;;;;;;;;29638:23;;;;;;;;;;;29707:7;29703:1;29679:36;;29688:5;29679:36;;;;;;;;;;;;29363:360;;:::o;8287:444::-;8347:4;8555:12;8679:7;8667:20;8659:28;;8722:1;8715:4;:8;8708:15;;;8287:444;;;:::o;17063:723::-;17119:13;17349:1;17340:5;:10;17336:53;;;17367:10;;;;;;;;;;;;;;;;;;;;;17336:53;17399:12;17414:5;17399:20;;17430:14;17455:78;17470:1;17462:4;:9;17455:78;;17488:8;;;;;:::i;:::-;;;;17519:2;17511:10;;;;;:::i;:::-;;;17455:78;;;17543:19;17575:6;17565:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17543:39;;17593:154;17609:1;17600:5;:10;17593:154;;17637:1;17627:11;;;;;:::i;:::-;;;17704:2;17696:5;:10;;;;:::i;:::-;17683:2;:24;;;;:::i;:::-;17670:39;;17653:6;17660;17653:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17733:2;17724:11;;;;;:::i;:::-;;;17593:154;;;17771:6;17757:21;;;;;17063:723;;;;:::o;32980:126::-;;;;:::o;38020:164::-;38124:10;:17;;;;38097:15;:24;38113:7;38097:24;;;;;;;;;;;:44;;;;38152:10;38168:7;38152:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38020:164;:::o;38811:988::-;39077:22;39127:1;39102:22;39119:4;39102:16;:22::i;:::-;:26;;;;:::i;:::-;39077:51;;39139:18;39160:17;:26;39178:7;39160:26;;;;;;;;;;;;39139:47;;39307:14;39293:10;:28;39289:328;;39338:19;39360:12;:18;39373:4;39360:18;;;;;;;;;;;;;;;:34;39379:14;39360:34;;;;;;;;;;;;39338:56;;39444:11;39411:12;:18;39424:4;39411:18;;;;;;;;;;;;;;;:30;39430:10;39411:30;;;;;;;;;;;:44;;;;39561:10;39528:17;:30;39546:11;39528:30;;;;;;;;;;;:43;;;;39289:328;;39713:17;:26;39731:7;39713:26;;;;;;;;;;;39706:33;;;39757:12;:18;39770:4;39757:18;;;;;;;;;;;;;;;:34;39776:14;39757:34;;;;;;;;;;;39750:41;;;38811:988;;;;:::o;40094:1079::-;40347:22;40392:1;40372:10;:17;;;;:21;;;;:::i;:::-;40347:46;;40404:18;40425:15;:24;40441:7;40425:24;;;;;;;;;;;;40404:45;;40776:19;40798:10;40809:14;40798:26;;;;;;;;;;;;;;;;;;;;;;;;40776:48;;40862:11;40837:10;40848;40837:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40973:10;40942:15;:28;40958:11;40942:28;;;;;;;;;;;:41;;;;41114:15;:24;41130:7;41114:24;;;;;;;;;;;41107:31;;;41149:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40094:1079;;;;:::o;37598:221::-;37683:14;37700:20;37717:2;37700:16;:20::i;:::-;37683:37;;37758:7;37731:12;:16;37744:2;37731:16;;;;;;;;;;;;;;;:24;37748:6;37731:24;;;;;;;;;;;:34;;;;37805:6;37776:17;:26;37794:7;37776:26;;;;;;;;;;;:35;;;;37598:221;;;:::o;28752:382::-;28846:1;28832:16;;:2;:16;;;;28824:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28905:16;28913:7;28905;:16::i;:::-;28904:17;28896:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28967:45;28996:1;29000:2;29004:7;28967:20;:45::i;:::-;29042:1;29025:9;:13;29035:2;29025:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29073:2;29054:7;:16;29062:7;29054:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29118:7;29114:2;29093:33;;29110:1;29093:33;;;;;;;;;;;;28752:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:550::-;;;6002:2;5990:9;5981:7;5977:23;5973:32;5970:2;;;6018:1;6015;6008:12;5970:2;6089:1;6078:9;6074:17;6061:31;6119:18;6111:6;6108:30;6105:2;;;6151:1;6148;6141:12;6105:2;6179:78;6249:7;6240:6;6229:9;6225:22;6179:78;:::i;:::-;6169:88;;6032:235;6306:2;6332:53;6377:7;6368:6;6357:9;6353:22;6332:53;:::i;:::-;6322:63;;6277:118;5960:442;;;;;:::o;6408:260::-;;6515:2;6503:9;6494:7;6490:23;6486:32;6483:2;;;6531:1;6528;6521:12;6483:2;6574:1;6599:52;6643:7;6634:6;6623:9;6619:22;6599:52;:::i;:::-;6589:62;;6545:116;6473:195;;;;:::o;6674:282::-;;6792:2;6780:9;6771:7;6767:23;6763:32;6760:2;;;6808:1;6805;6798:12;6760:2;6851:1;6876:63;6931:7;6922:6;6911:9;6907:22;6876:63;:::i;:::-;6866:73;;6822:127;6750:206;;;;:::o;6962:375::-;;7080:2;7068:9;7059:7;7055:23;7051:32;7048:2;;;7096:1;7093;7086:12;7048:2;7167:1;7156:9;7152:17;7139:31;7197:18;7189:6;7186:30;7183:2;;;7229:1;7226;7219:12;7183:2;7257:63;7312:7;7303:6;7292:9;7288:22;7257:63;:::i;:::-;7247:73;;7110:220;7038:299;;;;:::o;7343:262::-;;7451:2;7439:9;7430:7;7426:23;7422:32;7419:2;;;7467:1;7464;7457:12;7419:2;7510:1;7535:53;7580:7;7571:6;7560:9;7556:22;7535:53;:::i;:::-;7525:63;;7481:117;7409:196;;;;:::o;7611:118::-;7698:24;7716:5;7698:24;:::i;:::-;7693:3;7686:37;7676:53;;:::o;7735:109::-;7816:21;7831:5;7816:21;:::i;:::-;7811:3;7804:34;7794:50;;:::o;7850:360::-;;7964:38;7996:5;7964:38;:::i;:::-;8018:70;8081:6;8076:3;8018:70;:::i;:::-;8011:77;;8097:52;8142:6;8137:3;8130:4;8123:5;8119:16;8097:52;:::i;:::-;8174:29;8196:6;8174:29;:::i;:::-;8169:3;8165:39;8158:46;;7940:270;;;;;:::o;8216:364::-;;8332:39;8365:5;8332:39;:::i;:::-;8387:71;8451:6;8446:3;8387:71;:::i;:::-;8380:78;;8467:52;8512:6;8507:3;8500:4;8493:5;8489:16;8467:52;:::i;:::-;8544:29;8566:6;8544:29;:::i;:::-;8539:3;8535:39;8528:46;;8308:272;;;;;:::o;8586:377::-;;8720:39;8753:5;8720:39;:::i;:::-;8775:89;8857:6;8852:3;8775:89;:::i;:::-;8768:96;;8873:52;8918:6;8913:3;8906:4;8899:5;8895:16;8873:52;:::i;:::-;8950:6;8945:3;8941:16;8934:23;;8696:267;;;;;:::o;8969:318::-;;9132:67;9196:2;9191:3;9132:67;:::i;:::-;9125:74;;9229:22;9225:1;9220:3;9216:11;9209:43;9278:2;9273:3;9269:12;9262:19;;9115:172;;;:::o;9293:313::-;;9456:67;9520:2;9515:3;9456:67;:::i;:::-;9449:74;;9553:17;9549:1;9544:3;9540:11;9533:38;9597:2;9592:3;9588:12;9581:19;;9439:167;;;:::o;9612:375::-;;9775:67;9839:2;9834:3;9775:67;:::i;:::-;9768:74;;9872:34;9868:1;9863:3;9859:11;9852:55;9938:13;9933:2;9928:3;9924:12;9917:35;9978:2;9973:3;9969:12;9962:19;;9758:229;;;:::o;9993:382::-;;10156:67;10220:2;10215:3;10156:67;:::i;:::-;10149:74;;10253:34;10249:1;10244:3;10240:11;10233:55;10319:20;10314:2;10309:3;10305:12;10298:42;10366:2;10361:3;10357:12;10350:19;;10139:236;;;:::o;10381:370::-;;10544:67;10608:2;10603:3;10544:67;:::i;:::-;10537:74;;10641:34;10637:1;10632:3;10628:11;10621:55;10707:8;10702:2;10697:3;10693:12;10686:30;10742:2;10737:3;10733:12;10726:19;;10527:224;;;:::o;10757:326::-;;10920:67;10984:2;10979:3;10920:67;:::i;:::-;10913:74;;11017:30;11013:1;11008:3;11004:11;10997:51;11074:2;11069:3;11065:12;11058:19;;10903:180;;;:::o;11089:368::-;;11252:67;11316:2;11311:3;11252:67;:::i;:::-;11245:74;;11349:34;11345:1;11340:3;11336:11;11329:55;11415:6;11410:2;11405:3;11401:12;11394:28;11448:2;11443:3;11439:12;11432:19;;11235:222;;;:::o;11463:323::-;;11626:67;11690:2;11685:3;11626:67;:::i;:::-;11619:74;;11723:27;11719:1;11714:3;11710:11;11703:48;11777:2;11772:3;11768:12;11761:19;;11609:177;;;:::o;11792:376::-;;11955:67;12019:2;12014:3;11955:67;:::i;:::-;11948:74;;12052:34;12048:1;12043:3;12039:11;12032:55;12118:14;12113:2;12108:3;12104:12;12097:36;12159:2;12154:3;12150:12;12143:19;;11938:230;;;:::o;12174:314::-;;12337:67;12401:2;12396:3;12337:67;:::i;:::-;12330:74;;12434:18;12430:1;12425:3;12421:11;12414:39;12479:2;12474:3;12470:12;12463:19;;12320:168;;;:::o;12494:388::-;;12657:67;12721:2;12716:3;12657:67;:::i;:::-;12650:74;;12754:34;12750:1;12745:3;12741:11;12734:55;12820:26;12815:2;12810:3;12806:12;12799:48;12873:2;12868:3;12864:12;12857:19;;12640:242;;;:::o;12888:396::-;;13051:67;13115:2;13110:3;13051:67;:::i;:::-;13044:74;;13148:34;13144:1;13139:3;13135:11;13128:55;13214:34;13209:2;13204:3;13200:12;13193:56;13275:2;13270:3;13266:12;13259:19;;13034:250;;;:::o;13290:329::-;;13453:67;13517:2;13512:3;13453:67;:::i;:::-;13446:74;;13550:33;13546:1;13541:3;13537:11;13530:54;13610:2;13605:3;13601:12;13594:19;;13436:183;;;:::o;13625:374::-;;13788:67;13852:2;13847:3;13788:67;:::i;:::-;13781:74;;13885:34;13881:1;13876:3;13872:11;13865:55;13951:12;13946:2;13941:3;13937:12;13930:34;13990:2;13985:3;13981:12;13974:19;;13771:228;;;:::o;14005:373::-;;14168:67;14232:2;14227:3;14168:67;:::i;:::-;14161:74;;14265:34;14261:1;14256:3;14252:11;14245:55;14331:11;14326:2;14321:3;14317:12;14310:33;14369:2;14364:3;14360:12;14353:19;;14151:227;;;:::o;14384:330::-;;14547:67;14611:2;14606:3;14547:67;:::i;:::-;14540:74;;14644:34;14640:1;14635:3;14631:11;14624:55;14705:2;14700:3;14696:12;14689:19;;14530:184;;;:::o;14720:381::-;;14883:67;14947:2;14942:3;14883:67;:::i;:::-;14876:74;;14980:34;14976:1;14971:3;14967:11;14960:55;15046:19;15041:2;15036:3;15032:12;15025:41;15092:2;15087:3;15083:12;15076:19;;14866:235;;;:::o;15107:376::-;;15270:67;15334:2;15329:3;15270:67;:::i;:::-;15263:74;;15367:34;15363:1;15358:3;15354:11;15347:55;15433:14;15428:2;15423:3;15419:12;15412:36;15474:2;15469:3;15465:12;15458:19;;15253:230;;;:::o;15489:330::-;;15652:67;15716:2;15711:3;15652:67;:::i;:::-;15645:74;;15749:34;15745:1;15740:3;15736:11;15729:55;15810:2;15805:3;15801:12;15794:19;;15635:184;;;:::o;15825:373::-;;15988:67;16052:2;16047:3;15988:67;:::i;:::-;15981:74;;16085:34;16081:1;16076:3;16072:11;16065:55;16151:11;16146:2;16141:3;16137:12;16130:33;16189:2;16184:3;16180:12;16173:19;;15971:227;;;:::o;16204:379::-;;16367:67;16431:2;16426:3;16367:67;:::i;:::-;16360:74;;16464:34;16460:1;16455:3;16451:11;16444:55;16530:17;16525:2;16520:3;16516:12;16509:39;16574:2;16569:3;16565:12;16558:19;;16350:233;;;:::o;16589:365::-;;16752:67;16816:2;16811:3;16752:67;:::i;:::-;16745:74;;16849:34;16845:1;16840:3;16836:11;16829:55;16915:3;16910:2;16905:3;16901:12;16894:25;16945:2;16940:3;16936:12;16929:19;;16735:219;;;:::o;16960:317::-;;17123:67;17187:2;17182:3;17123:67;:::i;:::-;17116:74;;17220:21;17216:1;17211:3;17207:11;17200:42;17268:2;17263:3;17259:12;17252:19;;17106:171;;;:::o;17283:381::-;;17446:67;17510:2;17505:3;17446:67;:::i;:::-;17439:74;;17543:34;17539:1;17534:3;17530:11;17523:55;17609:19;17604:2;17599:3;17595:12;17588:41;17655:2;17650:3;17646:12;17639:19;;17429:235;;;:::o;17670:317::-;;17833:67;17897:2;17892:3;17833:67;:::i;:::-;17826:74;;17930:21;17926:1;17921:3;17917:11;17910:42;17978:2;17973:3;17969:12;17962:19;;17816:171;;;:::o;17993:376::-;;18156:67;18220:2;18215:3;18156:67;:::i;:::-;18149:74;;18253:34;18249:1;18244:3;18240:11;18233:55;18319:14;18314:2;18309:3;18305:12;18298:36;18360:2;18355:3;18351:12;18344:19;;18139:230;;;:::o;18375:379::-;;18538:67;18602:2;18597:3;18538:67;:::i;:::-;18531:74;;18635:34;18631:1;18626:3;18622:11;18615:55;18701:17;18696:2;18691:3;18687:12;18680:39;18745:2;18740:3;18736:12;18729:19;;18521:233;;;:::o;18760:380::-;;18923:67;18987:2;18982:3;18923:67;:::i;:::-;18916:74;;19020:34;19016:1;19011:3;19007:11;19000:55;19086:18;19081:2;19076:3;19072:12;19065:40;19131:2;19126:3;19122:12;19115:19;;18906:234;;;:::o;19146:118::-;19233:24;19251:5;19233:24;:::i;:::-;19228:3;19221:37;19211:53;;:::o;19270:435::-;;19472:95;19563:3;19554:6;19472:95;:::i;:::-;19465:102;;19584:95;19675:3;19666:6;19584:95;:::i;:::-;19577:102;;19696:3;19689:10;;19454:251;;;;;:::o;19711:222::-;;19842:2;19831:9;19827:18;19819:26;;19855:71;19923:1;19912:9;19908:17;19899:6;19855:71;:::i;:::-;19809:124;;;;:::o;19939:640::-;;20172:3;20161:9;20157:19;20149:27;;20186:71;20254:1;20243:9;20239:17;20230:6;20186:71;:::i;:::-;20267:72;20335:2;20324:9;20320:18;20311:6;20267:72;:::i;:::-;20349;20417:2;20406:9;20402:18;20393:6;20349:72;:::i;:::-;20468:9;20462:4;20458:20;20453:2;20442:9;20438:18;20431:48;20496:76;20567:4;20558:6;20496:76;:::i;:::-;20488:84;;20139:440;;;;;;;:::o;20585:210::-;;20710:2;20699:9;20695:18;20687:26;;20723:65;20785:1;20774:9;20770:17;20761:6;20723:65;:::i;:::-;20677:118;;;;:::o;20801:313::-;;20952:2;20941:9;20937:18;20929:26;;21001:9;20995:4;20991:20;20987:1;20976:9;20972:17;20965:47;21029:78;21102:4;21093:6;21029:78;:::i;:::-;21021:86;;20919:195;;;;:::o;21120:419::-;;21324:2;21313:9;21309:18;21301:26;;21373:9;21367:4;21363:20;21359:1;21348:9;21344:17;21337:47;21401:131;21527:4;21401:131;:::i;:::-;21393:139;;21291:248;;;:::o;21545:419::-;;21749:2;21738:9;21734:18;21726:26;;21798:9;21792:4;21788:20;21784:1;21773:9;21769:17;21762:47;21826:131;21952:4;21826:131;:::i;:::-;21818:139;;21716:248;;;:::o;21970:419::-;;22174:2;22163:9;22159:18;22151:26;;22223:9;22217:4;22213:20;22209:1;22198:9;22194:17;22187:47;22251:131;22377:4;22251:131;:::i;:::-;22243:139;;22141:248;;;:::o;22395:419::-;;22599:2;22588:9;22584:18;22576:26;;22648:9;22642:4;22638:20;22634:1;22623:9;22619:17;22612:47;22676:131;22802:4;22676:131;:::i;:::-;22668:139;;22566:248;;;:::o;22820:419::-;;23024:2;23013:9;23009:18;23001:26;;23073:9;23067:4;23063:20;23059:1;23048:9;23044:17;23037:47;23101:131;23227:4;23101:131;:::i;:::-;23093:139;;22991:248;;;:::o;23245:419::-;;23449:2;23438:9;23434:18;23426:26;;23498:9;23492:4;23488:20;23484:1;23473:9;23469:17;23462:47;23526:131;23652:4;23526:131;:::i;:::-;23518:139;;23416:248;;;:::o;23670:419::-;;23874:2;23863:9;23859:18;23851:26;;23923:9;23917:4;23913:20;23909:1;23898:9;23894:17;23887:47;23951:131;24077:4;23951:131;:::i;:::-;23943:139;;23841:248;;;:::o;24095:419::-;;24299:2;24288:9;24284:18;24276:26;;24348:9;24342:4;24338:20;24334:1;24323:9;24319:17;24312:47;24376:131;24502:4;24376:131;:::i;:::-;24368:139;;24266:248;;;:::o;24520:419::-;;24724:2;24713:9;24709:18;24701:26;;24773:9;24767:4;24763:20;24759:1;24748:9;24744:17;24737:47;24801:131;24927:4;24801:131;:::i;:::-;24793:139;;24691:248;;;:::o;24945:419::-;;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;25116:248;;;:::o;25370:419::-;;25574:2;25563:9;25559:18;25551:26;;25623:9;25617:4;25613:20;25609:1;25598:9;25594:17;25587:47;25651:131;25777:4;25651:131;:::i;:::-;25643:139;;25541:248;;;:::o;25795:419::-;;25999:2;25988:9;25984:18;25976:26;;26048:9;26042:4;26038:20;26034:1;26023:9;26019:17;26012:47;26076:131;26202:4;26076:131;:::i;:::-;26068:139;;25966:248;;;:::o;26220:419::-;;26424:2;26413:9;26409:18;26401:26;;26473:9;26467:4;26463:20;26459:1;26448:9;26444:17;26437:47;26501:131;26627:4;26501:131;:::i;:::-;26493:139;;26391:248;;;:::o;26645:419::-;;26849:2;26838:9;26834:18;26826:26;;26898:9;26892:4;26888:20;26884:1;26873:9;26869:17;26862:47;26926:131;27052:4;26926:131;:::i;:::-;26918:139;;26816:248;;;:::o;27070:419::-;;27274:2;27263:9;27259:18;27251:26;;27323:9;27317:4;27313:20;27309:1;27298:9;27294:17;27287:47;27351:131;27477:4;27351:131;:::i;:::-;27343:139;;27241:248;;;:::o;27495:419::-;;27699:2;27688:9;27684:18;27676:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27776:131;27902:4;27776:131;:::i;:::-;27768:139;;27666:248;;;:::o;27920:419::-;;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:131;28327:4;28201:131;:::i;:::-;28193:139;;28091:248;;;:::o;28345:419::-;;28549:2;28538:9;28534:18;28526:26;;28598:9;28592:4;28588:20;28584:1;28573:9;28569:17;28562:47;28626:131;28752:4;28626:131;:::i;:::-;28618:139;;28516:248;;;:::o;28770:419::-;;28974:2;28963:9;28959:18;28951:26;;29023:9;29017:4;29013:20;29009:1;28998:9;28994:17;28987:47;29051:131;29177:4;29051:131;:::i;:::-;29043:139;;28941:248;;;:::o;29195:419::-;;29399:2;29388:9;29384:18;29376:26;;29448:9;29442:4;29438:20;29434:1;29423:9;29419:17;29412:47;29476:131;29602:4;29476:131;:::i;:::-;29468:139;;29366:248;;;:::o;29620:419::-;;29824:2;29813:9;29809:18;29801:26;;29873:9;29867:4;29863:20;29859:1;29848:9;29844:17;29837:47;29901:131;30027:4;29901:131;:::i;:::-;29893:139;;29791:248;;;:::o;30045:419::-;;30249:2;30238:9;30234:18;30226:26;;30298:9;30292:4;30288:20;30284:1;30273:9;30269:17;30262:47;30326:131;30452:4;30326:131;:::i;:::-;30318:139;;30216:248;;;:::o;30470:419::-;;30674:2;30663:9;30659:18;30651:26;;30723:9;30717:4;30713:20;30709:1;30698:9;30694:17;30687:47;30751:131;30877:4;30751:131;:::i;:::-;30743:139;;30641:248;;;:::o;30895:419::-;;31099:2;31088:9;31084:18;31076:26;;31148:9;31142:4;31138:20;31134:1;31123:9;31119:17;31112:47;31176:131;31302:4;31176:131;:::i;:::-;31168:139;;31066:248;;;:::o;31320:419::-;;31524:2;31513:9;31509:18;31501:26;;31573:9;31567:4;31563:20;31559:1;31548:9;31544:17;31537:47;31601:131;31727:4;31601:131;:::i;:::-;31593:139;;31491:248;;;:::o;31745:419::-;;31949:2;31938:9;31934:18;31926:26;;31998:9;31992:4;31988:20;31984:1;31973:9;31969:17;31962:47;32026:131;32152:4;32026:131;:::i;:::-;32018:139;;31916:248;;;:::o;32170:419::-;;32374:2;32363:9;32359:18;32351:26;;32423:9;32417:4;32413:20;32409:1;32398:9;32394:17;32387:47;32451:131;32577:4;32451:131;:::i;:::-;32443:139;;32341:248;;;:::o;32595:419::-;;32799:2;32788:9;32784:18;32776:26;;32848:9;32842:4;32838:20;32834:1;32823:9;32819:17;32812:47;32876:131;33002:4;32876:131;:::i;:::-;32868:139;;32766:248;;;:::o;33020:222::-;;33151:2;33140:9;33136:18;33128:26;;33164:71;33232:1;33221:9;33217:17;33208:6;33164:71;:::i;:::-;33118:124;;;;:::o;33248:283::-;;33314:2;33308:9;33298:19;;33356:4;33348:6;33344:17;33463:6;33451:10;33448:22;33427:18;33415:10;33412:34;33409:62;33406:2;;;33474:18;;:::i;:::-;33406:2;33514:10;33510:2;33503:22;33288:243;;;;:::o;33537:311::-;;33704:18;33696:6;33693:30;33690:2;;;33726:18;;:::i;:::-;33690:2;33776:4;33768:6;33764:17;33756:25;;33836:4;33830;33826:15;33818:23;;33619:229;;;:::o;33854:331::-;;34005:18;33997:6;33994:30;33991:2;;;34027:18;;:::i;:::-;33991:2;34112:4;34108:9;34101:4;34093:6;34089:17;34085:33;34077:41;;34173:4;34167;34163:15;34155:23;;33920:265;;;:::o;34191:332::-;;34343:18;34335:6;34332:30;34329:2;;;34365:18;;:::i;:::-;34329:2;34450:4;34446:9;34439:4;34431:6;34427:17;34423:33;34415:41;;34511:4;34505;34501:15;34493:23;;34258:265;;;:::o;34529:98::-;;34614:5;34608:12;34598:22;;34587:40;;;:::o;34633:99::-;;34719:5;34713:12;34703:22;;34692:40;;;:::o;34738:168::-;;34855:6;34850:3;34843:19;34895:4;34890:3;34886:14;34871:29;;34833:73;;;;:::o;34912:169::-;;35030:6;35025:3;35018:19;35070:4;35065:3;35061:14;35046:29;;35008:73;;;;:::o;35087:148::-;;35226:3;35211:18;;35201:34;;;;:::o;35241:305::-;;35300:20;35318:1;35300:20;:::i;:::-;35295:25;;35334:20;35352:1;35334:20;:::i;:::-;35329:25;;35488:1;35420:66;35416:74;35413:1;35410:81;35407:2;;;35494:18;;:::i;:::-;35407:2;35538:1;35535;35531:9;35524:16;;35285:261;;;;:::o;35552:185::-;;35609:20;35627:1;35609:20;:::i;:::-;35604:25;;35643:20;35661:1;35643:20;:::i;:::-;35638:25;;35682:1;35672:2;;35687:18;;:::i;:::-;35672:2;35729:1;35726;35722:9;35717:14;;35594:143;;;;:::o;35743:348::-;;35806:20;35824:1;35806:20;:::i;:::-;35801:25;;35840:20;35858:1;35840:20;:::i;:::-;35835:25;;36028:1;35960:66;35956:74;35953:1;35950:81;35945:1;35938:9;35931:17;35927:105;35924:2;;;36035:18;;:::i;:::-;35924:2;36083:1;36080;36076:9;36065:20;;35791:300;;;;:::o;36097:191::-;;36157:20;36175:1;36157:20;:::i;:::-;36152:25;;36191:20;36209:1;36191:20;:::i;:::-;36186:25;;36230:1;36227;36224:8;36221:2;;;36235:18;;:::i;:::-;36221:2;36280:1;36277;36273:9;36265:17;;36142:146;;;;:::o;36294:96::-;;36360:24;36378:5;36360:24;:::i;:::-;36349:35;;36339:51;;;:::o;36396:90::-;;36473:5;36466:13;36459:21;36448:32;;36438:48;;;:::o;36492:149::-;;36568:66;36561:5;36557:78;36546:89;;36536:105;;;:::o;36647:126::-;;36724:42;36717:5;36713:54;36702:65;;36692:81;;;:::o;36779:77::-;;36845:5;36834:16;;36824:32;;;:::o;36862:154::-;36946:6;36941:3;36936;36923:30;37008:1;36999:6;36994:3;36990:16;36983:27;36913:103;;;:::o;37022:307::-;37090:1;37100:113;37114:6;37111:1;37108:13;37100:113;;;37199:1;37194:3;37190:11;37184:18;37180:1;37175:3;37171:11;37164:39;37136:2;37133:1;37129:10;37124:15;;37100:113;;;37231:6;37228:1;37225:13;37222:2;;;37311:1;37302:6;37297:3;37293:16;37286:27;37222:2;37071:258;;;;:::o;37335:320::-;;37416:1;37410:4;37406:12;37396:22;;37463:1;37457:4;37453:12;37484:18;37474:2;;37540:4;37532:6;37528:17;37518:27;;37474:2;37602;37594:6;37591:14;37571:18;37568:38;37565:2;;;37621:18;;:::i;:::-;37565:2;37386:269;;;;:::o;37661:233::-;;37723:24;37741:5;37723:24;:::i;:::-;37714:33;;37769:66;37762:5;37759:77;37756:2;;;37839:18;;:::i;:::-;37756:2;37886:1;37879:5;37875:13;37868:20;;37704:190;;;:::o;37900:176::-;;37949:20;37967:1;37949:20;:::i;:::-;37944:25;;37983:20;38001:1;37983:20;:::i;:::-;37978:25;;38022:1;38012:2;;38027:18;;:::i;:::-;38012:2;38068:1;38065;38061:9;38056:14;;37934:142;;;;:::o;38082:180::-;38130:77;38127:1;38120:88;38227:4;38224:1;38217:15;38251:4;38248:1;38241:15;38268:180;38316:77;38313:1;38306:88;38413:4;38410:1;38403:15;38437:4;38434:1;38427:15;38454:180;38502:77;38499:1;38492:88;38599:4;38596:1;38589:15;38623:4;38620:1;38613:15;38640:180;38688:77;38685:1;38678:88;38785:4;38782:1;38775:15;38809:4;38806:1;38799:15;38826:102;;38918:2;38914:7;38909:2;38902:5;38898:14;38894:28;38884:38;;38874:54;;;:::o;38934:122::-;39007:24;39025:5;39007:24;:::i;:::-;39000:5;38997:35;38987:2;;39046:1;39043;39036:12;38987:2;38977:79;:::o;39062:116::-;39132:21;39147:5;39132:21;:::i;:::-;39125:5;39122:32;39112:2;;39168:1;39165;39158:12;39112:2;39102:76;:::o;39184:120::-;39256:23;39273:5;39256:23;:::i;:::-;39249:5;39246:34;39236:2;;39294:1;39291;39284:12;39236:2;39226:78;:::o;39310:122::-;39383:24;39401:5;39383:24;:::i;:::-;39376:5;39373:35;39363:2;;39422:1;39419;39412:12;39363:2;39353:79;:::o

Swarm Source

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