ETH Price: $3,472.17 (+2.10%)

Token

Raccoon Secret Society (RSS)
 

Overview

Max Total Supply

10,000 RSS

Holders

3,143

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RSS
0xdcc411849bde3c4d501ced1ba3dc028bce74b452
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

All Raccoons are randomly generated from 150 traits. Some of them are rarer then the others.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RaccoonSecretSociety

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-11
*/

// File: openzeppelin-solidity/contracts/utils/introspection/IERC165.sol

pragma solidity ^0.8.0;

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

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;

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

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

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

// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

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

// File: openzeppelin-solidity/contracts/utils/Context.sol

pragma solidity ^0.8.0;

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

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

// File: openzeppelin-solidity/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

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

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

// File: openzeppelin-solidity/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;

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

// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: openzeppelin-solidity/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/IERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

// File: openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/RSS.sol

/**
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.      'l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0c.          .l0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk.   .:lool;.   'kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0'   :KWMMMMWO'   ,0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx.  .OMMMMMMMWd   .kMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMO.  .oNMMMMMMK;   .OMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNo.   ,okkkxl'   .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx'            ,kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNNXkc,......,lkXWWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0:;d0XNXKKKKXWWKx::0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMWk'    .,clox0WNd.   'kWMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMNd.         ckKKc      .dNMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMXl.        .dNMXc        .lXMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMK:         ,OWMMWO,         :KMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMW0,         cKMMMMMMK:         ,0WMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMWk'        .oNMMMMMMMMNo.        'kWMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMNd.      ..;kWMMMMMMMMMMWk;..      .dNMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMXl.    'lkKXNWMMMMMMMMMMMMWNXKkl'    .lXMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMK:    .oXMMMMMMMMMMMMMMMMMMMMMMMMXo.    :KMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMW0,    .xWMMMMMMMMMMMMMMMMMMMMMMMMMMWx.    ,0WMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMWk'     .,:cdOXNNK0OOkkkkkkOO0XNNXOdc;,.     'kWMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMNd.    .       .'...          ..''.      ..    .dNMMMMMMMMMMMMMMM
ONMMMMMMMMMMMMXl.    :x;                                :k:    .lXMMMMMMMMMMMWX0
.'dKWMMMMMMMMK:     ,l:.                                .cl,     :KMMMMMMMMW0l.,
.  .l0WMMMMW0,     ..    ..;cloddolc'      ,cloddolc;.     ..     ,OWMMMMNOc.  '
.    .:ONMWk.     ..  .;d0NWMMMMMMMMNo.  .dNMMMMMMMMWX0d,   ..     .kWMXx;.    '
.      .;dl.    .;'. 'xNMMMMMMMMMMMMM0'  ,KMMMMMMMMMMMMMNx. .';.    .dXx.      ,
.    .         ,0WN0k0Odoodk0XWMMMMMMk.  'OMMMMMMWX0kdood00kKNWO,    .l0o..    ,
x,...         ;KMMMMMWXkc.  ..;ok00Od'    ,xO00kl;..  .ckNMMMMMMO'     :Ox'...;k
MNO:.        ;clONMMMMMMWXx;.     .          .     .:xXWMMMMMMXx;       ,Ok;l0WM
MMMNk'     'c:. .;xXMMMMMMMW0o,.                .;dKWMMMMMMWKd'          .xNWMMM
MMMNd.  .;l:.      'oKWMMMMMMMNOl,   'xOOd'  .,o0WMMMMMMMW0l.             .dNMMM
MMXl. 'o0Kc..        .l0WMMMMMMMMNOl'.';;'.,oONMMMMMMMMNO:.       ...;xOo' .lXMM
MK:.;xXMMMNOc.     .   .:kNMMMMMMMMMNklccoONMMMMMMMMMXx;.         .l0NMMWXx;.:KM
0llOWMMMMMMMNO:. ...      ,xXMMMMMMMMMMMMMMMMMMMMMWKo'      ... .l0WMMMMMMMWOll0
KXWMMMMMMMMMMMW0d;          'oKWMMMMMMMMMMMMMMMMW0l.         .:xKWMMMMMMMMMMMWXK
MMMMMMMMMMMMMMMMWKd'.         .l0WMMMMMMMMMMMMNk:.         .,xXMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMNk:.    ..   .:kNMMMMMMMMXx;    .     .lONMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMNO:....       ,xXMMMWKo'       ....c0WMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMWKd'          'oxxl.          ,xXWMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMWKo,..                  ..;xXWMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMNk;    ..      ..   .cONMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNk:'..        ..'c0WMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKl.        'dXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKo'    ,dXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0:.'lXWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
*/

pragma solidity ^0.8.0;

/**
 * @title RaccoonSecretSociety contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract RaccoonSecretSociety is ERC721, ERC721Enumerable, Ownable {
    using Strings for uint256;
    
    uint256 public constant tokenPrice = 20000000000000000; // 0.02 ETH
    uint public constant maxTokenPurchase = 10;
    uint256 public MAX_TOKENS = 10000;
    bool public allowNewMembers = false;
    uint256 public harbingerSeed;
    address public harbingerContract;
    uint256 public REVEAL_TIMESTAMP = 1630108800;
    mapping (uint256 => bool) private _renouncedHarbingers;
    string private _baseURIextended;

    constructor() ERC721("Raccoon Secret Society", "RSS") {
    }

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

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

    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }
    
    function setHarbingerContractAddress(address harbingerContract_) external onlyOwner {
        harbingerContract = harbingerContract_;
    }

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

    function reserveTokens(uint numberOfTokens) public onlyOwner {
        uint supply = totalSupply();
        require(supply + numberOfTokens <= MAX_TOKENS, "Reserve would exceed max supply of tokens");
        uint mintIndex;
        for (mintIndex = supply + 1; mintIndex <= supply + numberOfTokens; mintIndex++) {
            _safeMint(msg.sender, mintIndex);
        }
    }
    
    function flipSaleState() public onlyOwner {
        allowNewMembers = !allowNewMembers;
    }
    
    function setRevealTimestamp(uint256 timestamp) public onlyOwner {
        REVEAL_TIMESTAMP = timestamp;   
    }
    
    function initiate(uint numberOfTokens) public payable {
        require(allowNewMembers, "The society does not accept new members at the time");
        require(numberOfTokens <= maxTokenPurchase, "Exceeded max token purchase");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS, "Purchase would exceed max supply of tokens");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            if (totalSupply() < MAX_TOKENS) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        
        if (harbingerSeed == 0 && (totalSupply() == MAX_TOKENS || block.timestamp >= REVEAL_TIMESTAMP)) {
            harbingerSeed = block.number % MAX_TOKENS;
            if (harbingerSeed == 0) {
                harbingerSeed = harbingerSeed + 1;
            }
        }
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    function isHarbinger(uint256 tokenId) public view returns (bool) {
        require(_exists(tokenId));
        uint256 harbingerId = (tokenId + harbingerSeed) % MAX_TOKENS + 1;
        return harbingerSeed != 0 && harbingerId % 10 == 0 && !_renouncedHarbingers[harbingerId];
    }
    
    function isHarbingerExternal(uint256 tokenId) external view returns (bool) {
        return isHarbinger(tokenId);
    }
    
    function ritualCheck(uint256 token1, uint256 token2, uint256 token3) external view returns (bool) {
        return isHarbinger(token1) && isHarbinger(token2) && isHarbinger(token3);   
    }
    
    function renounceHarbinger(uint256 tokenId) external {
        address owner = ownerOf(tokenId);
        require(isHarbinger(tokenId), "Token is not a Harbinger");
        require(msg.sender == owner || (harbingerContract != address(0) && msg.sender == harbingerContract), "You don't own this token");
        
        _renouncedHarbingers[(tokenId + harbingerSeed) % MAX_TOKENS + 1] = true;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (harbingerSeed != 0) {
            tokenId = isHarbinger(tokenId) ? tokenId + MAX_TOKENS : tokenId;
        }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowNewMembers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"flipSaleState","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":[],"name":"harbingerContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harbingerSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"initiate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isHarbinger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isHarbingerExternal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"renounceHarbinger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token1","type":"uint256"},{"internalType":"uint256","name":"token2","type":"uint256"},{"internalType":"uint256","name":"token3","type":"uint256"}],"name":"ritualCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"harbingerContract_","type":"address"}],"name":"setHarbingerContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"name":"tokenPrice","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055506361297c80600f553480156200003a57600080fd5b506040518060400160405280601681526020017f526163636f6f6e2053656372657420536f6369657479000000000000000000008152506040518060400160405280600381526020017f52535300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bf929190620001cf565b508060019080519060200190620000d8929190620001cf565b505050620000fb620000ef6200010160201b60201c565b6200010960201b60201c565b620002e4565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001dd906200027f565b90600052602060002090601f0160209004810192826200020157600085556200024d565b82601f106200021c57805160ff19168380011785556200024d565b828001600101855582156200024d579182015b828111156200024c5782518255916020019190600101906200022f565b5b5090506200025c919062000260565b5090565b5b808211156200027b57600081600090555060010162000261565b5090565b600060028204905060018216806200029857607f821691505b60208210811415620002af57620002ae620002b5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61476080620002f46000396000f3fe60806040526004361061021a5760003560e01c806355f804b3116101235780639a936509116100ab578063d031370b1161006f578063d031370b146107d8578063dd5e75a214610801578063e985e9c51461082a578063f2fde38b14610867578063f47c84c5146108905761021a565b80639a936509146106f5578063a22cb46514610720578063afa5547214610749578063b88d4fde14610772578063c87b56dd1461079b5761021a565b80637901ea78116100f25780637901ea781461062d5780637ff9b596146106495780638da5cb5b146106745780639303cd611461069f57806395d89b41146106ca5761021a565b806355f804b3146105735780636352211e1461059c57806370a08231146105d9578063715018a6146106165761021a565b80632da74fa0116101a65780633ccfd60b116101755780633ccfd60b1461047c57806342842e0e1461049357806346cfbef8146104bc5780634f6ccce7146104f95780634f849475146105365761021a565b80632da74fa0146103c05780632f745c59146103eb57806334918dfd146104285780633ab6b7361461043f5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806309aa3dcf1461031657806318160ddd1461034157806318e20a381461036c57806323b872dd146103975761021a565b8063018a2c371461021f57806301ffc9a71461024857806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613352565b6108bb565b005b34801561025457600080fd5b5061026f600480360381019061026a91906132bf565b610941565b60405161027c9190613890565b60405180910390f35b34801561029157600080fd5b5061029a610953565b6040516102a791906138ab565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613352565b6109e5565b6040516102e49190613829565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613283565b610a6a565b005b34801561032257600080fd5b5061032b610b82565b6040516103389190613bed565b60405180910390f35b34801561034d57600080fd5b50610356610b87565b6040516103639190613bed565b60405180910390f35b34801561037857600080fd5b50610381610b94565b60405161038e9190613bed565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061317d565b610b9a565b005b3480156103cc57600080fd5b506103d5610bfa565b6040516103e29190613890565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613283565b610c0d565b60405161041f9190613bed565b60405180910390f35b34801561043457600080fd5b5061043d610cb2565b005b34801561044b57600080fd5b5061046660048036038101906104619190613352565b610d5a565b6040516104739190613890565b60405180910390f35b34801561048857600080fd5b50610491610d6c565b005b34801561049f57600080fd5b506104ba60048036038101906104b5919061317d565b610e37565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613352565b610e57565b6040516104f09190613890565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613352565b610ee7565b60405161052d9190613bed565b60405180910390f35b34801561054257600080fd5b5061055d6004803603810190610558919061337b565b610f7e565b60405161056a9190613890565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613311565b610fb4565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613352565b61104a565b6040516105d09190613829565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613118565b6110fc565b60405161060d9190613bed565b60405180910390f35b34801561062257600080fd5b5061062b6111b4565b005b61064760048036038101906106429190613352565b61123c565b005b34801561065557600080fd5b5061065e611434565b60405161066b9190613bed565b60405180910390f35b34801561068057600080fd5b5061068961143f565b6040516106969190613829565b60405180910390f35b3480156106ab57600080fd5b506106b4611469565b6040516106c19190613829565b60405180910390f35b3480156106d657600080fd5b506106df61148f565b6040516106ec91906138ab565b60405180910390f35b34801561070157600080fd5b5061070a611521565b6040516107179190613bed565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613247565b611527565b005b34801561075557600080fd5b50610770600480360381019061076b9190613118565b6116a8565b005b34801561077e57600080fd5b50610799600480360381019061079491906131cc565b611768565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190613352565b6117ca565b6040516107cf91906138ab565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613352565b6118a0565b005b34801561080d57600080fd5b5061082860048036038101906108239190613352565b6119be565b005b34801561083657600080fd5b50610851600480360381019061084c9190613141565b611b8a565b60405161085e9190613890565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613118565b611c1e565b005b34801561089c57600080fd5b506108a5611d16565b6040516108b29190613bed565b60405180910390f35b6108c3611d1c565b73ffffffffffffffffffffffffffffffffffffffff166108e161143f565b73ffffffffffffffffffffffffffffffffffffffff1614610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613acd565b60405180910390fd5b80600f8190555050565b600061094c82611d24565b9050919050565b60606000805461096290613e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90613e9d565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b60006109f082611d9e565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690613aad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a758261104a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613b2d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b05611d1c565b73ffffffffffffffffffffffffffffffffffffffff161480610b345750610b3381610b2e611d1c565b611b8a565b5b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906139cd565b60405180910390fd5b610b7d8383611e0a565b505050565b600a81565b6000600880549050905090565b600f5481565b610bab610ba5611d1c565b82611ec3565b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613b8d565b60405180910390fd5b610bf5838383611fa1565b505050565b600c60009054906101000a900460ff1681565b6000610c18836110fc565b8210610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906138cd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cba611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610cd861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590613acd565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000610d6582610e57565b9050919050565b610d74611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610d9261143f565b73ffffffffffffffffffffffffffffffffffffffff1614610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90613acd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e33573d6000803e3d6000fd5b5050565b610e5283838360405180602001604052806000815250611768565b505050565b6000610e6282611d9e565b610e6b57600080fd5b60006001600b54600d5485610e809190613cd2565b610e8a9190613f49565b610e949190613cd2565b90506000600d5414158015610eb557506000600a82610eb39190613f49565b145b8015610edf57506010600082815260200190815260200160002060009054906101000a900460ff16155b915050919050565b6000610ef1610b87565b8210610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990613bad565b60405180910390fd5b60088281548110610f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610f8984610e57565b8015610f9a5750610f9983610e57565b5b8015610fab5750610faa82610e57565b5b90509392505050565b610fbc611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610fda61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790613acd565b60405180910390fd5b8060119080519060200190611046929190612f3c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613a2d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611164906139ed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111bc611d1c565b73ffffffffffffffffffffffffffffffffffffffff166111da61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613acd565b60405180910390fd5b61123a60006121fd565b565b600c60009054906101000a900460ff1661128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290613a8d565b60405180910390fd5b600a8111156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690613b4d565b60405180910390fd5b600b54816112db610b87565b6112e59190613cd2565b1115611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613a4d565b60405180910390fd5b348166470de4df82000061133a9190613d59565b111561137b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113729061398d565b60405180910390fd5b60005b818110156113ce5760006001611392610b87565b61139c9190613cd2565b9050600b546113a9610b87565b10156113ba576113b933826122c3565b5b5080806113c690613f00565b91505061137e565b506000600d541480156113f65750600b546113e7610b87565b14806113f55750600f544210155b5b1561143157600b54436114099190613f49565b600d819055506000600d541415611430576001600d546114299190613cd2565b600d819055505b5b50565b66470de4df82000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461149e90613e9d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca90613e9d565b80156115175780601f106114ec57610100808354040283529160200191611517565b820191906000526020600020905b8154815290600101906020018083116114fa57829003601f168201915b5050505050905090565b600d5481565b61152f611d1c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561159d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115949061396d565b60405180910390fd5b80600560006115aa611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611657611d1c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190613890565b60405180910390a35050565b6116b0611d1c565b73ffffffffffffffffffffffffffffffffffffffff166116ce61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613acd565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611779611773611d1c565b83611ec3565b6117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af90613b8d565b60405180910390fd5b6117c4848484846122e1565b50505050565b60606117d582611d9e565b611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90613b0d565b60405180910390fd5b6000600d54146118435761182782610e57565b6118315781611840565b600b548261183f9190613cd2565b5b91505b600061184d61233d565b9050600081511161186d5760405180602001604052806000815250611898565b80611877846123cf565b604051602001611888929190613805565b6040516020818303038152906040525b915050919050565b6118a8611d1c565b73ffffffffffffffffffffffffffffffffffffffff166118c661143f565b73ffffffffffffffffffffffffffffffffffffffff161461191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191390613acd565b60405180910390fd5b6000611926610b87565b9050600b5482826119379190613cd2565b1115611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613bcd565b60405180910390fd5b60006001826119879190613cd2565b90505b82826119969190613cd2565b81116119b9576119a633826122c3565b80806119b190613f00565b91505061198a565b505050565b60006119c98261104a565b90506119d482610e57565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90613b6d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611af55750600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611af45750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b5b611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90613a0d565b60405180910390fd5b6001601060006001600b54600d5487611b4d9190613cd2565b611b579190613f49565b611b619190613cd2565b815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c26611d1c565b73ffffffffffffffffffffffffffffffffffffffff16611c4461143f565b73ffffffffffffffffffffffffffffffffffffffff1614611c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9190613acd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d019061390d565b60405180910390fd5b611d13816121fd565b50565b600b5481565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d975750611d968261257c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7d8361104a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ece82611d9e565b611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f04906139ad565b60405180910390fd5b6000611f188361104a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f8757508373ffffffffffffffffffffffffffffffffffffffff16611f6f846109e5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f985750611f978185611b8a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fc18261104a565b73ffffffffffffffffffffffffffffffffffffffff1614612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e90613aed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e9061394d565b60405180910390fd5b61209283838361265e565b61209d600082611e0a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ed9190613db3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121449190613cd2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122dd82826040518060200160405280600081525061266e565b5050565b6122ec848484611fa1565b6122f8848484846126c9565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e906138ed565b60405180910390fd5b50505050565b60606011805461234c90613e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461237890613e9d565b80156123c55780601f1061239a576101008083540402835291602001916123c5565b820191906000526020600020905b8154815290600101906020018083116123a857829003601f168201915b5050505050905090565b60606000821415612417576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612577565b600082905060005b6000821461244957808061243290613f00565b915050600a826124429190613d28565b915061241f565b60008167ffffffffffffffff81111561248b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b60008514612570576001826124d69190613db3565b9150600a856124e59190613f49565b60306124f19190613cd2565b60f81b81838151811061252d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125699190613d28565b94506124c1565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612657575061265682612860565b5b9050919050565b6126698383836128ca565b505050565b61267883836129de565b61268560008484846126c9565b6126c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bb906138ed565b60405180910390fd5b505050565b60006126ea8473ffffffffffffffffffffffffffffffffffffffff16612bac565b15612853578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612713611d1c565b8786866040518563ffffffff1660e01b81526004016127359493929190613844565b602060405180830381600087803b15801561274f57600080fd5b505af192505050801561278057506040513d601f19601f8201168201806040525081019061277d91906132e8565b60015b612803573d80600081146127b0576040519150601f19603f3d011682016040523d82523d6000602084013e6127b5565b606091505b506000815114156127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f2906138ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612858565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d5838383612bbf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129185761291381612bc4565b612957565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612956576129558382612c0d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299a5761299581612d7a565b6129d9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d8576129d78282612ebd565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590613a6d565b60405180910390fd5b612a5781611d9e565b15612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e9061392d565b60405180910390fd5b612aa36000838361265e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af39190613cd2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1a846110fc565b612c249190613db3565b9050600060076000848152602001908152602001600020549050818114612d09576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8e9190613db3565b9050600060096000848152602001908152602001600020549050600060088381548110612de4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ec8836110fc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f4890613e9d565b90600052602060002090601f016020900481019282612f6a5760008555612fb1565b82601f10612f8357805160ff1916838001178555612fb1565b82800160010185558215612fb1579182015b82811115612fb0578251825591602001919060010190612f95565b5b509050612fbe9190612fc2565b5090565b5b80821115612fdb576000816000905550600101612fc3565b5090565b6000612ff2612fed84613c2d565b613c08565b90508281526020810184848401111561300a57600080fd5b613015848285613e5b565b509392505050565b600061303061302b84613c5e565b613c08565b90508281526020810184848401111561304857600080fd5b613053848285613e5b565b509392505050565b60008135905061306a816146ce565b92915050565b60008135905061307f816146e5565b92915050565b600081359050613094816146fc565b92915050565b6000815190506130a9816146fc565b92915050565b600082601f8301126130c057600080fd5b81356130d0848260208601612fdf565b91505092915050565b600082601f8301126130ea57600080fd5b81356130fa84826020860161301d565b91505092915050565b60008135905061311281614713565b92915050565b60006020828403121561312a57600080fd5b60006131388482850161305b565b91505092915050565b6000806040838503121561315457600080fd5b60006131628582860161305b565b92505060206131738582860161305b565b9150509250929050565b60008060006060848603121561319257600080fd5b60006131a08682870161305b565b93505060206131b18682870161305b565b92505060406131c286828701613103565b9150509250925092565b600080600080608085870312156131e257600080fd5b60006131f08782880161305b565b94505060206132018782880161305b565b935050604061321287828801613103565b925050606085013567ffffffffffffffff81111561322f57600080fd5b61323b878288016130af565b91505092959194509250565b6000806040838503121561325a57600080fd5b60006132688582860161305b565b925050602061327985828601613070565b9150509250929050565b6000806040838503121561329657600080fd5b60006132a48582860161305b565b92505060206132b585828601613103565b9150509250929050565b6000602082840312156132d157600080fd5b60006132df84828501613085565b91505092915050565b6000602082840312156132fa57600080fd5b60006133088482850161309a565b91505092915050565b60006020828403121561332357600080fd5b600082013567ffffffffffffffff81111561333d57600080fd5b613349848285016130d9565b91505092915050565b60006020828403121561336457600080fd5b600061337284828501613103565b91505092915050565b60008060006060848603121561339057600080fd5b600061339e86828701613103565b93505060206133af86828701613103565b92505060406133c086828701613103565b9150509250925092565b6133d381613de7565b82525050565b6133e281613df9565b82525050565b60006133f382613c8f565b6133fd8185613ca5565b935061340d818560208601613e6a565b61341681614036565b840191505092915050565b600061342c82613c9a565b6134368185613cb6565b9350613446818560208601613e6a565b61344f81614036565b840191505092915050565b600061346582613c9a565b61346f8185613cc7565b935061347f818560208601613e6a565b80840191505092915050565b6000613498602b83613cb6565b91506134a382614047565b604082019050919050565b60006134bb603283613cb6565b91506134c682614096565b604082019050919050565b60006134de602683613cb6565b91506134e9826140e5565b604082019050919050565b6000613501601c83613cb6565b915061350c82614134565b602082019050919050565b6000613524602483613cb6565b915061352f8261415d565b604082019050919050565b6000613547601983613cb6565b9150613552826141ac565b602082019050919050565b600061356a601f83613cb6565b9150613575826141d5565b602082019050919050565b600061358d602c83613cb6565b9150613598826141fe565b604082019050919050565b60006135b0603883613cb6565b91506135bb8261424d565b604082019050919050565b60006135d3602a83613cb6565b91506135de8261429c565b604082019050919050565b60006135f6601883613cb6565b9150613601826142eb565b602082019050919050565b6000613619602983613cb6565b915061362482614314565b604082019050919050565b600061363c602a83613cb6565b915061364782614363565b604082019050919050565b600061365f602083613cb6565b915061366a826143b2565b602082019050919050565b6000613682603383613cb6565b915061368d826143db565b604082019050919050565b60006136a5602c83613cb6565b91506136b08261442a565b604082019050919050565b60006136c8602083613cb6565b91506136d382614479565b602082019050919050565b60006136eb602983613cb6565b91506136f6826144a2565b604082019050919050565b600061370e602f83613cb6565b9150613719826144f1565b604082019050919050565b6000613731602183613cb6565b915061373c82614540565b604082019050919050565b6000613754601b83613cb6565b915061375f8261458f565b602082019050919050565b6000613777601883613cb6565b9150613782826145b8565b602082019050919050565b600061379a603183613cb6565b91506137a5826145e1565b604082019050919050565b60006137bd602c83613cb6565b91506137c882614630565b604082019050919050565b60006137e0602983613cb6565b91506137eb8261467f565b604082019050919050565b6137ff81613e51565b82525050565b6000613811828561345a565b915061381d828461345a565b91508190509392505050565b600060208201905061383e60008301846133ca565b92915050565b600060808201905061385960008301876133ca565b61386660208301866133ca565b61387360408301856137f6565b818103606083015261388581846133e8565b905095945050505050565b60006020820190506138a560008301846133d9565b92915050565b600060208201905081810360008301526138c58184613421565b905092915050565b600060208201905081810360008301526138e68161348b565b9050919050565b60006020820190508181036000830152613906816134ae565b9050919050565b60006020820190508181036000830152613926816134d1565b9050919050565b60006020820190508181036000830152613946816134f4565b9050919050565b6000602082019050818103600083015261396681613517565b9050919050565b600060208201905081810360008301526139868161353a565b9050919050565b600060208201905081810360008301526139a68161355d565b9050919050565b600060208201905081810360008301526139c681613580565b9050919050565b600060208201905081810360008301526139e6816135a3565b9050919050565b60006020820190508181036000830152613a06816135c6565b9050919050565b60006020820190508181036000830152613a26816135e9565b9050919050565b60006020820190508181036000830152613a468161360c565b9050919050565b60006020820190508181036000830152613a668161362f565b9050919050565b60006020820190508181036000830152613a8681613652565b9050919050565b60006020820190508181036000830152613aa681613675565b9050919050565b60006020820190508181036000830152613ac681613698565b9050919050565b60006020820190508181036000830152613ae6816136bb565b9050919050565b60006020820190508181036000830152613b06816136de565b9050919050565b60006020820190508181036000830152613b2681613701565b9050919050565b60006020820190508181036000830152613b4681613724565b9050919050565b60006020820190508181036000830152613b6681613747565b9050919050565b60006020820190508181036000830152613b868161376a565b9050919050565b60006020820190508181036000830152613ba68161378d565b9050919050565b60006020820190508181036000830152613bc6816137b0565b9050919050565b60006020820190508181036000830152613be6816137d3565b9050919050565b6000602082019050613c0260008301846137f6565b92915050565b6000613c12613c23565b9050613c1e8282613ecf565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4857613c47614007565b5b613c5182614036565b9050602081019050919050565b600067ffffffffffffffff821115613c7957613c78614007565b5b613c8282614036565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cdd82613e51565b9150613ce883613e51565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1d57613d1c613f7a565b5b828201905092915050565b6000613d3382613e51565b9150613d3e83613e51565b925082613d4e57613d4d613fa9565b5b828204905092915050565b6000613d6482613e51565b9150613d6f83613e51565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613da857613da7613f7a565b5b828202905092915050565b6000613dbe82613e51565b9150613dc983613e51565b925082821015613ddc57613ddb613f7a565b5b828203905092915050565b6000613df282613e31565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e88578082015181840152602081019050613e6d565b83811115613e97576000848401525b50505050565b60006002820490506001821680613eb557607f821691505b60208210811415613ec957613ec8613fd8565b5b50919050565b613ed882614036565b810181811067ffffffffffffffff82111715613ef757613ef6614007565b5b80604052505050565b6000613f0b82613e51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3e57613f3d613f7a565b5b600182019050919050565b6000613f5482613e51565b9150613f5f83613e51565b925082613f6f57613f6e613fa9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e2774206f776e207468697320746f6b656e0000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f54686520736f636965747920646f6573206e6f7420616363657074206e65772060008201527f6d656d62657273206174207468652074696d6500000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f546f6b656e206973206e6f7420612048617262696e6765720000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265736572766520776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b6146d781613de7565b81146146e257600080fd5b50565b6146ee81613df9565b81146146f957600080fd5b50565b61470581613e05565b811461471057600080fd5b50565b61471c81613e51565b811461472757600080fd5b5056fea2646970667358221220093423aa2309d8f9d5b944e0c97b461742dfafd1cea7df360e8e695423e980c064736f6c63430008040033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806355f804b3116101235780639a936509116100ab578063d031370b1161006f578063d031370b146107d8578063dd5e75a214610801578063e985e9c51461082a578063f2fde38b14610867578063f47c84c5146108905761021a565b80639a936509146106f5578063a22cb46514610720578063afa5547214610749578063b88d4fde14610772578063c87b56dd1461079b5761021a565b80637901ea78116100f25780637901ea781461062d5780637ff9b596146106495780638da5cb5b146106745780639303cd611461069f57806395d89b41146106ca5761021a565b806355f804b3146105735780636352211e1461059c57806370a08231146105d9578063715018a6146106165761021a565b80632da74fa0116101a65780633ccfd60b116101755780633ccfd60b1461047c57806342842e0e1461049357806346cfbef8146104bc5780634f6ccce7146104f95780634f849475146105365761021a565b80632da74fa0146103c05780632f745c59146103eb57806334918dfd146104285780633ab6b7361461043f5761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806309aa3dcf1461031657806318160ddd1461034157806318e20a381461036c57806323b872dd146103975761021a565b8063018a2c371461021f57806301ffc9a71461024857806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613352565b6108bb565b005b34801561025457600080fd5b5061026f600480360381019061026a91906132bf565b610941565b60405161027c9190613890565b60405180910390f35b34801561029157600080fd5b5061029a610953565b6040516102a791906138ab565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613352565b6109e5565b6040516102e49190613829565b60405180910390f35b3480156102f957600080fd5b50610314600480360381019061030f9190613283565b610a6a565b005b34801561032257600080fd5b5061032b610b82565b6040516103389190613bed565b60405180910390f35b34801561034d57600080fd5b50610356610b87565b6040516103639190613bed565b60405180910390f35b34801561037857600080fd5b50610381610b94565b60405161038e9190613bed565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b9919061317d565b610b9a565b005b3480156103cc57600080fd5b506103d5610bfa565b6040516103e29190613890565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613283565b610c0d565b60405161041f9190613bed565b60405180910390f35b34801561043457600080fd5b5061043d610cb2565b005b34801561044b57600080fd5b5061046660048036038101906104619190613352565b610d5a565b6040516104739190613890565b60405180910390f35b34801561048857600080fd5b50610491610d6c565b005b34801561049f57600080fd5b506104ba60048036038101906104b5919061317d565b610e37565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613352565b610e57565b6040516104f09190613890565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190613352565b610ee7565b60405161052d9190613bed565b60405180910390f35b34801561054257600080fd5b5061055d6004803603810190610558919061337b565b610f7e565b60405161056a9190613890565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613311565b610fb4565b005b3480156105a857600080fd5b506105c360048036038101906105be9190613352565b61104a565b6040516105d09190613829565b60405180910390f35b3480156105e557600080fd5b5061060060048036038101906105fb9190613118565b6110fc565b60405161060d9190613bed565b60405180910390f35b34801561062257600080fd5b5061062b6111b4565b005b61064760048036038101906106429190613352565b61123c565b005b34801561065557600080fd5b5061065e611434565b60405161066b9190613bed565b60405180910390f35b34801561068057600080fd5b5061068961143f565b6040516106969190613829565b60405180910390f35b3480156106ab57600080fd5b506106b4611469565b6040516106c19190613829565b60405180910390f35b3480156106d657600080fd5b506106df61148f565b6040516106ec91906138ab565b60405180910390f35b34801561070157600080fd5b5061070a611521565b6040516107179190613bed565b60405180910390f35b34801561072c57600080fd5b5061074760048036038101906107429190613247565b611527565b005b34801561075557600080fd5b50610770600480360381019061076b9190613118565b6116a8565b005b34801561077e57600080fd5b50610799600480360381019061079491906131cc565b611768565b005b3480156107a757600080fd5b506107c260048036038101906107bd9190613352565b6117ca565b6040516107cf91906138ab565b60405180910390f35b3480156107e457600080fd5b506107ff60048036038101906107fa9190613352565b6118a0565b005b34801561080d57600080fd5b5061082860048036038101906108239190613352565b6119be565b005b34801561083657600080fd5b50610851600480360381019061084c9190613141565b611b8a565b60405161085e9190613890565b60405180910390f35b34801561087357600080fd5b5061088e60048036038101906108899190613118565b611c1e565b005b34801561089c57600080fd5b506108a5611d16565b6040516108b29190613bed565b60405180910390f35b6108c3611d1c565b73ffffffffffffffffffffffffffffffffffffffff166108e161143f565b73ffffffffffffffffffffffffffffffffffffffff1614610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092e90613acd565b60405180910390fd5b80600f8190555050565b600061094c82611d24565b9050919050565b60606000805461096290613e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90613e9d565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b60006109f082611d9e565b610a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2690613aad565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a758261104a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613b2d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b05611d1c565b73ffffffffffffffffffffffffffffffffffffffff161480610b345750610b3381610b2e611d1c565b611b8a565b5b610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906139cd565b60405180910390fd5b610b7d8383611e0a565b505050565b600a81565b6000600880549050905090565b600f5481565b610bab610ba5611d1c565b82611ec3565b610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be190613b8d565b60405180910390fd5b610bf5838383611fa1565b505050565b600c60009054906101000a900460ff1681565b6000610c18836110fc565b8210610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c50906138cd565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610cba611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610cd861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2590613acd565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000610d6582610e57565b9050919050565b610d74611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610d9261143f565b73ffffffffffffffffffffffffffffffffffffffff1614610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90613acd565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e33573d6000803e3d6000fd5b5050565b610e5283838360405180602001604052806000815250611768565b505050565b6000610e6282611d9e565b610e6b57600080fd5b60006001600b54600d5485610e809190613cd2565b610e8a9190613f49565b610e949190613cd2565b90506000600d5414158015610eb557506000600a82610eb39190613f49565b145b8015610edf57506010600082815260200190815260200160002060009054906101000a900460ff16155b915050919050565b6000610ef1610b87565b8210610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990613bad565b60405180910390fd5b60088281548110610f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000610f8984610e57565b8015610f9a5750610f9983610e57565b5b8015610fab5750610faa82610e57565b5b90509392505050565b610fbc611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610fda61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790613acd565b60405180910390fd5b8060119080519060200190611046929190612f3c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613a2d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611164906139ed565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111bc611d1c565b73ffffffffffffffffffffffffffffffffffffffff166111da61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122790613acd565b60405180910390fd5b61123a60006121fd565b565b600c60009054906101000a900460ff1661128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128290613a8d565b60405180910390fd5b600a8111156112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690613b4d565b60405180910390fd5b600b54816112db610b87565b6112e59190613cd2565b1115611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90613a4d565b60405180910390fd5b348166470de4df82000061133a9190613d59565b111561137b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113729061398d565b60405180910390fd5b60005b818110156113ce5760006001611392610b87565b61139c9190613cd2565b9050600b546113a9610b87565b10156113ba576113b933826122c3565b5b5080806113c690613f00565b91505061137e565b506000600d541480156113f65750600b546113e7610b87565b14806113f55750600f544210155b5b1561143157600b54436114099190613f49565b600d819055506000600d541415611430576001600d546114299190613cd2565b600d819055505b5b50565b66470de4df82000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606001805461149e90613e9d565b80601f01602080910402602001604051908101604052809291908181526020018280546114ca90613e9d565b80156115175780601f106114ec57610100808354040283529160200191611517565b820191906000526020600020905b8154815290600101906020018083116114fa57829003601f168201915b5050505050905090565b600d5481565b61152f611d1c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561159d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115949061396d565b60405180910390fd5b80600560006115aa611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611657611d1c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169c9190613890565b60405180910390a35050565b6116b0611d1c565b73ffffffffffffffffffffffffffffffffffffffff166116ce61143f565b73ffffffffffffffffffffffffffffffffffffffff1614611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b90613acd565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611779611773611d1c565b83611ec3565b6117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af90613b8d565b60405180910390fd5b6117c4848484846122e1565b50505050565b60606117d582611d9e565b611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90613b0d565b60405180910390fd5b6000600d54146118435761182782610e57565b6118315781611840565b600b548261183f9190613cd2565b5b91505b600061184d61233d565b9050600081511161186d5760405180602001604052806000815250611898565b80611877846123cf565b604051602001611888929190613805565b6040516020818303038152906040525b915050919050565b6118a8611d1c565b73ffffffffffffffffffffffffffffffffffffffff166118c661143f565b73ffffffffffffffffffffffffffffffffffffffff161461191c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191390613acd565b60405180910390fd5b6000611926610b87565b9050600b5482826119379190613cd2565b1115611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f90613bcd565b60405180910390fd5b60006001826119879190613cd2565b90505b82826119969190613cd2565b81116119b9576119a633826122c3565b80806119b190613f00565b91505061198a565b505050565b60006119c98261104a565b90506119d482610e57565b611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a90613b6d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611af55750600073ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611af45750600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b5b611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90613a0d565b60405180910390fd5b6001601060006001600b54600d5487611b4d9190613cd2565b611b579190613f49565b611b619190613cd2565b815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c26611d1c565b73ffffffffffffffffffffffffffffffffffffffff16611c4461143f565b73ffffffffffffffffffffffffffffffffffffffff1614611c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9190613acd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d019061390d565b60405180910390fd5b611d13816121fd565b50565b600b5481565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d975750611d968261257c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e7d8361104a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ece82611d9e565b611f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f04906139ad565b60405180910390fd5b6000611f188361104a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f8757508373ffffffffffffffffffffffffffffffffffffffff16611f6f846109e5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f985750611f978185611b8a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fc18261104a565b73ffffffffffffffffffffffffffffffffffffffff1614612017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200e90613aed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207e9061394d565b60405180910390fd5b61209283838361265e565b61209d600082611e0a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ed9190613db3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121449190613cd2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122dd82826040518060200160405280600081525061266e565b5050565b6122ec848484611fa1565b6122f8848484846126c9565b612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e906138ed565b60405180910390fd5b50505050565b60606011805461234c90613e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461237890613e9d565b80156123c55780601f1061239a576101008083540402835291602001916123c5565b820191906000526020600020905b8154815290600101906020018083116123a857829003601f168201915b5050505050905090565b60606000821415612417576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612577565b600082905060005b6000821461244957808061243290613f00565b915050600a826124429190613d28565b915061241f565b60008167ffffffffffffffff81111561248b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124bd5781602001600182028036833780820191505090505b5090505b60008514612570576001826124d69190613db3565b9150600a856124e59190613f49565b60306124f19190613cd2565b60f81b81838151811061252d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125699190613d28565b94506124c1565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061264757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612657575061265682612860565b5b9050919050565b6126698383836128ca565b505050565b61267883836129de565b61268560008484846126c9565b6126c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bb906138ed565b60405180910390fd5b505050565b60006126ea8473ffffffffffffffffffffffffffffffffffffffff16612bac565b15612853578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612713611d1c565b8786866040518563ffffffff1660e01b81526004016127359493929190613844565b602060405180830381600087803b15801561274f57600080fd5b505af192505050801561278057506040513d601f19601f8201168201806040525081019061277d91906132e8565b60015b612803573d80600081146127b0576040519150601f19603f3d011682016040523d82523d6000602084013e6127b5565b606091505b506000815114156127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f2906138ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612858565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6128d5838383612bbf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129185761291381612bc4565b612957565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612956576129558382612c0d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299a5761299581612d7a565b6129d9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129d8576129d78282612ebd565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4590613a6d565b60405180910390fd5b612a5781611d9e565b15612a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8e9061392d565b60405180910390fd5b612aa36000838361265e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af39190613cd2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c1a846110fc565b612c249190613db3565b9050600060076000848152602001908152602001600020549050818114612d09576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d8e9190613db3565b9050600060096000848152602001908152602001600020549050600060088381548110612de4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612e2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ea1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612ec8836110fc565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612f4890613e9d565b90600052602060002090601f016020900481019282612f6a5760008555612fb1565b82601f10612f8357805160ff1916838001178555612fb1565b82800160010185558215612fb1579182015b82811115612fb0578251825591602001919060010190612f95565b5b509050612fbe9190612fc2565b5090565b5b80821115612fdb576000816000905550600101612fc3565b5090565b6000612ff2612fed84613c2d565b613c08565b90508281526020810184848401111561300a57600080fd5b613015848285613e5b565b509392505050565b600061303061302b84613c5e565b613c08565b90508281526020810184848401111561304857600080fd5b613053848285613e5b565b509392505050565b60008135905061306a816146ce565b92915050565b60008135905061307f816146e5565b92915050565b600081359050613094816146fc565b92915050565b6000815190506130a9816146fc565b92915050565b600082601f8301126130c057600080fd5b81356130d0848260208601612fdf565b91505092915050565b600082601f8301126130ea57600080fd5b81356130fa84826020860161301d565b91505092915050565b60008135905061311281614713565b92915050565b60006020828403121561312a57600080fd5b60006131388482850161305b565b91505092915050565b6000806040838503121561315457600080fd5b60006131628582860161305b565b92505060206131738582860161305b565b9150509250929050565b60008060006060848603121561319257600080fd5b60006131a08682870161305b565b93505060206131b18682870161305b565b92505060406131c286828701613103565b9150509250925092565b600080600080608085870312156131e257600080fd5b60006131f08782880161305b565b94505060206132018782880161305b565b935050604061321287828801613103565b925050606085013567ffffffffffffffff81111561322f57600080fd5b61323b878288016130af565b91505092959194509250565b6000806040838503121561325a57600080fd5b60006132688582860161305b565b925050602061327985828601613070565b9150509250929050565b6000806040838503121561329657600080fd5b60006132a48582860161305b565b92505060206132b585828601613103565b9150509250929050565b6000602082840312156132d157600080fd5b60006132df84828501613085565b91505092915050565b6000602082840312156132fa57600080fd5b60006133088482850161309a565b91505092915050565b60006020828403121561332357600080fd5b600082013567ffffffffffffffff81111561333d57600080fd5b613349848285016130d9565b91505092915050565b60006020828403121561336457600080fd5b600061337284828501613103565b91505092915050565b60008060006060848603121561339057600080fd5b600061339e86828701613103565b93505060206133af86828701613103565b92505060406133c086828701613103565b9150509250925092565b6133d381613de7565b82525050565b6133e281613df9565b82525050565b60006133f382613c8f565b6133fd8185613ca5565b935061340d818560208601613e6a565b61341681614036565b840191505092915050565b600061342c82613c9a565b6134368185613cb6565b9350613446818560208601613e6a565b61344f81614036565b840191505092915050565b600061346582613c9a565b61346f8185613cc7565b935061347f818560208601613e6a565b80840191505092915050565b6000613498602b83613cb6565b91506134a382614047565b604082019050919050565b60006134bb603283613cb6565b91506134c682614096565b604082019050919050565b60006134de602683613cb6565b91506134e9826140e5565b604082019050919050565b6000613501601c83613cb6565b915061350c82614134565b602082019050919050565b6000613524602483613cb6565b915061352f8261415d565b604082019050919050565b6000613547601983613cb6565b9150613552826141ac565b602082019050919050565b600061356a601f83613cb6565b9150613575826141d5565b602082019050919050565b600061358d602c83613cb6565b9150613598826141fe565b604082019050919050565b60006135b0603883613cb6565b91506135bb8261424d565b604082019050919050565b60006135d3602a83613cb6565b91506135de8261429c565b604082019050919050565b60006135f6601883613cb6565b9150613601826142eb565b602082019050919050565b6000613619602983613cb6565b915061362482614314565b604082019050919050565b600061363c602a83613cb6565b915061364782614363565b604082019050919050565b600061365f602083613cb6565b915061366a826143b2565b602082019050919050565b6000613682603383613cb6565b915061368d826143db565b604082019050919050565b60006136a5602c83613cb6565b91506136b08261442a565b604082019050919050565b60006136c8602083613cb6565b91506136d382614479565b602082019050919050565b60006136eb602983613cb6565b91506136f6826144a2565b604082019050919050565b600061370e602f83613cb6565b9150613719826144f1565b604082019050919050565b6000613731602183613cb6565b915061373c82614540565b604082019050919050565b6000613754601b83613cb6565b915061375f8261458f565b602082019050919050565b6000613777601883613cb6565b9150613782826145b8565b602082019050919050565b600061379a603183613cb6565b91506137a5826145e1565b604082019050919050565b60006137bd602c83613cb6565b91506137c882614630565b604082019050919050565b60006137e0602983613cb6565b91506137eb8261467f565b604082019050919050565b6137ff81613e51565b82525050565b6000613811828561345a565b915061381d828461345a565b91508190509392505050565b600060208201905061383e60008301846133ca565b92915050565b600060808201905061385960008301876133ca565b61386660208301866133ca565b61387360408301856137f6565b818103606083015261388581846133e8565b905095945050505050565b60006020820190506138a560008301846133d9565b92915050565b600060208201905081810360008301526138c58184613421565b905092915050565b600060208201905081810360008301526138e68161348b565b9050919050565b60006020820190508181036000830152613906816134ae565b9050919050565b60006020820190508181036000830152613926816134d1565b9050919050565b60006020820190508181036000830152613946816134f4565b9050919050565b6000602082019050818103600083015261396681613517565b9050919050565b600060208201905081810360008301526139868161353a565b9050919050565b600060208201905081810360008301526139a68161355d565b9050919050565b600060208201905081810360008301526139c681613580565b9050919050565b600060208201905081810360008301526139e6816135a3565b9050919050565b60006020820190508181036000830152613a06816135c6565b9050919050565b60006020820190508181036000830152613a26816135e9565b9050919050565b60006020820190508181036000830152613a468161360c565b9050919050565b60006020820190508181036000830152613a668161362f565b9050919050565b60006020820190508181036000830152613a8681613652565b9050919050565b60006020820190508181036000830152613aa681613675565b9050919050565b60006020820190508181036000830152613ac681613698565b9050919050565b60006020820190508181036000830152613ae6816136bb565b9050919050565b60006020820190508181036000830152613b06816136de565b9050919050565b60006020820190508181036000830152613b2681613701565b9050919050565b60006020820190508181036000830152613b4681613724565b9050919050565b60006020820190508181036000830152613b6681613747565b9050919050565b60006020820190508181036000830152613b868161376a565b9050919050565b60006020820190508181036000830152613ba68161378d565b9050919050565b60006020820190508181036000830152613bc6816137b0565b9050919050565b60006020820190508181036000830152613be6816137d3565b9050919050565b6000602082019050613c0260008301846137f6565b92915050565b6000613c12613c23565b9050613c1e8282613ecf565b919050565b6000604051905090565b600067ffffffffffffffff821115613c4857613c47614007565b5b613c5182614036565b9050602081019050919050565b600067ffffffffffffffff821115613c7957613c78614007565b5b613c8282614036565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cdd82613e51565b9150613ce883613e51565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1d57613d1c613f7a565b5b828201905092915050565b6000613d3382613e51565b9150613d3e83613e51565b925082613d4e57613d4d613fa9565b5b828204905092915050565b6000613d6482613e51565b9150613d6f83613e51565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613da857613da7613f7a565b5b828202905092915050565b6000613dbe82613e51565b9150613dc983613e51565b925082821015613ddc57613ddb613f7a565b5b828203905092915050565b6000613df282613e31565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e88578082015181840152602081019050613e6d565b83811115613e97576000848401525b50505050565b60006002820490506001821680613eb557607f821691505b60208210811415613ec957613ec8613fd8565b5b50919050565b613ed882614036565b810181811067ffffffffffffffff82111715613ef757613ef6614007565b5b80604052505050565b6000613f0b82613e51565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f3e57613f3d613f7a565b5b600182019050919050565b6000613f5482613e51565b9150613f5f83613e51565b925082613f6f57613f6e613fa9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f596f7520646f6e2774206f776e207468697320746f6b656e0000000000000000600082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f54686520736f636965747920646f6573206e6f7420616363657074206e65772060008201527f6d656d62657273206174207468652074696d6500000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f546f6b656e206973206e6f7420612048617262696e6765720000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265736572766520776f756c6420657863656564206d617820737570706c792060008201527f6f6620746f6b656e730000000000000000000000000000000000000000000000602082015250565b6146d781613de7565b81146146e257600080fd5b50565b6146ee81613df9565b81146146f957600080fd5b50565b61470581613e05565b811461471057600080fd5b50565b61471c81613e51565b811461472757600080fd5b5056fea2646970667358221220093423aa2309d8f9d5b944e0c97b461742dfafd1cea7df360e8e695423e980c064736f6c63430008040033

Deployed Bytecode Sourcemap

46694:4646:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48579:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47495:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21197:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22756:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22279:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46879:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37222:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47084:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23646:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46968:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36890:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48472:95;;;;;;;;;;;;;:::i;:::-;;50127:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49680:140;;;;;;;;;;;;;:::i;:::-;;24056:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49832:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37412:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50260:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47682:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20891:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20621:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34030:94;;;;;;;;;;;;;:::i;:::-;;48705:967;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46806:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33379:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47045:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21366:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47010:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23049:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47803:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24312:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50879:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48077:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50464:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23415:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34279:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46928:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48579:114;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48673:9:::1;48654:16;:28;;;;48579:114:::0;:::o;47495:179::-;47606:4;47630:36;47654:11;47630:23;:36::i;:::-;47623:43;;47495:179;;;:::o;21197:100::-;21251:13;21284:5;21277:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21197:100;:::o;22756:221::-;22832:7;22860:16;22868:7;22860;:16::i;:::-;22852:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22945:15;:24;22961:7;22945:24;;;;;;;;;;;;;;;;;;;;;22938:31;;22756:221;;;:::o;22279:411::-;22360:13;22376:23;22391:7;22376:14;:23::i;:::-;22360:39;;22424:5;22418:11;;:2;:11;;;;22410:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22518:5;22502:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22527:37;22544:5;22551:12;:10;:12::i;:::-;22527:16;:37::i;:::-;22502:62;22480:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22661:21;22670:2;22674:7;22661:8;:21::i;:::-;22279:411;;;:::o;46879:42::-;46919:2;46879:42;:::o;37222:113::-;37283:7;37310:10;:17;;;;37303:24;;37222:113;:::o;47084:44::-;;;;:::o;23646:339::-;23841:41;23860:12;:10;:12::i;:::-;23874:7;23841:18;:41::i;:::-;23833:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23949:28;23959:4;23965:2;23969:7;23949:9;:28::i;:::-;23646:339;;;:::o;46968:35::-;;;;;;;;;;;;;:::o;36890:256::-;36987:7;37023:23;37040:5;37023:16;:23::i;:::-;37015:5;:31;37007:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37112:12;:19;37125:5;37112:19;;;;;;;;;;;;;;;:26;37132:5;37112:26;;;;;;;;;;;;37105:33;;36890:256;;;;:::o;48472:95::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48544:15:::1;;;;;;;;;;;48543:16;48525:15;;:34;;;;;;;;;;;;;;;;;;48472:95::o:0;50127:121::-;50196:4;50220:20;50232:7;50220:11;:20::i;:::-;50213:27;;50127:121;;;:::o;49680:140::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49728:12:::1;49743:21;49728:36;;49783:10;49775:28;;:37;49804:7;49775:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;33670:1;49680:140::o:0;24056:185::-;24194:39;24211:4;24217:2;24221:7;24194:39;;;;;;;;;;;;:16;:39::i;:::-;24056:185;;;:::o;49832:283::-;49891:4;49916:16;49924:7;49916;:16::i;:::-;49908:25;;;;;;49944:19;50007:1;49994:10;;49977:13;;49967:7;:23;;;;:::i;:::-;49966:38;;;;:::i;:::-;:42;;;;:::i;:::-;49944:64;;50043:1;50026:13;;:18;;:43;;;;;50068:1;50062:2;50048:11;:16;;;;:::i;:::-;:21;50026:43;:81;;;;;50074:20;:33;50095:11;50074:33;;;;;;;;;;;;;;;;;;;;;50073:34;50026:81;50019:88;;;49832:283;;;:::o;37412:233::-;37487:7;37523:30;:28;:30::i;:::-;37515:5;:38;37507:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37620:10;37631:5;37620:17;;;;;;;;;;;;;;;;;;;;;;;;37613:24;;37412:233;;;:::o;50260:192::-;50352:4;50376:19;50388:6;50376:11;:19::i;:::-;:42;;;;;50399:19;50411:6;50399:11;:19::i;:::-;50376:42;:65;;;;;50422:19;50434:6;50422:11;:19::i;:::-;50376:65;50369:72;;50260:192;;;;;:::o;47682:109::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47775:8:::1;47756:16;:27;;;;;;;;;;;;:::i;:::-;;47682:109:::0;:::o;20891:239::-;20963:7;20983:13;20999:7;:16;21007:7;20999:16;;;;;;;;;;;;;;;;;;;;;20983:32;;21051:1;21034:19;;:5;:19;;;;21026:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21117:5;21110:12;;;20891:239;;;:::o;20621:208::-;20693:7;20738:1;20721:19;;:5;:19;;;;20713:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20805:9;:16;20815:5;20805:16;;;;;;;;;;;;;;;;20798:23;;20621:208;;;:::o;34030:94::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34095:21:::1;34113:1;34095:9;:21::i;:::-;34030:94::o:0;48705:967::-;48778:15;;;;;;;;;;;48770:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;46919:2;48868:14;:34;;48860:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48987:10;;48969:14;48953:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;48945:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;49094:9;49076:14;46843:17;49063:27;;;;:::i;:::-;:40;;49055:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;49164:6;49160:215;49180:14;49176:1;:18;49160:215;;;49216:14;49249:1;49233:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49216:34;;49285:10;;49269:13;:11;:13::i;:::-;:26;49265:99;;;49316:32;49326:10;49338:9;49316;:32::i;:::-;49265:99;49160:215;49196:3;;;;;:::i;:::-;;;;49160:215;;;;49416:1;49399:13;;:18;:90;;;;;49439:10;;49422:13;:11;:13::i;:::-;:27;:66;;;;49472:16;;49453:15;:35;;49422:66;49399:90;49395:270;;;49537:10;;49522:12;:25;;;;:::i;:::-;49506:13;:41;;;;49583:1;49566:13;;:18;49562:92;;;49637:1;49621:13;;:17;;;;:::i;:::-;49605:13;:33;;;;49562:92;49395:270;48705:967;:::o;46806:54::-;46843:17;46806:54;:::o;33379:87::-;33425:7;33452:6;;;;;;;;;;;33445:13;;33379:87;:::o;47045:32::-;;;;;;;;;;;;;:::o;21366:104::-;21422:13;21455:7;21448:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21366:104;:::o;47010:28::-;;;;:::o;23049:295::-;23164:12;:10;:12::i;:::-;23152:24;;:8;:24;;;;23144:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23264:8;23219:18;:32;23238:12;:10;:12::i;:::-;23219:32;;;;;;;;;;;;;;;:42;23252:8;23219:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23317:8;23288:48;;23303:12;:10;:12::i;:::-;23288:48;;;23327:8;23288:48;;;;;;:::i;:::-;;;;;;;;23049:295;;:::o;47803:141::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47918:18:::1;47898:17;;:38;;;;;;;;;;;;;;;;;;47803:141:::0;:::o;24312:328::-;24487:41;24506:12;:10;:12::i;:::-;24520:7;24487:18;:41::i;:::-;24479:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24593:39;24607:4;24613:2;24617:7;24626:5;24593:13;:39::i;:::-;24312:328;;;;:::o;50879:458::-;50952:13;50986:16;50994:7;50986;:16::i;:::-;50978:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51086:1;51069:13;;:18;51065:114;;51114:20;51126:7;51114:11;:20::i;:::-;:53;;51160:7;51114:53;;;51147:10;;51137:7;:20;;;;:::i;:::-;51114:53;51104:63;;51065:114;51191:21;51215:10;:8;:10::i;:::-;51191:34;;51267:1;51249:7;51243:21;:25;:86;;;;;;;;;;;;;;;;;51295:7;51304:18;:7;:16;:18::i;:::-;51278:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51243:86;51236:93;;;50879:458;;;:::o;48077:383::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48149:11:::1;48163:13;:11;:13::i;:::-;48149:27;;48222:10;;48204:14;48195:6;:23;;;;:::i;:::-;:37;;48187:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;48289:14;48340:1;48331:6;:10;;;;:::i;:::-;48319:22;;48314:139;48365:14;48356:6;:23;;;;:::i;:::-;48343:9;:36;48314:139;;48409:32;48419:10;48431:9;48409;:32::i;:::-;48381:11;;;;;:::i;:::-;;;;48314:139;;;33670:1;;48077:383:::0;:::o;50464:403::-;50528:13;50544:16;50552:7;50544;:16::i;:::-;50528:32;;50579:20;50591:7;50579:11;:20::i;:::-;50571:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50661:5;50647:19;;:10;:19;;;:91;;;;50700:1;50671:31;;:17;;;;;;;;;;;:31;;;;:66;;;;;50720:17;;;;;;;;;;;50706:31;;:10;:31;;;50671:66;50647:91;50639:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;50855:4;50788:20;:64;50850:1;50837:10;;50820:13;;50810:7;:23;;;;:::i;:::-;50809:38;;;;:::i;:::-;:42;;;;:::i;:::-;50788:64;;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;50464:403;;:::o;23415:164::-;23512:4;23536:18;:25;23555:5;23536:25;;;;;;;;;;;;;;;:35;23562:8;23536:35;;;;;;;;;;;;;;;;;;;;;;;;;23529:42;;23415:164;;;;:::o;34279:192::-;33610:12;:10;:12::i;:::-;33599:23;;:7;:5;:7::i;:::-;:23;;;33591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34388:1:::1;34368:22;;:8;:22;;;;34360:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34444:19;34454:8;34444:9;:19::i;:::-;34279:192:::0;:::o;46928:33::-;;;;:::o;15869:98::-;15922:7;15949:10;15942:17;;15869:98;:::o;36582:224::-;36684:4;36723:35;36708:50;;;:11;:50;;;;:90;;;;36762:36;36786:11;36762:23;:36::i;:::-;36708:90;36701:97;;36582:224;;;:::o;26150:127::-;26215:4;26267:1;26239:30;;:7;:16;26247:7;26239:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26232:37;;26150:127;;;:::o;30132:174::-;30234:2;30207:15;:24;30223:7;30207:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30290:7;30286:2;30252:46;;30261:23;30276:7;30261:14;:23::i;:::-;30252:46;;;;;;;;;;;;30132:174;;:::o;26444:348::-;26537:4;26562:16;26570:7;26562;:16::i;:::-;26554:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26638:13;26654:23;26669:7;26654:14;:23::i;:::-;26638:39;;26707:5;26696:16;;:7;:16;;;:51;;;;26740:7;26716:31;;:20;26728:7;26716:11;:20::i;:::-;:31;;;26696:51;:87;;;;26751:32;26768:5;26775:7;26751:16;:32::i;:::-;26696:87;26688:96;;;26444:348;;;;:::o;29436:578::-;29595:4;29568:31;;:23;29583:7;29568:14;:23::i;:::-;:31;;;29560:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29678:1;29664:16;;:2;:16;;;;29656:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29734:39;29755:4;29761:2;29765:7;29734:20;:39::i;:::-;29838:29;29855:1;29859:7;29838:8;:29::i;:::-;29899:1;29880:9;:15;29890:4;29880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29928:1;29911:9;:13;29921:2;29911:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29959:2;29940:7;:16;29948:7;29940:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29998:7;29994:2;29979:27;;29988:4;29979:27;;;;;;;;;;;;29436:578;;;:::o;34479:173::-;34535:16;34554:6;;;;;;;;;;;34535:25;;34580:8;34571:6;;:17;;;;;;;;;;;;;;;;;;34635:8;34604:40;;34625:8;34604:40;;;;;;;;;;;;34479:173;;:::o;27134:110::-;27210:26;27220:2;27224:7;27210:26;;;;;;;;;;;;:9;:26::i;:::-;27134:110;;:::o;25522:315::-;25679:28;25689:4;25695:2;25699:7;25679:9;:28::i;:::-;25726:48;25749:4;25755:2;25759:7;25768:5;25726:22;:48::i;:::-;25718:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25522:315;;;;:::o;47952:117::-;48012:13;48045:16;48038:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47952:117;:::o;16398:532::-;16454:13;16493:1;16484:5;:10;16480:53;;;16511:10;;;;;;;;;;;;;;;;;;;;;16480:53;16543:12;16558:5;16543:20;;16574:14;16599:78;16614:1;16606:4;:9;16599:78;;16632:8;;;;;:::i;:::-;;;;16663:2;16655:10;;;;;:::i;:::-;;;16599:78;;;16687:19;16719:6;16709:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16687:39;;16737:154;16753:1;16744:5;:10;16737:154;;16781:1;16771:11;;;;;:::i;:::-;;;16848:2;16840:5;:10;;;;:::i;:::-;16827:2;:24;;;;:::i;:::-;16814:39;;16797:6;16804;16797:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16877:2;16868:11;;;;;:::i;:::-;;;16737:154;;;16915:6;16901:21;;;;;16398:532;;;;:::o;20252:305::-;20354:4;20406:25;20391:40;;;:11;:40;;;;:105;;;;20463:33;20448:48;;;:11;:48;;;;20391:105;:158;;;;20513:36;20537:11;20513:23;:36::i;:::-;20391:158;20371:178;;20252:305;;;:::o;47306:181::-;47434:45;47461:4;47467:2;47471:7;47434:26;:45::i;:::-;47306:181;;;:::o;27471:321::-;27601:18;27607:2;27611:7;27601:5;:18::i;:::-;27652:54;27683:1;27687:2;27691:7;27700:5;27652:22;:54::i;:::-;27630:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27471:321;;;:::o;30871:803::-;31026:4;31047:15;:2;:13;;;:15::i;:::-;31043:624;;;31099:2;31083:36;;;31120:12;:10;:12::i;:::-;31134:4;31140:7;31149:5;31083:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31079:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31346:1;31329:6;:13;:18;31325:272;;;31372:60;;;;;;;;;;:::i;:::-;;;;;;;;31325:272;31547:6;31541:13;31532:6;31528:2;31524:15;31517:38;31079:533;31216:45;;;31206:55;;;:6;:55;;;;31199:62;;;;;31043:624;31651:4;31644:11;;30871:803;;;;;;;:::o;18766:157::-;18851:4;18890:25;18875:40;;;:11;:40;;;;18868:47;;18766:157;;;:::o;38258:589::-;38402:45;38429:4;38435:2;38439:7;38402:26;:45::i;:::-;38480:1;38464:18;;:4;:18;;;38460:187;;;38499:40;38531:7;38499:31;:40::i;:::-;38460:187;;;38569:2;38561:10;;:4;:10;;;38557:90;;38588:47;38621:4;38627:7;38588:32;:47::i;:::-;38557:90;38460:187;38675:1;38661:16;;:2;:16;;;38657:183;;;38694:45;38731:7;38694:36;:45::i;:::-;38657:183;;;38767:4;38761:10;;:2;:10;;;38757:83;;38788:40;38816:2;38820:7;38788:27;:40::i;:::-;38757:83;38657:183;38258:589;;;:::o;28128:382::-;28222:1;28208:16;;:2;:16;;;;28200:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28281:16;28289:7;28281;:16::i;:::-;28280:17;28272:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28343:45;28372:1;28376:2;28380:7;28343:20;:45::i;:::-;28418:1;28401:9;:13;28411:2;28401:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28449:2;28430:7;:16;28438:7;28430:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28494:7;28490:2;28469:33;;28486:1;28469:33;;;;;;;;;;;;28128:382;;:::o;8127:387::-;8187:4;8395:12;8462:7;8450:20;8442:28;;8505:1;8498:4;:8;8491:15;;;8127:387;;;:::o;32246:126::-;;;;:::o;39570:164::-;39674:10;:17;;;;39647:15;:24;39663:7;39647:24;;;;;;;;;;;:44;;;;39702:10;39718:7;39702:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39570:164;:::o;40361:988::-;40627:22;40677:1;40652:22;40669:4;40652:16;:22::i;:::-;:26;;;;:::i;:::-;40627:51;;40689:18;40710:17;:26;40728:7;40710:26;;;;;;;;;;;;40689:47;;40857:14;40843:10;:28;40839:328;;40888:19;40910:12;:18;40923:4;40910:18;;;;;;;;;;;;;;;:34;40929:14;40910:34;;;;;;;;;;;;40888:56;;40994:11;40961:12;:18;40974:4;40961:18;;;;;;;;;;;;;;;:30;40980:10;40961:30;;;;;;;;;;;:44;;;;41111:10;41078:17;:30;41096:11;41078:30;;;;;;;;;;;:43;;;;40839:328;;41263:17;:26;41281:7;41263:26;;;;;;;;;;;41256:33;;;41307:12;:18;41320:4;41307:18;;;;;;;;;;;;;;;:34;41326:14;41307:34;;;;;;;;;;;41300:41;;;40361:988;;;;:::o;41644:1079::-;41897:22;41942:1;41922:10;:17;;;;:21;;;;:::i;:::-;41897:46;;41954:18;41975:15;:24;41991:7;41975:24;;;;;;;;;;;;41954:45;;42326:19;42348:10;42359:14;42348:26;;;;;;;;;;;;;;;;;;;;;;;;42326:48;;42412:11;42387:10;42398;42387:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42523:10;42492:15;:28;42508:11;42492:28;;;;;;;;;;;:41;;;;42664:15;:24;42680:7;42664:24;;;;;;;;;;;42657:31;;;42699:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41644:1079;;;;:::o;39148:221::-;39233:14;39250:20;39267:2;39250:16;:20::i;:::-;39233:37;;39308:7;39281:12;:16;39294:2;39281:16;;;;;;;;;;;;;;;:24;39298:6;39281:24;;;;;;;;;;;:34;;;;39355:6;39326:17;:26;39344:7;39326:26;;;;;;;;;;;:35;;;;39148:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:552::-;6163:6;6171;6179;6228:2;6216:9;6207:7;6203:23;6199:32;6196:2;;;6244:1;6241;6234:12;6196:2;6287:1;6312:53;6357:7;6348:6;6337:9;6333:22;6312:53;:::i;:::-;6302:63;;6258:117;6414:2;6440:53;6485:7;6476:6;6465:9;6461:22;6440:53;:::i;:::-;6430:63;;6385:118;6542:2;6568:53;6613:7;6604:6;6593:9;6589:22;6568:53;:::i;:::-;6558:63;;6513:118;6186:452;;;;;:::o;6644:118::-;6731:24;6749:5;6731:24;:::i;:::-;6726:3;6719:37;6709:53;;:::o;6768:109::-;6849:21;6864:5;6849:21;:::i;:::-;6844:3;6837:34;6827:50;;:::o;6883:360::-;6969:3;6997:38;7029:5;6997:38;:::i;:::-;7051:70;7114:6;7109:3;7051:70;:::i;:::-;7044:77;;7130:52;7175:6;7170:3;7163:4;7156:5;7152:16;7130:52;:::i;:::-;7207:29;7229:6;7207:29;:::i;:::-;7202:3;7198:39;7191:46;;6973:270;;;;;:::o;7249:364::-;7337:3;7365:39;7398:5;7365:39;:::i;:::-;7420:71;7484:6;7479:3;7420:71;:::i;:::-;7413:78;;7500:52;7545:6;7540:3;7533:4;7526:5;7522:16;7500:52;:::i;:::-;7577:29;7599:6;7577:29;:::i;:::-;7572:3;7568:39;7561:46;;7341:272;;;;;:::o;7619:377::-;7725:3;7753:39;7786:5;7753:39;:::i;:::-;7808:89;7890:6;7885:3;7808:89;:::i;:::-;7801:96;;7906:52;7951:6;7946:3;7939:4;7932:5;7928:16;7906:52;:::i;:::-;7983:6;7978:3;7974:16;7967:23;;7729:267;;;;;:::o;8002:366::-;8144:3;8165:67;8229:2;8224:3;8165:67;:::i;:::-;8158:74;;8241:93;8330:3;8241:93;:::i;:::-;8359:2;8354:3;8350:12;8343:19;;8148:220;;;:::o;8374:366::-;8516:3;8537:67;8601:2;8596:3;8537:67;:::i;:::-;8530:74;;8613:93;8702:3;8613:93;:::i;:::-;8731:2;8726:3;8722:12;8715:19;;8520:220;;;:::o;8746:366::-;8888:3;8909:67;8973:2;8968:3;8909:67;:::i;:::-;8902:74;;8985:93;9074:3;8985:93;:::i;:::-;9103:2;9098:3;9094:12;9087:19;;8892:220;;;:::o;9118:366::-;9260:3;9281:67;9345:2;9340:3;9281:67;:::i;:::-;9274:74;;9357:93;9446:3;9357:93;:::i;:::-;9475:2;9470:3;9466:12;9459:19;;9264:220;;;:::o;9490:366::-;9632:3;9653:67;9717:2;9712:3;9653:67;:::i;:::-;9646:74;;9729:93;9818:3;9729:93;:::i;:::-;9847:2;9842:3;9838:12;9831:19;;9636:220;;;:::o;9862:366::-;10004:3;10025:67;10089:2;10084:3;10025:67;:::i;:::-;10018:74;;10101:93;10190:3;10101:93;:::i;:::-;10219:2;10214:3;10210:12;10203:19;;10008:220;;;:::o;10234:366::-;10376:3;10397:67;10461:2;10456:3;10397:67;:::i;:::-;10390:74;;10473:93;10562:3;10473:93;:::i;:::-;10591:2;10586:3;10582:12;10575:19;;10380:220;;;:::o;10606:366::-;10748:3;10769:67;10833:2;10828:3;10769:67;:::i;:::-;10762:74;;10845:93;10934:3;10845:93;:::i;:::-;10963:2;10958:3;10954:12;10947:19;;10752:220;;;:::o;10978:366::-;11120:3;11141:67;11205:2;11200:3;11141:67;:::i;:::-;11134:74;;11217:93;11306:3;11217:93;:::i;:::-;11335:2;11330:3;11326:12;11319:19;;11124:220;;;:::o;11350:366::-;11492:3;11513:67;11577:2;11572:3;11513:67;:::i;:::-;11506:74;;11589:93;11678:3;11589:93;:::i;:::-;11707:2;11702:3;11698:12;11691:19;;11496:220;;;:::o;11722:366::-;11864:3;11885:67;11949:2;11944:3;11885:67;:::i;:::-;11878:74;;11961:93;12050:3;11961:93;:::i;:::-;12079:2;12074:3;12070:12;12063:19;;11868:220;;;:::o;12094:366::-;12236:3;12257:67;12321:2;12316:3;12257:67;:::i;:::-;12250:74;;12333:93;12422:3;12333:93;:::i;:::-;12451:2;12446:3;12442:12;12435:19;;12240:220;;;:::o;12466:366::-;12608:3;12629:67;12693:2;12688:3;12629:67;:::i;:::-;12622:74;;12705:93;12794:3;12705:93;:::i;:::-;12823:2;12818:3;12814:12;12807:19;;12612:220;;;:::o;12838:366::-;12980:3;13001:67;13065:2;13060:3;13001:67;:::i;:::-;12994:74;;13077:93;13166:3;13077:93;:::i;:::-;13195:2;13190:3;13186:12;13179:19;;12984:220;;;:::o;13210:366::-;13352:3;13373:67;13437:2;13432:3;13373:67;:::i;:::-;13366:74;;13449:93;13538:3;13449:93;:::i;:::-;13567:2;13562:3;13558:12;13551:19;;13356:220;;;:::o;13582:366::-;13724:3;13745:67;13809:2;13804:3;13745:67;:::i;:::-;13738:74;;13821:93;13910:3;13821:93;:::i;:::-;13939:2;13934:3;13930:12;13923:19;;13728:220;;;:::o;13954:366::-;14096:3;14117:67;14181:2;14176:3;14117:67;:::i;:::-;14110:74;;14193:93;14282:3;14193:93;:::i;:::-;14311:2;14306:3;14302:12;14295:19;;14100:220;;;:::o;14326:366::-;14468:3;14489:67;14553:2;14548:3;14489:67;:::i;:::-;14482:74;;14565:93;14654:3;14565:93;:::i;:::-;14683:2;14678:3;14674:12;14667:19;;14472:220;;;:::o;14698:366::-;14840:3;14861:67;14925:2;14920:3;14861:67;:::i;:::-;14854:74;;14937:93;15026:3;14937:93;:::i;:::-;15055:2;15050:3;15046:12;15039:19;;14844:220;;;:::o;15070:366::-;15212:3;15233:67;15297:2;15292:3;15233:67;:::i;:::-;15226:74;;15309:93;15398:3;15309:93;:::i;:::-;15427:2;15422:3;15418:12;15411:19;;15216:220;;;:::o;15442:366::-;15584:3;15605:67;15669:2;15664:3;15605:67;:::i;:::-;15598:74;;15681:93;15770:3;15681:93;:::i;:::-;15799:2;15794:3;15790:12;15783:19;;15588:220;;;:::o;15814:366::-;15956:3;15977:67;16041:2;16036:3;15977:67;:::i;:::-;15970:74;;16053:93;16142:3;16053:93;:::i;:::-;16171:2;16166:3;16162:12;16155:19;;15960:220;;;:::o;16186:366::-;16328:3;16349:67;16413:2;16408:3;16349:67;:::i;:::-;16342:74;;16425:93;16514:3;16425:93;:::i;:::-;16543:2;16538:3;16534:12;16527:19;;16332:220;;;:::o;16558:366::-;16700:3;16721:67;16785:2;16780:3;16721:67;:::i;:::-;16714:74;;16797:93;16886:3;16797:93;:::i;:::-;16915:2;16910:3;16906:12;16899:19;;16704:220;;;:::o;16930:366::-;17072:3;17093:67;17157:2;17152:3;17093:67;:::i;:::-;17086:74;;17169:93;17258:3;17169:93;:::i;:::-;17287:2;17282:3;17278:12;17271:19;;17076:220;;;:::o;17302:118::-;17389:24;17407:5;17389:24;:::i;:::-;17384:3;17377:37;17367:53;;:::o;17426:435::-;17606:3;17628:95;17719:3;17710:6;17628:95;:::i;:::-;17621:102;;17740:95;17831:3;17822:6;17740:95;:::i;:::-;17733:102;;17852:3;17845:10;;17610:251;;;;;:::o;17867:222::-;17960:4;17998:2;17987:9;17983:18;17975:26;;18011:71;18079:1;18068:9;18064:17;18055:6;18011:71;:::i;:::-;17965:124;;;;:::o;18095:640::-;18290:4;18328:3;18317:9;18313:19;18305:27;;18342:71;18410:1;18399:9;18395:17;18386:6;18342:71;:::i;:::-;18423:72;18491:2;18480:9;18476:18;18467:6;18423:72;:::i;:::-;18505;18573:2;18562:9;18558:18;18549:6;18505:72;:::i;:::-;18624:9;18618:4;18614:20;18609:2;18598:9;18594:18;18587:48;18652:76;18723:4;18714:6;18652:76;:::i;:::-;18644:84;;18295:440;;;;;;;:::o;18741:210::-;18828:4;18866:2;18855:9;18851:18;18843:26;;18879:65;18941:1;18930:9;18926:17;18917:6;18879:65;:::i;:::-;18833:118;;;;:::o;18957:313::-;19070:4;19108:2;19097:9;19093:18;19085:26;;19157:9;19151:4;19147:20;19143:1;19132:9;19128:17;19121:47;19185:78;19258:4;19249:6;19185:78;:::i;:::-;19177:86;;19075:195;;;;:::o;19276:419::-;19442:4;19480:2;19469:9;19465:18;19457:26;;19529:9;19523:4;19519:20;19515:1;19504:9;19500:17;19493:47;19557:131;19683:4;19557:131;:::i;:::-;19549:139;;19447:248;;;:::o;19701:419::-;19867:4;19905:2;19894:9;19890:18;19882:26;;19954:9;19948:4;19944:20;19940:1;19929:9;19925:17;19918:47;19982:131;20108:4;19982:131;:::i;:::-;19974:139;;19872:248;;;:::o;20126:419::-;20292:4;20330:2;20319:9;20315:18;20307:26;;20379:9;20373:4;20369:20;20365:1;20354:9;20350:17;20343:47;20407:131;20533:4;20407:131;:::i;:::-;20399:139;;20297:248;;;:::o;20551:419::-;20717:4;20755:2;20744:9;20740:18;20732:26;;20804:9;20798:4;20794:20;20790:1;20779:9;20775:17;20768:47;20832:131;20958:4;20832:131;:::i;:::-;20824:139;;20722:248;;;:::o;20976:419::-;21142:4;21180:2;21169:9;21165:18;21157:26;;21229:9;21223:4;21219:20;21215:1;21204:9;21200:17;21193:47;21257:131;21383:4;21257:131;:::i;:::-;21249:139;;21147:248;;;:::o;21401:419::-;21567:4;21605:2;21594:9;21590:18;21582:26;;21654:9;21648:4;21644:20;21640:1;21629:9;21625:17;21618:47;21682:131;21808:4;21682:131;:::i;:::-;21674:139;;21572:248;;;:::o;21826:419::-;21992:4;22030:2;22019:9;22015:18;22007:26;;22079:9;22073:4;22069:20;22065:1;22054:9;22050:17;22043:47;22107:131;22233:4;22107:131;:::i;:::-;22099:139;;21997:248;;;:::o;22251:419::-;22417:4;22455:2;22444:9;22440:18;22432:26;;22504:9;22498:4;22494:20;22490:1;22479:9;22475:17;22468:47;22532:131;22658:4;22532:131;:::i;:::-;22524:139;;22422:248;;;:::o;22676:419::-;22842:4;22880:2;22869:9;22865:18;22857:26;;22929:9;22923:4;22919:20;22915:1;22904:9;22900:17;22893:47;22957:131;23083:4;22957:131;:::i;:::-;22949:139;;22847:248;;;:::o;23101:419::-;23267:4;23305:2;23294:9;23290:18;23282:26;;23354:9;23348:4;23344:20;23340:1;23329:9;23325:17;23318:47;23382:131;23508:4;23382:131;:::i;:::-;23374:139;;23272:248;;;:::o;23526:419::-;23692:4;23730:2;23719:9;23715:18;23707:26;;23779:9;23773:4;23769:20;23765:1;23754:9;23750:17;23743:47;23807:131;23933:4;23807:131;:::i;:::-;23799:139;;23697:248;;;:::o;23951:419::-;24117:4;24155:2;24144:9;24140:18;24132:26;;24204:9;24198:4;24194:20;24190:1;24179:9;24175:17;24168:47;24232:131;24358:4;24232:131;:::i;:::-;24224:139;;24122:248;;;:::o;24376:419::-;24542:4;24580:2;24569:9;24565:18;24557:26;;24629:9;24623:4;24619:20;24615:1;24604:9;24600:17;24593:47;24657:131;24783:4;24657:131;:::i;:::-;24649:139;;24547:248;;;:::o;24801:419::-;24967:4;25005:2;24994:9;24990:18;24982:26;;25054:9;25048:4;25044:20;25040:1;25029:9;25025:17;25018:47;25082:131;25208:4;25082:131;:::i;:::-;25074:139;;24972:248;;;:::o;25226:419::-;25392:4;25430:2;25419:9;25415:18;25407:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25507:131;25633:4;25507:131;:::i;:::-;25499:139;;25397:248;;;:::o;25651:419::-;25817:4;25855:2;25844:9;25840:18;25832:26;;25904:9;25898:4;25894:20;25890:1;25879:9;25875:17;25868:47;25932:131;26058:4;25932:131;:::i;:::-;25924:139;;25822:248;;;:::o;26076:419::-;26242:4;26280:2;26269:9;26265:18;26257:26;;26329:9;26323:4;26319:20;26315:1;26304:9;26300:17;26293:47;26357:131;26483:4;26357:131;:::i;:::-;26349:139;;26247:248;;;:::o;26501:419::-;26667:4;26705:2;26694:9;26690:18;26682:26;;26754:9;26748:4;26744:20;26740:1;26729:9;26725:17;26718:47;26782:131;26908:4;26782:131;:::i;:::-;26774:139;;26672:248;;;:::o;26926:419::-;27092:4;27130:2;27119:9;27115:18;27107:26;;27179:9;27173:4;27169:20;27165:1;27154:9;27150:17;27143:47;27207:131;27333:4;27207:131;:::i;:::-;27199:139;;27097:248;;;:::o;27351:419::-;27517:4;27555:2;27544:9;27540:18;27532:26;;27604:9;27598:4;27594:20;27590:1;27579:9;27575:17;27568:47;27632:131;27758:4;27632:131;:::i;:::-;27624:139;;27522:248;;;:::o;27776:419::-;27942:4;27980:2;27969:9;27965:18;27957:26;;28029:9;28023:4;28019:20;28015:1;28004:9;28000:17;27993:47;28057:131;28183:4;28057:131;:::i;:::-;28049:139;;27947:248;;;:::o;28201:419::-;28367:4;28405:2;28394:9;28390:18;28382:26;;28454:9;28448:4;28444:20;28440:1;28429:9;28425:17;28418:47;28482:131;28608:4;28482:131;:::i;:::-;28474:139;;28372:248;;;:::o;28626:419::-;28792:4;28830:2;28819:9;28815:18;28807:26;;28879:9;28873:4;28869:20;28865:1;28854:9;28850:17;28843:47;28907:131;29033:4;28907:131;:::i;:::-;28899:139;;28797:248;;;:::o;29051:419::-;29217:4;29255:2;29244:9;29240:18;29232:26;;29304:9;29298:4;29294:20;29290:1;29279:9;29275:17;29268:47;29332:131;29458:4;29332:131;:::i;:::-;29324:139;;29222:248;;;:::o;29476:419::-;29642:4;29680:2;29669:9;29665:18;29657:26;;29729:9;29723:4;29719:20;29715:1;29704:9;29700:17;29693:47;29757:131;29883:4;29757:131;:::i;:::-;29749:139;;29647:248;;;:::o;29901:222::-;29994:4;30032:2;30021:9;30017:18;30009:26;;30045:71;30113:1;30102:9;30098:17;30089:6;30045:71;:::i;:::-;29999:124;;;;:::o;30129:129::-;30163:6;30190:20;;:::i;:::-;30180:30;;30219:33;30247:4;30239:6;30219:33;:::i;:::-;30170:88;;;:::o;30264:75::-;30297:6;30330:2;30324:9;30314:19;;30304:35;:::o;30345:307::-;30406:4;30496:18;30488:6;30485:30;30482:2;;;30518:18;;:::i;:::-;30482:2;30556:29;30578:6;30556:29;:::i;:::-;30548:37;;30640:4;30634;30630:15;30622:23;;30411:241;;;:::o;30658:308::-;30720:4;30810:18;30802:6;30799:30;30796:2;;;30832:18;;:::i;:::-;30796:2;30870:29;30892:6;30870:29;:::i;:::-;30862:37;;30954:4;30948;30944:15;30936:23;;30725:241;;;:::o;30972:98::-;31023:6;31057:5;31051:12;31041:22;;31030:40;;;:::o;31076:99::-;31128:6;31162:5;31156:12;31146:22;;31135:40;;;:::o;31181:168::-;31264:11;31298:6;31293:3;31286:19;31338:4;31333:3;31329:14;31314:29;;31276:73;;;;:::o;31355:169::-;31439:11;31473:6;31468:3;31461:19;31513:4;31508:3;31504:14;31489:29;;31451:73;;;;:::o;31530:148::-;31632:11;31669:3;31654:18;;31644:34;;;;:::o;31684:305::-;31724:3;31743:20;31761:1;31743:20;:::i;:::-;31738:25;;31777:20;31795:1;31777:20;:::i;:::-;31772:25;;31931:1;31863:66;31859:74;31856:1;31853:81;31850:2;;;31937:18;;:::i;:::-;31850:2;31981:1;31978;31974:9;31967:16;;31728:261;;;;:::o;31995:185::-;32035:1;32052:20;32070:1;32052:20;:::i;:::-;32047:25;;32086:20;32104:1;32086:20;:::i;:::-;32081:25;;32125:1;32115:2;;32130:18;;:::i;:::-;32115:2;32172:1;32169;32165:9;32160:14;;32037:143;;;;:::o;32186:348::-;32226:7;32249:20;32267:1;32249:20;:::i;:::-;32244:25;;32283:20;32301:1;32283:20;:::i;:::-;32278:25;;32471:1;32403:66;32399:74;32396:1;32393:81;32388:1;32381:9;32374:17;32370:105;32367:2;;;32478:18;;:::i;:::-;32367:2;32526:1;32523;32519:9;32508:20;;32234:300;;;;:::o;32540:191::-;32580:4;32600:20;32618:1;32600:20;:::i;:::-;32595:25;;32634:20;32652:1;32634:20;:::i;:::-;32629:25;;32673:1;32670;32667:8;32664:2;;;32678:18;;:::i;:::-;32664:2;32723:1;32720;32716:9;32708:17;;32585:146;;;;:::o;32737:96::-;32774:7;32803:24;32821:5;32803:24;:::i;:::-;32792:35;;32782:51;;;:::o;32839:90::-;32873:7;32916:5;32909:13;32902:21;32891:32;;32881:48;;;:::o;32935:149::-;32971:7;33011:66;33004:5;33000:78;32989:89;;32979:105;;;:::o;33090:126::-;33127:7;33167:42;33160:5;33156:54;33145:65;;33135:81;;;:::o;33222:77::-;33259:7;33288:5;33277:16;;33267:32;;;:::o;33305:154::-;33389:6;33384:3;33379;33366:30;33451:1;33442:6;33437:3;33433:16;33426:27;33356:103;;;:::o;33465:307::-;33533:1;33543:113;33557:6;33554:1;33551:13;33543:113;;;33642:1;33637:3;33633:11;33627:18;33623:1;33618:3;33614:11;33607:39;33579:2;33576:1;33572:10;33567:15;;33543:113;;;33674:6;33671:1;33668:13;33665:2;;;33754:1;33745:6;33740:3;33736:16;33729:27;33665:2;33514:258;;;;:::o;33778:320::-;33822:6;33859:1;33853:4;33849:12;33839:22;;33906:1;33900:4;33896:12;33927:18;33917:2;;33983:4;33975:6;33971:17;33961:27;;33917:2;34045;34037:6;34034:14;34014:18;34011:38;34008:2;;;34064:18;;:::i;:::-;34008:2;33829:269;;;;:::o;34104:281::-;34187:27;34209:4;34187:27;:::i;:::-;34179:6;34175:40;34317:6;34305:10;34302:22;34281:18;34269:10;34266:34;34263:62;34260:2;;;34328:18;;:::i;:::-;34260:2;34368:10;34364:2;34357:22;34147:238;;;:::o;34391:233::-;34430:3;34453:24;34471:5;34453:24;:::i;:::-;34444:33;;34499:66;34492:5;34489:77;34486:2;;;34569:18;;:::i;:::-;34486:2;34616:1;34609:5;34605:13;34598:20;;34434:190;;;:::o;34630:176::-;34662:1;34679:20;34697:1;34679:20;:::i;:::-;34674:25;;34713:20;34731:1;34713:20;:::i;:::-;34708:25;;34752:1;34742:2;;34757:18;;:::i;:::-;34742:2;34798:1;34795;34791:9;34786:14;;34664:142;;;;:::o;34812:180::-;34860:77;34857:1;34850:88;34957:4;34954:1;34947:15;34981:4;34978:1;34971:15;34998:180;35046:77;35043:1;35036:88;35143:4;35140:1;35133:15;35167:4;35164:1;35157:15;35184:180;35232:77;35229:1;35222:88;35329:4;35326:1;35319:15;35353:4;35350:1;35343:15;35370:180;35418:77;35415:1;35408:88;35515:4;35512:1;35505:15;35539:4;35536:1;35529:15;35556:102;35597:6;35648:2;35644:7;35639:2;35632:5;35628:14;35624:28;35614:38;;35604:54;;;:::o;35664:230::-;35804:34;35800:1;35792:6;35788:14;35781:58;35873:13;35868:2;35860:6;35856:15;35849:38;35770:124;:::o;35900:237::-;36040:34;36036:1;36028:6;36024:14;36017:58;36109:20;36104:2;36096:6;36092:15;36085:45;36006:131;:::o;36143:225::-;36283:34;36279:1;36271:6;36267:14;36260:58;36352:8;36347:2;36339:6;36335:15;36328:33;36249:119;:::o;36374:178::-;36514:30;36510:1;36502:6;36498:14;36491:54;36480:72;:::o;36558:223::-;36698:34;36694:1;36686:6;36682:14;36675:58;36767:6;36762:2;36754:6;36750:15;36743:31;36664:117;:::o;36787:175::-;36927:27;36923:1;36915:6;36911:14;36904:51;36893:69;:::o;36968:181::-;37108:33;37104:1;37096:6;37092:14;37085:57;37074:75;:::o;37155:231::-;37295:34;37291:1;37283:6;37279:14;37272:58;37364:14;37359:2;37351:6;37347:15;37340:39;37261:125;:::o;37392:243::-;37532:34;37528:1;37520:6;37516:14;37509:58;37601:26;37596:2;37588:6;37584:15;37577:51;37498:137;:::o;37641:229::-;37781:34;37777:1;37769:6;37765:14;37758:58;37850:12;37845:2;37837:6;37833:15;37826:37;37747:123;:::o;37876:174::-;38016:26;38012:1;38004:6;38000:14;37993:50;37982:68;:::o;38056:228::-;38196:34;38192:1;38184:6;38180:14;38173:58;38265:11;38260:2;38252:6;38248:15;38241:36;38162:122;:::o;38290:229::-;38430:34;38426:1;38418:6;38414:14;38407:58;38499:12;38494:2;38486:6;38482:15;38475:37;38396:123;:::o;38525:182::-;38665:34;38661:1;38653:6;38649:14;38642:58;38631:76;:::o;38713:238::-;38853:34;38849:1;38841:6;38837:14;38830:58;38922:21;38917:2;38909:6;38905:15;38898:46;38819:132;:::o;38957:231::-;39097:34;39093:1;39085:6;39081:14;39074:58;39166:14;39161:2;39153:6;39149:15;39142:39;39063:125;:::o;39194:182::-;39334:34;39330:1;39322:6;39318:14;39311:58;39300:76;:::o;39382:228::-;39522:34;39518:1;39510:6;39506:14;39499:58;39591:11;39586:2;39578:6;39574:15;39567:36;39488:122;:::o;39616:234::-;39756:34;39752:1;39744:6;39740:14;39733:58;39825:17;39820:2;39812:6;39808:15;39801:42;39722:128;:::o;39856:220::-;39996:34;39992:1;39984:6;39980:14;39973:58;40065:3;40060:2;40052:6;40048:15;40041:28;39962:114;:::o;40082:177::-;40222:29;40218:1;40210:6;40206:14;40199:53;40188:71;:::o;40265:174::-;40405:26;40401:1;40393:6;40389:14;40382:50;40371:68;:::o;40445:236::-;40585:34;40581:1;40573:6;40569:14;40562:58;40654:19;40649:2;40641:6;40637:15;40630:44;40551:130;:::o;40687:231::-;40827:34;40823:1;40815:6;40811:14;40804:58;40896:14;40891:2;40883:6;40879:15;40872:39;40793:125;:::o;40924:228::-;41064:34;41060:1;41052:6;41048:14;41041:58;41133:11;41128:2;41120:6;41116:15;41109:36;41030:122;:::o;41158:::-;41231:24;41249:5;41231:24;:::i;:::-;41224:5;41221:35;41211:2;;41270:1;41267;41260:12;41211:2;41201:79;:::o;41286:116::-;41356:21;41371:5;41356:21;:::i;:::-;41349:5;41346:32;41336:2;;41392:1;41389;41382:12;41336:2;41326:76;:::o;41408:120::-;41480:23;41497:5;41480:23;:::i;:::-;41473:5;41470:34;41460:2;;41518:1;41515;41508:12;41460:2;41450:78;:::o;41534:122::-;41607:24;41625:5;41607:24;:::i;:::-;41600:5;41597:35;41587:2;;41646:1;41643;41636:12;41587:2;41577:79;:::o

Swarm Source

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