Token Fruity Frens

Overview ERC-721

Total Supply:
0 FF

Holders:
1 addresses

Profile Summary

 
Contract:
0x3c1499aeeb2e651cf84d31b4f09258c9e7f9f5e30x3C1499AEeb2E651cF84D31b4f09258c9E7f9f5E3

Balance
0 FF
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FruityFrens

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-30
*/

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    function _baseExtension() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

        string memory base = _baseURI();
        string memory ext = _baseExtension();

        
        
       return string(abi.encodePacked(base, (tokenId + 1).toString(), ext));

    }

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

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

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

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

pragma solidity ^0.8.0;

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

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

    bool private _paused;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.7;

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }


    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

pragma solidity ^0.8.0;

contract FruityFrens is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    IERC2981,
    Pausable,
    Ownable,
    ERC721Burnable
{
    modifier onlyDevs {
         require(msg.sender == primaryDevAddress || msg.sender == secondaryDevAddress, "Dev Only: caller is not the developer");
        _;
    }
    
    event WithdrawFees(address indexed devAddress, uint256 amount);
    event WithdrawWrongTokens(address indexed devAddress,address tokenAddress, uint256 amount);
    event WithdrawWrongNfts(address indexed devAddress,address tokenAddress, uint256 tokenId);


    using Counters for Counters.Counter;
    using SafeMath for uint256;
    using Address for address;
    Counters.Counter private _tokenIdCounter;


    address  public royaltyAddress = 0x4f0FD61F4CDa527EeBE4B39C7Ed9aF540ce15586;
    address  public primaryDevAddress = 0x3B592c1d44327A5D05bA415262f7E6179f14E77a;
    address  public secondaryDevAddress = 0x1b0f1ff3EEc9B91FA8f379fe6a951b4fe145DE98;
    string public baseURI;
    string public baseExtension = ".json";


    // VARIABLES 
    uint256 public maxSupply = 1000;
    uint256 public maxBuy = 10;
    uint256 public price = 20 ether;
    // FEES
    uint256 public primaryDevFee = 4000;
    uint256 public secondaryDevFee = 3000;
    uint256 public royalty = 600;
    // COLLECTED FESS
    mapping(address => uint256) public devFees;
  
    constructor() ERC721("Fruity Frens", "FF") {
        _pause();
    }

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

     
    function splitFees(uint256 sentAmount) internal {

        uint256 primaryDevFeeAmount = sentAmount.mul(primaryDevFee).div(10000);
        uint256 secondaryDevFeeAmount = sentAmount.mul(secondaryDevFee).div(10000);
       
        devFees[primaryDevAddress] += primaryDevFeeAmount;
        devFees[secondaryDevAddress] += secondaryDevFeeAmount;

    } 

    function mint(uint256 amount) public payable {
        uint256 supply = totalSupply();
        require(!paused(),"Sale must be active to mint");
        require(amount > 0 && amount <= maxBuy,"Number of NFTs must be more than 0 and less than 10");
        require(msg.value == price * amount, "Must send correct price");
        require(supply + amount - 1 < maxSupply, "Cannot mint more than total supply");
        for (uint256 i = 0; i < amount; i++)
        internalMint(msg.sender);
        splitFees(msg.value);
    }

    

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

    function FruityFrensOwned(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function tokenExists(uint256 _id) external view returns (bool) {
        return (_exists(_id));
    }

    function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (royaltyAddress, (_salePrice * royalty) / 10000);
    }

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

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


    function setMaxBuy(uint256 newMaxBuy) public onlyOwner {
        maxBuy = newMaxBuy;
    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }
    
    
    function setURI(uint256 tokenId, string memory uri) external onlyOwner {
        _setTokenURI(tokenId, uri);
    }
    
 
    
    function setRoyalty(uint16 _royalty) external onlyOwner {
        require(_royalty >= 0, "Royalty must be greater than or equal to 0%");
        require(_royalty <= 750, "Royalty must be smaller than or equal to 7.5%" );
        royalty = _royalty;
    }
    
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
    }
    
    
    //Overrides
    
     function internalMint(address to) internal {
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    function safeMint(address to) public onlyOwner {
        internalMint(to);
    }
    
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    

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

 /// @dev withdraw fees
    function withdraw() public onlyDevs {
        uint256 amount = devFees[msg.sender];
        require(amount > 0,"No Fees:(");
        payable(msg.sender).transfer(amount);
        devFees[msg.sender] = 0;
        emit WithdrawFees(msg.sender,amount);
    }
    
    /// @dev withdraw ERC20 tokens
    function withdrawTokens(address _tokenContract) external onlyOwner {
        IERC20 tokenContract = IERC20(_tokenContract);
        uint256 _amount = tokenContract.balanceOf(address(this));
        tokenContract.transfer(owner(), _amount);
        emit WithdrawWrongTokens(msg.sender,_tokenContract,_amount);
    }

    /// @dev withdraw ERC721 tokens to the contract owner
    function withdrawNFT(address _tokenContract, uint256[] memory _id) external onlyOwner {
        IERC721 tokenContract = IERC721(_tokenContract);
        for (uint256 i = 0; i < _id.length; i++) {
            tokenContract.safeTransferFrom(address(this), owner(), _id[i]);
            emit WithdrawWrongNfts(msg.sender,_tokenContract,_id[i]);
        }
    }
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawWrongNfts","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"devAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawWrongTokens","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"FruityFrensOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052734f0fd61f4cda527eebe4b39c7ed9af540ce15586600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733b592c1d44327a5d05ba415262f7e6179f14e77a600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731b0f1ff3eec9b91fa8f379fe6a951b4fe145de98600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506011908051906020019062000150929190620003e2565b506103e8601255600a6013556801158e460913d00000601455610fa0601555610bb86016556102586017553480156200018857600080fd5b506040518060400160405280600c81526020017f467275697479204672656e7300000000000000000000000000000000000000008152506040518060400160405280600281526020017f464600000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200020d929190620003e2565b50806001908051906020019062000226929190620003e2565b5050506000600b60006101000a81548160ff0219169083151502179055506000620002566200030b60201b60201c565b905080600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620003056200031360201b60201c565b620005dc565b600033905090565b62000323620003cb60201b60201c565b1562000366576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035d90620004e7565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620003b26200030b60201b60201c565b604051620003c19190620004ca565b60405180910390a1565b6000600b60009054906101000a900460ff16905090565b828054620003f0906200054e565b90600052602060002090601f01602090048101928262000414576000855562000460565b82601f106200042f57805160ff191683800117855562000460565b8280016001018555821562000460579182015b828111156200045f57825182559160200191906001019062000442565b5b5090506200046f919062000473565b5090565b5b808211156200048e57600081600090555060010162000474565b5090565b6200049d816200051a565b82525050565b6000620004b260108362000509565b9150620004bf82620005b3565b602082019050919050565b6000602082019050620004e1600083018462000492565b92915050565b600060208201905081810360008301526200050281620004a3565b9050919050565b600082825260208201905092915050565b600062000527826200052e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200056757607f821691505b602082108114156200057e576200057d62000584565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b615fdc80620005ec6000396000f3fe6080604052600436106102ad5760003560e01c806370a0823111610175578063a64e0015116100dc578063cdaa2a4311610095578063f147efeb1161006f578063f147efeb14610a8d578063f2fde38b14610aca578063f38cc11114610af3578063f53bc83514610b1e576102ad565b8063cdaa2a43146109fa578063d5abeb0114610a25578063e985e9c514610a50576102ad565b8063a64e0015146108e8578063a879b63214610913578063ad2f852a1461093e578063b88d4fde14610969578063c668286214610992578063c87b56dd146109bd576102ad565b806391b7f5ed1161012e57806391b7f5ed146107fb57806395d89b41146108245780639bdedea51461084f578063a035b1fe14610878578063a0712d68146108a3578063a22cb465146108bf576102ad565b806370a082311461071157806370db69d61461074e578063715018a6146107795780638456cb5914610790578063862440e2146107a75780638da5cb5b146107d0576102ad565b80633ccfd60b116102195780634f6ccce7116101d25780634f6ccce7146105db57806355f804b3146106185780635b11c2ae146106415780635c975abb1461067e5780636352211e146106a95780636c0360eb146106e6576102ad565b80633ccfd60b146105095780633f4ba83a1461052057806340d097c31461053757806342842e0e1461056057806342966c681461058957806349df728c146105b2576102ad565b806318160ddd1161026b57806318160ddd146103e657806323b872dd1461041157806329ee566c1461043a5780632a55205a146104655780632f745c59146104a357806336e79a5a146104e0576102ad565b8062923f9e146102b257806301ffc9a7146102ef57806306d254da1461032c57806306fdde0314610355578063081812fc14610380578063095ea7b3146103bd575b600080fd5b3480156102be57600080fd5b506102d960048036038101906102d491906145f5565b610b47565b6040516102e69190614d97565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190614525565b610b59565b6040516103239190614d97565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906142d9565b610bd3565b005b34801561036157600080fd5b5061036a610c93565b6040516103779190614db2565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a291906145f5565b610d25565b6040516103b49190614cae565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df91906144b8565b610daa565b005b3480156103f257600080fd5b506103fb610ec2565b60405161040891906151b4565b60405180910390f35b34801561041d57600080fd5b5061043860048036038101906104339190614346565b610ecf565b005b34801561044657600080fd5b5061044f610f2f565b60405161045c91906151b4565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906146ab565b610f35565b60405161049a929190614d4c565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c591906144b8565b610f81565b6040516104d791906151b4565b60405180910390f35b3480156104ec57600080fd5b50610507600480360381019061050291906145c8565b611026565b005b34801561051557600080fd5b5061051e611141565b005b34801561052c57600080fd5b5061053561138d565b005b34801561054357600080fd5b5061055e600480360381019061055991906142d9565b611413565b005b34801561056c57600080fd5b5061058760048036038101906105829190614346565b61149b565b005b34801561059557600080fd5b506105b060048036038101906105ab91906145f5565b6114bb565b005b3480156105be57600080fd5b506105d960048036038101906105d491906142d9565b611517565b005b3480156105e757600080fd5b5061060260048036038101906105fd91906145f5565b61170f565b60405161060f91906151b4565b60405180910390f35b34801561062457600080fd5b5061063f600480360381019061063a919061457f565b611780565b005b34801561064d57600080fd5b50610668600480360381019061066391906142d9565b611816565b6040516106759190614d75565b60405180910390f35b34801561068a57600080fd5b50610693611920565b6040516106a09190614d97565b60405180910390f35b3480156106b557600080fd5b506106d060048036038101906106cb91906145f5565b611937565b6040516106dd9190614cae565b60405180910390f35b3480156106f257600080fd5b506106fb6119e9565b6040516107089190614db2565b60405180910390f35b34801561071d57600080fd5b50610738600480360381019061073391906142d9565b611a77565b60405161074591906151b4565b60405180910390f35b34801561075a57600080fd5b50610763611b2f565b60405161077091906151b4565b60405180910390f35b34801561078557600080fd5b5061078e611b35565b005b34801561079c57600080fd5b506107a5611c72565b005b3480156107b357600080fd5b506107ce60048036038101906107c9919061464f565b611cf8565b005b3480156107dc57600080fd5b506107e5611d82565b6040516107f29190614cae565b60405180910390f35b34801561080757600080fd5b50610822600480360381019061081d91906145f5565b611dac565b005b34801561083057600080fd5b50610839611e32565b6040516108469190614db2565b60405180910390f35b34801561085b57600080fd5b506108766004803603810190610871919061441c565b611ec4565b005b34801561088457600080fd5b5061088d612064565b60405161089a91906151b4565b60405180910390f35b6108bd60048036038101906108b891906145f5565b61206a565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614478565b6121ee565b005b3480156108f457600080fd5b506108fd61236f565b60405161090a91906151b4565b60405180910390f35b34801561091f57600080fd5b50610928612375565b6040516109359190614cae565b60405180910390f35b34801561094a57600080fd5b5061095361239b565b6040516109609190614cae565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b9190614399565b6123c1565b005b34801561099e57600080fd5b506109a7612423565b6040516109b49190614db2565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df91906145f5565b6124b1565b6040516109f19190614db2565b60405180910390f35b348015610a0657600080fd5b50610a0f6124c3565b604051610a1c91906151b4565b60405180910390f35b348015610a3157600080fd5b50610a3a6124c9565b604051610a4791906151b4565b60405180910390f35b348015610a5c57600080fd5b50610a776004803603810190610a729190614306565b6124cf565b604051610a849190614d97565b60405180910390f35b348015610a9957600080fd5b50610ab46004803603810190610aaf91906142d9565b612563565b604051610ac191906151b4565b60405180910390f35b348015610ad657600080fd5b50610af16004803603810190610aec91906142d9565b61257b565b005b348015610aff57600080fd5b50610b08612727565b604051610b159190614cae565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b4091906145f5565b61274d565b005b6000610b52826127d3565b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bcc5750610bcb8261283f565b5b9050919050565b610bdb6128b9565b73ffffffffffffffffffffffffffffffffffffffff16610bf9611d82565b73ffffffffffffffffffffffffffffffffffffffff1614610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c46906150b4565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060008054610ca2906154d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cce906154d7565b8015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050505050905090565b6000610d30826127d3565b610d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6690615094565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db582611937565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1d906150f4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e456128b9565b73ffffffffffffffffffffffffffffffffffffffff161480610e745750610e7381610e6e6128b9565b6124cf565b5b610eb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaa90614f74565b60405180910390fd5b610ebd83836128c1565b505050565b6000600880549050905090565b610ee0610eda6128b9565b8261297a565b610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690615114565b60405180910390fd5b610f2a838383612a58565b505050565b60175481565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661271060175485610f6c9190615385565b610f769190615354565b915091509250929050565b6000610f8c83611a77565b8210610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc490614df4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61102e6128b9565b73ffffffffffffffffffffffffffffffffffffffff1661104c611d82565b73ffffffffffffffffffffffffffffffffffffffff16146110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906150b4565b60405180910390fd5b60008161ffff1610156110ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e190614f94565b60405180910390fd5b6102ee8161ffff161115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90615194565b60405180910390fd5b8061ffff1660178190555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111ea5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090615014565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790615154565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112f6573d6000803e3d6000fd5b506000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167f9bba815921f12cb7b1408e14b5ade745234397d39623ae5e7c82d693cb45815f8260405161138291906151b4565b60405180910390a250565b6113956128b9565b73ffffffffffffffffffffffffffffffffffffffff166113b3611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611409576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611400906150b4565b60405180910390fd5b611411612cb4565b565b61141b6128b9565b73ffffffffffffffffffffffffffffffffffffffff16611439611d82565b73ffffffffffffffffffffffffffffffffffffffff161461148f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611486906150b4565b60405180910390fd5b61149881612d56565b50565b6114b6838383604051806020016040528060008152506123c1565b505050565b6114cc6114c66128b9565b8261297a565b61150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290615174565b60405180910390fd5b61151481612d76565b50565b61151f6128b9565b73ffffffffffffffffffffffffffffffffffffffff1661153d611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611593576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158a906150b4565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115d39190614cae565b60206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116239190614622565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611649611d82565b836040518363ffffffff1660e01b8152600401611667929190614d4c565b602060405180830381600087803b15801561168157600080fd5b505af1158015611695573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b991906144f8565b503373ffffffffffffffffffffffffffffffffffffffff167f5aa586896a67fb05c3b86276f66eecee7da00719d0e7299c403596fa2ec58ca48483604051611702929190614d4c565b60405180910390a2505050565b6000611719610ec2565b821061175a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175190615134565b60405180910390fd5b6008828154811061176e5761176d615670565b5b90600052602060002001549050919050565b6117886128b9565b73ffffffffffffffffffffffffffffffffffffffff166117a6611d82565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f3906150b4565b60405180910390fd5b8060109080519060200190611812929190613fd0565b5050565b6060600061182383611a77565b9050600081141561188057600067ffffffffffffffff8111156118495761184861569f565b5b6040519080825280602002602001820160405280156118775781602001602082028036833780820191505090505b5091505061191b565b60008167ffffffffffffffff81111561189c5761189b61569f565b5b6040519080825280602002602001820160405280156118ca5781602001602082028036833780820191505090505b50905060005b82811015611914576118e28582610f81565b8282815181106118f5576118f4615670565b5b602002602001018181525050808061190c9061553a565b9150506118d0565b8193505050505b919050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790614fd4565b60405180910390fd5b80915050919050565b601080546119f6906154d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a22906154d7565b8015611a6f5780601f10611a4457610100808354040283529160200191611a6f565b820191906000526020600020905b815481529060010190602001808311611a5257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adf90614fb4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60135481565b611b3d6128b9565b73ffffffffffffffffffffffffffffffffffffffff16611b5b611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba8906150b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611c7a6128b9565b73ffffffffffffffffffffffffffffffffffffffff16611c98611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce5906150b4565b60405180910390fd5b611cf6612d82565b565b611d006128b9565b73ffffffffffffffffffffffffffffffffffffffff16611d1e611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906150b4565b60405180910390fd5b611d7e8282612e25565b5050565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611db46128b9565b73ffffffffffffffffffffffffffffffffffffffff16611dd2611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1f906150b4565b60405180910390fd5b8060148190555050565b606060018054611e41906154d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6d906154d7565b8015611eba5780601f10611e8f57610100808354040283529160200191611eba565b820191906000526020600020905b815481529060010190602001808311611e9d57829003601f168201915b5050505050905090565b611ecc6128b9565b73ffffffffffffffffffffffffffffffffffffffff16611eea611d82565b73ffffffffffffffffffffffffffffffffffffffff1614611f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f37906150b4565b60405180910390fd5b600082905060005b825181101561205e578173ffffffffffffffffffffffffffffffffffffffff166342842e0e30611f76611d82565b868581518110611f8957611f88615670565b5b60200260200101516040518463ffffffff1660e01b8152600401611faf93929190614cc9565b600060405180830381600087803b158015611fc957600080fd5b505af1158015611fdd573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff167fb8dbf4ce06446b88ef02ffd28a948c2637ac80fb0bd4d3a31c70878c1046eb7f8585848151811061202d5761202c615670565b5b6020026020010151604051612043929190614d4c565b60405180910390a280806120569061553a565b915050611f48565b50505050565b60145481565b6000612074610ec2565b905061207e611920565b156120be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b590614f14565b60405180910390fd5b6000821180156120d057506013548211155b61210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690614e94565b60405180910390fd5b8160145461211d9190615385565b341461215e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215590614e74565b60405180910390fd5b6012546001838361216f91906152fe565b61217991906153df565b106121b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b090614eb4565b60405180910390fd5b60005b828110156121e0576121cd33612d56565b80806121d89061553a565b9150506121bc565b506121ea34612e99565b5050565b6121f66128b9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225b90614ef4565b60405180910390fd5b80600560006122716128b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661231e6128b9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123639190614d97565b60405180910390a35050565b60165481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6123d26123cc6128b9565b8361297a565b612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890615114565b60405180910390fd5b61241d84848484612fe8565b50505050565b60118054612430906154d7565b80601f016020809104026020016040519081016040528092919081815260200182805461245c906154d7565b80156124a95780601f1061247e576101008083540402835291602001916124a9565b820191906000526020600020905b81548152906001019060200180831161248c57829003601f168201915b505050505081565b60606124bc82613044565b9050919050565b60155481565b60125481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60186020528060005260406000206000915090505481565b6125836128b9565b73ffffffffffffffffffffffffffffffffffffffff166125a1611d82565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee906150b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90614e34565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6127556128b9565b73ffffffffffffffffffffffffffffffffffffffff16612773611d82565b73ffffffffffffffffffffffffffffffffffffffff16146127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c0906150b4565b60405180910390fd5b8060138190555050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128b257506128b1826130e7565b5b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661293483611937565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612985826127d3565b6129c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bb90614f34565b60405180910390fd5b60006129cf83611937565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a3e57508373ffffffffffffffffffffffffffffffffffffffff16612a2684610d25565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a4f5750612a4e81856124cf565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a7882611937565b73ffffffffffffffffffffffffffffffffffffffff1614612ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac5906150d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3590614ed4565b60405180910390fd5b612b498383836131c9565b612b546000826128c1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ba491906153df565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bfb91906152fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612cbc611920565b612cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf290614dd4565b60405180910390fd5b6000600b60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612d3f6128b9565b604051612d4c9190614cae565b60405180910390a1565b612d6981612d64600c613221565b61322f565b612d73600c61324d565b50565b612d7f81613263565b50565b612d8a611920565b15612dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc190614f54565b60405180910390fd5b6001600b60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e0e6128b9565b604051612e1b9190614cae565b60405180910390a1565b612e2e826127d3565b612e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6490614ff4565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190612e94929190613fd0565b505050565b6000612ec4612710612eb6601554856132b690919063ffffffff16565b61333190919063ffffffff16565b90506000612ef1612710612ee3601654866132b690919063ffffffff16565b61333190919063ffffffff16565b90508160186000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6491906152fe565b925050819055508060186000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fdc91906152fe565b92505081905550505050565b612ff3848484612a58565b612fff8484848461337b565b61303e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303590614e14565b60405180910390fd5b50505050565b606061304f826127d3565b61308e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308590615054565b60405180910390fd5b6000613098613512565b905060006130a46135a4565b9050816130bc6001866130b791906152fe565b613636565b826040516020016130cf93929190614c7d565b60405160208183030381529060405292505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131b257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131c257506131c182613797565b5b9050919050565b6131d1611920565b15613211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320890614f54565b60405180910390fd5b61321c838383613801565b505050565b600081600001549050919050565b613249828260405180602001604052806000815250613915565b5050565b6001816000016000828254019250508190555050565b61326c81613970565b6000600a6000838152602001908152602001600020805461328c906154d7565b9050146132b357600a600082815260200190815260200160002060006132b29190614056565b5b50565b6000808314156132c9576000905061332b565b600082846132d79190615385565b90508284826132e69190615354565b14613326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331d90615074565b60405180910390fd5b809150505b92915050565b600061337383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a81565b905092915050565b600061339c8473ffffffffffffffffffffffffffffffffffffffff16613ae4565b15613505578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133c56128b9565b8786866040518563ffffffff1660e01b81526004016133e79493929190614d00565b602060405180830381600087803b15801561340157600080fd5b505af192505050801561343257506040513d601f19601f8201168201806040525081019061342f9190614552565b60015b6134b5573d8060008114613462576040519150601f19603f3d011682016040523d82523d6000602084013e613467565b606091505b506000815114156134ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a490614e14565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061350a565b600190505b949350505050565b606060108054613521906154d7565b80601f016020809104026020016040519081016040528092919081815260200182805461354d906154d7565b801561359a5780601f1061356f5761010080835404028352916020019161359a565b820191906000526020600020905b81548152906001019060200180831161357d57829003601f168201915b5050505050905090565b6060601180546135b3906154d7565b80601f01602080910402602001604051908101604052809291908181526020018280546135df906154d7565b801561362c5780601f106136015761010080835404028352916020019161362c565b820191906000526020600020905b81548152906001019060200180831161360f57829003601f168201915b5050505050905090565b6060600082141561367e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613792565b600082905060005b600082146136b05780806136999061553a565b915050600a826136a99190615354565b9150613686565b60008167ffffffffffffffff8111156136cc576136cb61569f565b5b6040519080825280601f01601f1916602001820160405280156136fe5781602001600182028036833780820191505090505b5090505b6000851461378b5760018261371791906153df565b9150600a856137269190615583565b603061373291906152fe565b60f81b81838151811061374857613747615670565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137849190615354565b9450613702565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61380c838383613af7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561384f5761384a81613afc565b61388e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461388d5761388c8382613b45565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156138d1576138cc81613cb2565b613910565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461390f5761390e8282613d83565b5b5b505050565b61391f8383613e02565b61392c600084848461337b565b61396b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161396290614e14565b60405180910390fd5b505050565b600061397b82611937565b9050613989816000846131c9565b6139946000836128c1565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139e491906153df565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008083118290613ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613abf9190614db2565b60405180910390fd5b5060008385613ad79190615354565b9050809150509392505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613b5284611a77565b613b5c91906153df565b9050600060076000848152602001908152602001600020549050818114613c41576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613cc691906153df565b9050600060096000848152602001908152602001600020549050600060088381548110613cf657613cf5615670565b5b906000526020600020015490508060088381548110613d1857613d17615670565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d6757613d66615641565b5b6001900381819060005260206000200160009055905550505050565b6000613d8e83611a77565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6990615034565b60405180910390fd5b613e7b816127d3565b15613ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613eb290614e54565b60405180910390fd5b613ec7600083836131c9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f1791906152fe565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613fdc906154d7565b90600052602060002090601f016020900481019282613ffe5760008555614045565b82601f1061401757805160ff1916838001178555614045565b82800160010185558215614045579182015b82811115614044578251825591602001919060010190614029565b5b5090506140529190614096565b5090565b508054614062906154d7565b6000825580601f106140745750614093565b601f0160209004906000526020600020908101906140929190614096565b5b50565b5b808211156140af576000816000905550600101614097565b5090565b60006140c66140c1846151f4565b6151cf565b905080838252602082019050828560208602820111156140e9576140e86156d3565b5b60005b8581101561411957816140ff88826142af565b8452602084019350602083019250506001810190506140ec565b5050509392505050565b600061413661413184615220565b6151cf565b905082815260208101848484011115614152576141516156d8565b5b61415d848285615495565b509392505050565b600061417861417384615251565b6151cf565b905082815260208101848484011115614194576141936156d8565b5b61419f848285615495565b509392505050565b6000813590506141b681615f33565b92915050565b600082601f8301126141d1576141d06156ce565b5b81356141e18482602086016140b3565b91505092915050565b6000813590506141f981615f4a565b92915050565b60008151905061420e81615f4a565b92915050565b60008135905061422381615f61565b92915050565b60008151905061423881615f61565b92915050565b600082601f830112614253576142526156ce565b5b8135614263848260208601614123565b91505092915050565b600082601f830112614281576142806156ce565b5b8135614291848260208601614165565b91505092915050565b6000813590506142a981615f78565b92915050565b6000813590506142be81615f8f565b92915050565b6000815190506142d381615f8f565b92915050565b6000602082840312156142ef576142ee6156e2565b5b60006142fd848285016141a7565b91505092915050565b6000806040838503121561431d5761431c6156e2565b5b600061432b858286016141a7565b925050602061433c858286016141a7565b9150509250929050565b60008060006060848603121561435f5761435e6156e2565b5b600061436d868287016141a7565b935050602061437e868287016141a7565b925050604061438f868287016142af565b9150509250925092565b600080600080608085870312156143b3576143b26156e2565b5b60006143c1878288016141a7565b94505060206143d2878288016141a7565b93505060406143e3878288016142af565b925050606085013567ffffffffffffffff811115614404576144036156dd565b5b6144108782880161423e565b91505092959194509250565b60008060408385031215614433576144326156e2565b5b6000614441858286016141a7565b925050602083013567ffffffffffffffff811115614462576144616156dd565b5b61446e858286016141bc565b9150509250929050565b6000806040838503121561448f5761448e6156e2565b5b600061449d858286016141a7565b92505060206144ae858286016141ea565b9150509250929050565b600080604083850312156144cf576144ce6156e2565b5b60006144dd858286016141a7565b92505060206144ee858286016142af565b9150509250929050565b60006020828403121561450e5761450d6156e2565b5b600061451c848285016141ff565b91505092915050565b60006020828403121561453b5761453a6156e2565b5b600061454984828501614214565b91505092915050565b600060208284031215614568576145676156e2565b5b600061457684828501614229565b91505092915050565b600060208284031215614595576145946156e2565b5b600082013567ffffffffffffffff8111156145b3576145b26156dd565b5b6145bf8482850161426c565b91505092915050565b6000602082840312156145de576145dd6156e2565b5b60006145ec8482850161429a565b91505092915050565b60006020828403121561460b5761460a6156e2565b5b6000614619848285016142af565b91505092915050565b600060208284031215614638576146376156e2565b5b6000614646848285016142c4565b91505092915050565b60008060408385031215614666576146656156e2565b5b6000614674858286016142af565b925050602083013567ffffffffffffffff811115614695576146946156dd565b5b6146a18582860161426c565b9150509250929050565b600080604083850312156146c2576146c16156e2565b5b60006146d0858286016142af565b92505060206146e1858286016142af565b9150509250929050565b60006146f78383614c5f565b60208301905092915050565b61470c81615413565b82525050565b600061471d82615292565b61472781856152c0565b935061473283615282565b8060005b8381101561476357815161474a88826146eb565b9750614755836152b3565b925050600181019050614736565b5085935050505092915050565b61477981615425565b82525050565b600061478a8261529d565b61479481856152d1565b93506147a48185602086016154a4565b6147ad816156e7565b840191505092915050565b60006147c3826152a8565b6147cd81856152e2565b93506147dd8185602086016154a4565b6147e6816156e7565b840191505092915050565b60006147fc826152a8565b61480681856152f3565b93506148168185602086016154a4565b80840191505092915050565b600061482f6014836152e2565b915061483a826156f8565b602082019050919050565b6000614852602b836152e2565b915061485d82615721565b604082019050919050565b60006148756032836152e2565b915061488082615770565b604082019050919050565b60006148986026836152e2565b91506148a3826157bf565b604082019050919050565b60006148bb601c836152e2565b91506148c68261580e565b602082019050919050565b60006148de6017836152e2565b91506148e982615837565b602082019050919050565b60006149016033836152e2565b915061490c82615860565b604082019050919050565b60006149246022836152e2565b915061492f826158af565b604082019050919050565b60006149476024836152e2565b9150614952826158fe565b604082019050919050565b600061496a6019836152e2565b91506149758261594d565b602082019050919050565b600061498d601b836152e2565b915061499882615976565b602082019050919050565b60006149b0602c836152e2565b91506149bb8261599f565b604082019050919050565b60006149d36010836152e2565b91506149de826159ee565b602082019050919050565b60006149f66038836152e2565b9150614a0182615a17565b604082019050919050565b6000614a19602b836152e2565b9150614a2482615a66565b604082019050919050565b6000614a3c602a836152e2565b9150614a4782615ab5565b604082019050919050565b6000614a5f6029836152e2565b9150614a6a82615b04565b604082019050919050565b6000614a82602e836152e2565b9150614a8d82615b53565b604082019050919050565b6000614aa56025836152e2565b9150614ab082615ba2565b604082019050919050565b6000614ac86020836152e2565b9150614ad382615bf1565b602082019050919050565b6000614aeb6031836152e2565b9150614af682615c1a565b604082019050919050565b6000614b0e6021836152e2565b9150614b1982615c69565b604082019050919050565b6000614b31602c836152e2565b9150614b3c82615cb8565b604082019050919050565b6000614b546020836152e2565b9150614b5f82615d07565b602082019050919050565b6000614b776029836152e2565b9150614b8282615d30565b604082019050919050565b6000614b9a6021836152e2565b9150614ba582615d7f565b604082019050919050565b6000614bbd6031836152e2565b9150614bc882615dce565b604082019050919050565b6000614be0602c836152e2565b9150614beb82615e1d565b604082019050919050565b6000614c036009836152e2565b9150614c0e82615e6c565b602082019050919050565b6000614c266030836152e2565b9150614c3182615e95565b604082019050919050565b6000614c49602d836152e2565b9150614c5482615ee4565b604082019050919050565b614c688161548b565b82525050565b614c778161548b565b82525050565b6000614c8982866147f1565b9150614c9582856147f1565b9150614ca182846147f1565b9150819050949350505050565b6000602082019050614cc36000830184614703565b92915050565b6000606082019050614cde6000830186614703565b614ceb6020830185614703565b614cf86040830184614c6e565b949350505050565b6000608082019050614d156000830187614703565b614d226020830186614703565b614d2f6040830185614c6e565b8181036060830152614d41818461477f565b905095945050505050565b6000604082019050614d616000830185614703565b614d6e6020830184614c6e565b9392505050565b60006020820190508181036000830152614d8f8184614712565b905092915050565b6000602082019050614dac6000830184614770565b92915050565b60006020820190508181036000830152614dcc81846147b8565b905092915050565b60006020820190508181036000830152614ded81614822565b9050919050565b60006020820190508181036000830152614e0d81614845565b9050919050565b60006020820190508181036000830152614e2d81614868565b9050919050565b60006020820190508181036000830152614e4d8161488b565b9050919050565b60006020820190508181036000830152614e6d816148ae565b9050919050565b60006020820190508181036000830152614e8d816148d1565b9050919050565b60006020820190508181036000830152614ead816148f4565b9050919050565b60006020820190508181036000830152614ecd81614917565b9050919050565b60006020820190508181036000830152614eed8161493a565b9050919050565b60006020820190508181036000830152614f0d8161495d565b9050919050565b60006020820190508181036000830152614f2d81614980565b9050919050565b60006020820190508181036000830152614f4d816149a3565b9050919050565b60006020820190508181036000830152614f6d816149c6565b9050919050565b60006020820190508181036000830152614f8d816149e9565b9050919050565b60006020820190508181036000830152614fad81614a0c565b9050919050565b60006020820190508181036000830152614fcd81614a2f565b9050919050565b60006020820190508181036000830152614fed81614a52565b9050919050565b6000602082019050818103600083015261500d81614a75565b9050919050565b6000602082019050818103600083015261502d81614a98565b9050919050565b6000602082019050818103600083015261504d81614abb565b9050919050565b6000602082019050818103600083015261506d81614ade565b9050919050565b6000602082019050818103600083015261508d81614b01565b9050919050565b600060208201905081810360008301526150ad81614b24565b9050919050565b600060208201905081810360008301526150cd81614b47565b9050919050565b600060208201905081810360008301526150ed81614b6a565b9050919050565b6000602082019050818103600083015261510d81614b8d565b9050919050565b6000602082019050818103600083015261512d81614bb0565b9050919050565b6000602082019050818103600083015261514d81614bd3565b9050919050565b6000602082019050818103600083015261516d81614bf6565b9050919050565b6000602082019050818103600083015261518d81614c19565b9050919050565b600060208201905081810360008301526151ad81614c3c565b9050919050565b60006020820190506151c96000830184614c6e565b92915050565b60006151d96151ea565b90506151e58282615509565b919050565b6000604051905090565b600067ffffffffffffffff82111561520f5761520e61569f565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561523b5761523a61569f565b5b615244826156e7565b9050602081019050919050565b600067ffffffffffffffff82111561526c5761526b61569f565b5b615275826156e7565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006153098261548b565b91506153148361548b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615349576153486155b4565b5b828201905092915050565b600061535f8261548b565b915061536a8361548b565b92508261537a576153796155e3565b5b828204905092915050565b60006153908261548b565b915061539b8361548b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153d4576153d36155b4565b5b828202905092915050565b60006153ea8261548b565b91506153f58361548b565b925082821015615408576154076155b4565b5b828203905092915050565b600061541e8261546b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156154c25780820151818401526020810190506154a7565b838111156154d1576000848401525b50505050565b600060028204905060018216806154ef57607f821691505b6020821081141561550357615502615612565b5b50919050565b615512826156e7565b810181811067ffffffffffffffff821117156155315761553061569f565b5b80604052505050565b60006155458261548b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615578576155776155b4565b5b600182019050919050565b600061558e8261548b565b91506155998361548b565b9250826155a9576155a86155e3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d7573742073656e6420636f7272656374207072696365000000000000000000600082015250565b7f4e756d626572206f66204e465473206d757374206265206d6f7265207468616e60008201527f203020616e64206c657373207468616e20313000000000000000000000000000602082015250565b7f43616e6e6f74206d696e74206d6f7265207468616e20746f74616c207375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f526f79616c7479206d7573742062652067726561746572207468616e206f722060008201527f657175616c20746f203025000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f446576204f6e6c793a2063616c6c6572206973206e6f7420746865206465766560008201527f6c6f706572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f20466565733a280000000000000000000000000000000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f526f79616c7479206d75737420626520736d616c6c6572207468616e206f722060008201527f657175616c20746f20372e352500000000000000000000000000000000000000602082015250565b615f3c81615413565b8114615f4757600080fd5b50565b615f5381615425565b8114615f5e57600080fd5b50565b615f6a81615431565b8114615f7557600080fd5b50565b615f818161545d565b8114615f8c57600080fd5b50565b615f988161548b565b8114615fa357600080fd5b5056fea2646970667358221220877eed653ae06318f4cfa9557e85be9bcfd5fc234638be98ea39ca537eb61c4c64736f6c63430008070033

Deployed ByteCode Sourcemap

54629:6854:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58036:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59702:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59290:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22839:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24529:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24052:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37613:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25588:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55945:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58147:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37194:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59020:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60422:261;;;;;;;;;;;;;:::i;:::-;;58492:65;;;;;;;;;;;;;:::i;:::-;;59602:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26035:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50069:282;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60731:319;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37803:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58667:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57491:537;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46066:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22446:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55642:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22089:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55775:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49023:148;;;;;;;;;;;;;:::i;:::-;;58423:61;;;;;;;;;;;;;:::i;:::-;;58883:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48372:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58777:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23008:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61117:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55808:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56739:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24909:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55901:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55555:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55388:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26291:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55670:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57287:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55859:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55737:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25307:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56003:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49326:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55470:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58567:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58036:103;58093:4;58118:12;58126:3;58118:7;:12::i;:::-;58110:21;;58036:103;;;:::o;59702:292::-;59850:4;59907:26;59892:41;;;:11;:41;;;;:94;;;;59950:36;59974:11;59950:23;:36::i;:::-;59892:94;59872:114;;59702:292;;;:::o;59290:122::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59389:15:::1;59372:14;;:32;;;;;;;;;;;;;;;;;;59290:122:::0;:::o;22839:100::-;22893:13;22926:5;22919:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22839:100;:::o;24529:308::-;24650:7;24697:16;24705:7;24697;:16::i;:::-;24675:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;24805:15;:24;24821:7;24805:24;;;;;;;;;;;;;;;;;;;;;24798:31;;24529:308;;;:::o;24052:411::-;24133:13;24149:23;24164:7;24149:14;:23::i;:::-;24133:39;;24197:5;24191:11;;:2;:11;;;;24183:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24291:5;24275:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24300:37;24317:5;24324:12;:10;:12::i;:::-;24300:16;:37::i;:::-;24275:62;24253:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24434:21;24443:2;24447:7;24434:8;:21::i;:::-;24122:341;24052:411;;:::o;37613:113::-;37674:7;37701:10;:17;;;;37694:24;;37613:113;:::o;25588:376::-;25797:41;25816:12;:10;:12::i;:::-;25830:7;25797:18;:41::i;:::-;25775:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;25928:28;25938:4;25944:2;25948:7;25928:9;:28::i;:::-;25588:376;;;:::o;55945:28::-;;;;:::o;58147:238::-;58265:16;58283:21;58330:14;;;;;;;;;;;58371:5;58360:7;;58347:10;:20;;;;:::i;:::-;58346:30;;;;:::i;:::-;58322:55;;;;58147:238;;;;;:::o;37194:343::-;37336:7;37391:23;37408:5;37391:16;:23::i;:::-;37383:5;:31;37361:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;37503:12;:19;37516:5;37503:19;;;;;;;;;;;;;;;:26;37523:5;37503:26;;;;;;;;;;;;37496:33;;37194:343;;;;:::o;59020:258::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59107:1:::1;59095:8;:13;;;;59087:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59187:3;59175:8;:15;;;;59167:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;59262:8;59252:18;;:7;:18;;;;59020:258:::0;:::o;60422:261::-;54836:17;;;;;;;;;;;54822:31;;:10;:31;;;:68;;;;54871:19;;;;;;;;;;;54857:33;;:10;:33;;;54822:68;54814:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;60469:14:::1;60486:7;:19;60494:10;60486:19;;;;;;;;;;;;;;;;60469:36;;60533:1;60524:6;:10;60516:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;60566:10;60558:28;;:36;60587:6;60558:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60627:1;60605:7;:19;60613:10;60605:19;;;;;;;;;;;;;;;:23;;;;60657:10;60644:31;;;60668:6;60644:31;;;;;;:::i;:::-;;;;;;;;60458:225;60422:261::o:0;58492:65::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58539:10:::1;:8;:10::i;:::-;58492:65::o:0;59602:82::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59660:16:::1;59673:2;59660:12;:16::i;:::-;59602:82:::0;:::o;26035:185::-;26173:39;26190:4;26196:2;26200:7;26173:39;;;;;;;;;;;;:16;:39::i;:::-;26035:185;;;:::o;50069:282::-;50201:41;50220:12;:10;:12::i;:::-;50234:7;50201:18;:41::i;:::-;50179:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;50329:14;50335:7;50329:5;:14::i;:::-;50069:282;:::o;60731:319::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60809:20:::1;60839:14;60809:45;;60865:15;60883:13;:23;;;60915:4;60883:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60865:56;;60932:13;:22;;;60955:7;:5;:7::i;:::-;60964;60932:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61008:10;60988:54;;;61019:14;61034:7;60988:54;;;;;;;:::i;:::-;;;;;;;;60798:252;;60731:319:::0;:::o;37803:320::-;37923:7;37978:30;:28;:30::i;:::-;37970:5;:38;37948:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;38098:10;38109:5;38098:17;;;;;;;;:::i;:::-;;;;;;;;;;38091:24;;37803:320;;;:::o;58667:102::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58751:10:::1;58741:7;:20;;;;;;;;;;;;:::i;:::-;;58667:102:::0;:::o;57491:537::-;57583:16;57617:18;57638:17;57648:6;57638:9;:17::i;:::-;57617:38;;57684:1;57670:10;:15;57666:355;;;57723:1;57709:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57702:23;;;;;57666:355;57758:23;57798:10;57784:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57758:51;;57824:13;57852:130;57876:10;57868:5;:18;57852:130;;;57932:34;57952:6;57960:5;57932:19;:34::i;:::-;57916:6;57923:5;57916:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;57888:7;;;;;:::i;:::-;;;;57852:130;;;58003:6;57996:13;;;;;57491:537;;;;:::o;46066:86::-;46113:4;46137:7;;;;;;;;;;;46130:14;;46066:86;:::o;22446:326::-;22563:7;22588:13;22604:7;:16;22612:7;22604:16;;;;;;;;;;;;;;;;;;;;;22588:32;;22670:1;22653:19;;:5;:19;;;;22631:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;22759:5;22752:12;;;22446:326;;;:::o;55642:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22089:295::-;22206:7;22270:1;22253:19;;:5;:19;;;;22231:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22360:9;:16;22370:5;22360:16;;;;;;;;;;;;;;;;22353:23;;22089:295;;;:::o;55775:26::-;;;;:::o;49023:148::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49130:1:::1;49093:40;;49114:6;;;;;;;;;;;49093:40;;;;;;;;;;;;49161:1;49144:6;;:19;;;;;;;;;;;;;;;;;;49023:148::o:0;58423:61::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58468:8:::1;:6;:8::i;:::-;58423:61::o:0;58883:116::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58965:26:::1;58978:7;58987:3;58965:12;:26::i;:::-;58883:116:::0;;:::o;48372:87::-;48418:7;48445:6;;;;;;;;;;;48438:13;;48372:87;:::o;58777:88::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58849:8:::1;58841:5;:16;;;;58777:88:::0;:::o;23008:104::-;23064:13;23097:7;23090:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23008:104;:::o;61117:363::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61214:21:::1;61246:14;61214:47;;61277:9;61272:201;61296:3;:10;61292:1;:14;61272:201;;;61328:13;:30;;;61367:4;61374:7;:5;:7::i;:::-;61383:3;61387:1;61383:6;;;;;;;;:::i;:::-;;;;;;;;61328:62;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61428:10;61410:51;;;61439:14;61454:3;61458:1;61454:6;;;;;;;;:::i;:::-;;;;;;;;61410:51;;;;;;;:::i;:::-;;;;;;;;61308:3;;;;;:::i;:::-;;;;61272:201;;;;61203:277;61117:363:::0;;:::o;55808:31::-;;;;:::o;56739:532::-;56795:14;56812:13;:11;:13::i;:::-;56795:30;;56845:8;:6;:8::i;:::-;56844:9;56836:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;56912:1;56903:6;:10;:30;;;;;56927:6;;56917;:16;;56903:30;56895:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;57028:6;57020:5;;:14;;;;:::i;:::-;57007:9;:27;56999:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57103:9;;57099:1;57090:6;57081;:15;;;;:::i;:::-;:19;;;;:::i;:::-;:31;57073:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57167:9;57162:70;57186:6;57182:1;:10;57162:70;;;57208:24;57221:10;57208:12;:24::i;:::-;57194:3;;;;;:::i;:::-;;;;57162:70;;;;57243:20;57253:9;57243;:20::i;:::-;56784:487;56739:532;:::o;24909:327::-;25056:12;:10;:12::i;:::-;25044:24;;:8;:24;;;;25036:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25156:8;25111:18;:32;25130:12;:10;:12::i;:::-;25111:32;;;;;;;;;;;;;;;:42;25144:8;25111:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25209:8;25180:48;;25195:12;:10;:12::i;:::-;25180:48;;;25219:8;25180:48;;;;;;:::i;:::-;;;;;;;;24909:327;;:::o;55901:37::-;;;;:::o;55555:80::-;;;;;;;;;;;;;:::o;55388:75::-;;;;;;;;;;;;;:::o;26291:365::-;26480:41;26499:12;:10;:12::i;:::-;26513:7;26480:18;:41::i;:::-;26458:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;26609:39;26623:4;26629:2;26633:7;26642:5;26609:13;:39::i;:::-;26291:365;;;;:::o;55670:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57287:196::-;57414:13;57452:23;57467:7;57452:14;:23::i;:::-;57445:30;;57287:196;;;:::o;55859:35::-;;;;:::o;55737:31::-;;;;:::o;25307:214::-;25449:4;25478:18;:25;25497:5;25478:25;;;;;;;;;;;;;;;:35;25504:8;25478:35;;;;;;;;;;;;;;;;;;;;;;;;;25471:42;;25307:214;;;;:::o;56003:42::-;;;;;;;;;;;;;;;;;:::o;49326:281::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49449:1:::1;49429:22;;:8;:22;;;;49407:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49562:8;49533:38;;49554:6;;;;;;;;;;;49533:38;;;;;;;;;;;;49591:8;49582:6;;:17;;;;;;;;;;;;;;;;;;49326:281:::0;:::o;55470:78::-;;;;;;;;;;;;;:::o;58567:92::-;48603:12;:10;:12::i;:::-;48592:23;;:7;:5;:7::i;:::-;:23;;;48584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58642:9:::1;58633:6;:18;;;;58567:92:::0;:::o;28203:127::-;28268:4;28320:1;28292:30;;:7;:16;28300:7;28292:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28285:37;;28203:127;;;:::o;36810:300::-;36957:4;37014:35;36999:50;;;:11;:50;;;;:103;;;;37066:36;37090:11;37066:23;:36::i;:::-;36999:103;36979:123;;36810:300;;;:::o;16894:98::-;16947:7;16974:10;16967:17;;16894:98;:::o;32326:174::-;32428:2;32401:15;:24;32417:7;32401:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32484:7;32480:2;32446:46;;32455:23;32470:7;32455:14;:23::i;:::-;32446:46;;;;;;;;;;;;32326:174;;:::o;28497:452::-;28626:4;28670:16;28678:7;28670;:16::i;:::-;28648:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28769:13;28785:23;28800:7;28785:14;:23::i;:::-;28769:39;;28838:5;28827:16;;:7;:16;;;:64;;;;28884:7;28860:31;;:20;28872:7;28860:11;:20::i;:::-;:31;;;28827:64;:113;;;;28908:32;28925:5;28932:7;28908:16;:32::i;:::-;28827:113;28819:122;;;28497:452;;;;:::o;31593:615::-;31766:4;31739:31;;:23;31754:7;31739:14;:23::i;:::-;:31;;;31717:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;31872:1;31858:16;;:2;:16;;;;31850:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31928:39;31949:4;31955:2;31959:7;31928:20;:39::i;:::-;32032:29;32049:1;32053:7;32032:8;:29::i;:::-;32093:1;32074:9;:15;32084:4;32074:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32122:1;32105:9;:13;32115:2;32105:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32153:2;32134:7;:16;32142:7;32134:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32192:7;32188:2;32173:27;;32182:4;32173:27;;;;;;;;;;;;31593:615;;;:::o;47125:120::-;46669:8;:6;:8::i;:::-;46661:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47194:5:::1;47184:7;;:15;;;;;;;;;;;;;;;;;;47215:22;47224:12;:10;:12::i;:::-;47215:22;;;;;;:::i;:::-;;;;;;;;47125:120::o:0;59454:140::-;59508:40;59518:2;59522:25;:15;:23;:25::i;:::-;59508:9;:40::i;:::-;59559:27;:15;:25;:27::i;:::-;59454:140;:::o;60251:138::-;60361:20;60373:7;60361:11;:20::i;:::-;60251:138;:::o;46866:118::-;46392:8;:6;:8::i;:::-;46391:9;46383:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46936:4:::1;46926:7;;:14;;;;;;;;;;;;;;;;;;46956:20;46963:12;:10;:12::i;:::-;46956:20;;;;;;:::i;:::-;;;;;;;;46866:118::o:0;44273:277::-;44410:16;44418:7;44410;:16::i;:::-;44388:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44533:9;44511:10;:19;44522:7;44511:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;44273:277;;:::o;56371:359::-;56432:27;56462:40;56496:5;56462:29;56477:13;;56462:10;:14;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;56432:70;;56513:29;56545:42;56581:5;56545:31;56560:15;;56545:10;:14;;:31;;;;:::i;:::-;:35;;:42;;;;:::i;:::-;56513:74;;56637:19;56607:7;:26;56615:17;;;;;;;;;;;56607:26;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;56699:21;56667:7;:28;56675:19;;;;;;;;;;;56667:28;;;;;;;;;;;;;;;;:53;;;;;;;:::i;:::-;;;;;;;;56419:311;;56371:359;:::o;27538:352::-;27695:28;27705:4;27711:2;27715:7;27695:9;:28::i;:::-;27756:48;27779:4;27785:2;27789:7;27798:5;27756:22;:48::i;:::-;27734:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;27538:352;;;;:::o;43652:465::-;43770:13;43823:16;43831:7;43823;:16::i;:::-;43801:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;43929:18;43950:10;:8;:10::i;:::-;43929:31;;43971:17;43991:16;:14;:16::i;:::-;43971:36;;44070:4;44076:24;44087:1;44077:7;:11;;;;:::i;:::-;44076:22;:24::i;:::-;44102:3;44053:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44039:68;;;;43652:465;;;:::o;21670:355::-;21817:4;21874:25;21859:40;;;:11;:40;;;;:105;;;;21931:33;21916:48;;;:11;:48;;;;21859:105;:158;;;;21981:36;22005:11;21981:23;:36::i;:::-;21859:158;21839:178;;21670:355;;;:::o;60006:229::-;46392:8;:6;:8::i;:::-;46391:9;46383:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;60182:45:::1;60209:4;60215:2;60219:7;60182:26;:45::i;:::-;60006:229:::0;;;:::o;51177:114::-;51242:7;51269;:14;;;51262:21;;51177:114;;;:::o;29291:110::-;29367:26;29377:2;29381:7;29367:26;;;;;;;;;;;;:9;:26::i;:::-;29291:110;;:::o;51299:127::-;51406:1;51388:7;:14;;;:19;;;;;;;;;;;51299:127;:::o;44779:206::-;44848:20;44860:7;44848:11;:20::i;:::-;44922:1;44891:10;:19;44902:7;44891:19;;;;;;;;;;;44885:33;;;;;:::i;:::-;;;:38;44881:97;;44947:10;:19;44958:7;44947:19;;;;;;;;;;;;44940:26;;;;:::i;:::-;44881:97;44779:206;:::o;53605:250::-;53663:7;53692:1;53687;:6;53683:47;;;53717:1;53710:8;;;;53683:47;53742:9;53758:1;53754;:5;;;;:::i;:::-;53742:17;;53787:1;53782;53778;:5;;;;:::i;:::-;:10;53770:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;53846:1;53839:8;;;53605:250;;;;;:::o;53865:132::-;53923:7;53950:39;53954:1;53957;53950:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;53943:46;;53865:132;;;;:::o;33065:1053::-;33220:4;33241:15;:2;:13;;;:15::i;:::-;33237:874;;;33310:2;33294:36;;;33353:12;:10;:12::i;:::-;33388:4;33415:7;33445:5;33294:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33273:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33673:1;33656:6;:13;:18;33652:389;;;33699:108;;;;;;;;;;:::i;:::-;;;;;;;;33652:389;33991:6;33985:13;33976:6;33972:2;33968:15;33961:38;33273:783;33543:45;;;33533:55;;;:6;:55;;;;33526:62;;;;;33237:874;34095:4;34088:11;;33065:1053;;;;;;;:::o;56256:100::-;56308:13;56341:7;56334:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56256:100;:::o;56134:112::-;56192:13;56225;56218:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56134:112;:::o;17551:723::-;17607:13;17837:1;17828:5;:10;17824:53;;;17855:10;;;;;;;;;;;;;;;;;;;;;17824:53;17887:12;17902:5;17887:20;;17918:14;17943:78;17958:1;17950:4;:9;17943:78;;17976:8;;;;;:::i;:::-;;;;18007:2;17999:10;;;;;:::i;:::-;;;17943:78;;;18031:19;18063:6;18053:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18031:39;;18081:154;18097:1;18088:5;:10;18081:154;;18125:1;18115:11;;;;;:::i;:::-;;;18192:2;18184:5;:10;;;;:::i;:::-;18171:2;:24;;;;:::i;:::-;18158:39;;18141:6;18148;18141:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18221:2;18212:11;;;;;:::i;:::-;;;18081:154;;;18259:6;18245:21;;;;;17551:723;;;;:::o;20136:207::-;20266:4;20310:25;20295:40;;;:11;:40;;;;20288:47;;20136:207;;;:::o;38736:589::-;38880:45;38907:4;38913:2;38917:7;38880:26;:45::i;:::-;38958:1;38942:18;;:4;:18;;;38938:187;;;38977:40;39009:7;38977:31;:40::i;:::-;38938:187;;;39047:2;39039:10;;:4;:10;;;39035:90;;39066:47;39099:4;39105:7;39066:32;:47::i;:::-;39035:90;38938:187;39153:1;39139:16;;:2;:16;;;39135:183;;;39172:45;39209:7;39172:36;:45::i;:::-;39135:183;;;39245:4;39239:10;;:2;:10;;;39235:83;;39266:40;39294:2;39298:7;39266:27;:40::i;:::-;39235:83;39135:183;38736:589;;;:::o;29628:321::-;29758:18;29764:2;29768:7;29758:5;:18::i;:::-;29809:54;29840:1;29844:2;29848:7;29857:5;29809:22;:54::i;:::-;29787:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29628:321;;;:::o;30896:360::-;30956:13;30972:23;30987:7;30972:14;:23::i;:::-;30956:39;;31008:48;31029:5;31044:1;31048:7;31008:20;:48::i;:::-;31097:29;31114:1;31118:7;31097:8;:29::i;:::-;31159:1;31139:9;:16;31149:5;31139:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;31178:7;:16;31186:7;31178:16;;;;;;;;;;;;31171:23;;;;;;;;;;;31240:7;31236:1;31212:36;;31221:5;31212:36;;;;;;;;;;;;30945:311;30896:360;:::o;54005:278::-;54091:7;54123:1;54119;:5;54126:12;54111:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;54150:9;54166:1;54162;:5;;;;:::i;:::-;54150:17;;54274:1;54267:8;;;54005:278;;;;;:::o;8308:444::-;8368:4;8576:12;8700:7;8688:20;8680:28;;8743:1;8736:4;:8;8729:15;;;8308:444;;;:::o;34731:126::-;;;;:::o;40048:164::-;40152:10;:17;;;;40125:15;:24;40141:7;40125:24;;;;;;;;;;;:44;;;;40180:10;40196:7;40180:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40048:164;:::o;40839:1002::-;41119:22;41169:1;41144:22;41161:4;41144:16;:22::i;:::-;:26;;;;:::i;:::-;41119:51;;41181:18;41202:17;:26;41220:7;41202:26;;;;;;;;;;;;41181:47;;41349:14;41335:10;:28;41331:328;;41380:19;41402:12;:18;41415:4;41402:18;;;;;;;;;;;;;;;:34;41421:14;41402:34;;;;;;;;;;;;41380:56;;41486:11;41453:12;:18;41466:4;41453:18;;;;;;;;;;;;;;;:30;41472:10;41453:30;;;;;;;;;;;:44;;;;41603:10;41570:17;:30;41588:11;41570:30;;;;;;;;;;;:43;;;;41365:294;41331:328;41755:17;:26;41773:7;41755:26;;;;;;;;;;;41748:33;;;41799:12;:18;41812:4;41799:18;;;;;;;;;;;;;;;:34;41818:14;41799:34;;;;;;;;;;;41792:41;;;40934:907;;40839:1002;;:::o;42136:1079::-;42389:22;42434:1;42414:10;:17;;;;:21;;;;:::i;:::-;42389:46;;42446:18;42467:15;:24;42483:7;42467:24;;;;;;;;;;;;42446:45;;42818:19;42840:10;42851:14;42840:26;;;;;;;;:::i;:::-;;;;;;;;;;42818:48;;42904:11;42879:10;42890;42879:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;43015:10;42984:15;:28;43000:11;42984:28;;;;;;;;;;;:41;;;;43156:15;:24;43172:7;43156:24;;;;;;;;;;;43149:31;;;43191:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42207:1008;;;42136:1079;:::o;39626:221::-;39711:14;39728:20;39745:2;39728:16;:20::i;:::-;39711:37;;39786:7;39759:12;:16;39772:2;39759:16;;;;;;;;;;;;;;;:24;39776:6;39759:24;;;;;;;;;;;:34;;;;39833:6;39804:17;:26;39822:7;39804:26;;;;;;;;;;;:35;;;;39700:147;39626:221;;:::o;30285:382::-;30379:1;30365:16;;:2;:16;;;;30357:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30438:16;30446:7;30438;:16::i;:::-;30437:17;30429:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30500:45;30529:1;30533:2;30537:7;30500:20;:45::i;:::-;30575:1;30558:9;:13;30568:2;30558:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30606:2;30587:7;:16;30595:7;30587:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30651:7;30647:2;30626:33;;30643:1;30626:33;;;;;;;;;;;;30285:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2317:5;2348:6;2342:13;2333:22;;2364:30;2388:5;2364:30;:::i;:::-;2263:137;;;;:::o;2406:::-;2451:5;2489:6;2476:20;2467:29;;2505:32;2531:5;2505:32;:::i;:::-;2406:137;;;;:::o;2549:141::-;2605:5;2636:6;2630:13;2621:22;;2652:32;2678:5;2652:32;:::i;:::-;2549:141;;;;:::o;2709:338::-;2764:5;2813:3;2806:4;2798:6;2794:17;2790:27;2780:122;;2821:79;;:::i;:::-;2780:122;2938:6;2925:20;2963:78;3037:3;3029:6;3022:4;3014:6;3010:17;2963:78;:::i;:::-;2954:87;;2770:277;2709:338;;;;:::o;3067:340::-;3123:5;3172:3;3165:4;3157:6;3153:17;3149:27;3139:122;;3180:79;;:::i;:::-;3139:122;3297:6;3284:20;3322:79;3397:3;3389:6;3382:4;3374:6;3370:17;3322:79;:::i;:::-;3313:88;;3129:278;3067:340;;;;:::o;3413:137::-;3458:5;3496:6;3483:20;3474:29;;3512:32;3538:5;3512:32;:::i;:::-;3413:137;;;;:::o;3556:139::-;3602:5;3640:6;3627:20;3618:29;;3656:33;3683:5;3656:33;:::i;:::-;3556:139;;;;:::o;3701:143::-;3758:5;3789:6;3783:13;3774:22;;3805:33;3832:5;3805:33;:::i;:::-;3701:143;;;;:::o;3850:329::-;3909:6;3958:2;3946:9;3937:7;3933:23;3929:32;3926:119;;;3964:79;;:::i;:::-;3926:119;4084:1;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4055:117;3850:329;;;;:::o;4185:474::-;4253:6;4261;4310:2;4298:9;4289:7;4285:23;4281:32;4278:119;;;4316:79;;:::i;:::-;4278:119;4436:1;4461:53;4506:7;4497:6;4486:9;4482:22;4461:53;:::i;:::-;4451:63;;4407:117;4563:2;4589:53;4634:7;4625:6;4614:9;4610:22;4589:53;:::i;:::-;4579:63;;4534:118;4185:474;;;;;:::o;4665:619::-;4742:6;4750;4758;4807:2;4795:9;4786:7;4782:23;4778:32;4775:119;;;4813:79;;:::i;:::-;4775:119;4933:1;4958:53;5003:7;4994:6;4983:9;4979:22;4958:53;:::i;:::-;4948:63;;4904:117;5060:2;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5031:118;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4665:619;;;;;:::o;5290:943::-;5385:6;5393;5401;5409;5458:3;5446:9;5437:7;5433:23;5429:33;5426:120;;;5465:79;;:::i;:::-;5426:120;5585:1;5610:53;5655:7;5646:6;5635:9;5631:22;5610:53;:::i;:::-;5600:63;;5556:117;5712:2;5738:53;5783:7;5774:6;5763:9;5759:22;5738:53;:::i;:::-;5728:63;;5683:118;5840:2;5866:53;5911:7;5902:6;5891:9;5887:22;5866:53;:::i;:::-;5856:63;;5811:118;5996:2;5985:9;5981:18;5968:32;6027:18;6019:6;6016:30;6013:117;;;6049:79;;:::i;:::-;6013:117;6154:62;6208:7;6199:6;6188:9;6184:22;6154:62;:::i;:::-;6144:72;;5939:287;5290:943;;;;;;;:::o;6239:684::-;6332:6;6340;6389:2;6377:9;6368:7;6364:23;6360:32;6357:119;;;6395:79;;:::i;:::-;6357:119;6515:1;6540:53;6585:7;6576:6;6565:9;6561:22;6540:53;:::i;:::-;6530:63;;6486:117;6670:2;6659:9;6655:18;6642:32;6701:18;6693:6;6690:30;6687:117;;;6723:79;;:::i;:::-;6687:117;6828:78;6898:7;6889:6;6878:9;6874:22;6828:78;:::i;:::-;6818:88;;6613:303;6239:684;;;;;:::o;6929:468::-;6994:6;7002;7051:2;7039:9;7030:7;7026:23;7022:32;7019:119;;;7057:79;;:::i;:::-;7019:119;7177:1;7202:53;7247:7;7238:6;7227:9;7223:22;7202:53;:::i;:::-;7192:63;;7148:117;7304:2;7330:50;7372:7;7363:6;7352:9;7348:22;7330:50;:::i;:::-;7320:60;;7275:115;6929:468;;;;;:::o;7403:474::-;7471:6;7479;7528:2;7516:9;7507:7;7503:23;7499:32;7496:119;;;7534:79;;:::i;:::-;7496:119;7654:1;7679:53;7724:7;7715:6;7704:9;7700:22;7679:53;:::i;:::-;7669:63;;7625:117;7781:2;7807:53;7852:7;7843:6;7832:9;7828:22;7807:53;:::i;:::-;7797:63;;7752:118;7403:474;;;;;:::o;7883:345::-;7950:6;7999:2;7987:9;7978:7;7974:23;7970:32;7967:119;;;8005:79;;:::i;:::-;7967:119;8125:1;8150:61;8203:7;8194:6;8183:9;8179:22;8150:61;:::i;:::-;8140:71;;8096:125;7883:345;;;;:::o;8234:327::-;8292:6;8341:2;8329:9;8320:7;8316:23;8312:32;8309:119;;;8347:79;;:::i;:::-;8309:119;8467:1;8492:52;8536:7;8527:6;8516:9;8512:22;8492:52;:::i;:::-;8482:62;;8438:116;8234:327;;;;:::o;8567:349::-;8636:6;8685:2;8673:9;8664:7;8660:23;8656:32;8653:119;;;8691:79;;:::i;:::-;8653:119;8811:1;8836:63;8891:7;8882:6;8871:9;8867:22;8836:63;:::i;:::-;8826:73;;8782:127;8567:349;;;;:::o;8922:509::-;8991:6;9040:2;9028:9;9019:7;9015:23;9011:32;9008:119;;;9046:79;;:::i;:::-;9008:119;9194:1;9183:9;9179:17;9166:31;9224:18;9216:6;9213:30;9210:117;;;9246:79;;:::i;:::-;9210:117;9351:63;9406:7;9397:6;9386:9;9382:22;9351:63;:::i;:::-;9341:73;;9137:287;8922:509;;;;:::o;9437:327::-;9495:6;9544:2;9532:9;9523:7;9519:23;9515:32;9512:119;;;9550:79;;:::i;:::-;9512:119;9670:1;9695:52;9739:7;9730:6;9719:9;9715:22;9695:52;:::i;:::-;9685:62;;9641:116;9437:327;;;;:::o;9770:329::-;9829:6;9878:2;9866:9;9857:7;9853:23;9849:32;9846:119;;;9884:79;;:::i;:::-;9846:119;10004:1;10029:53;10074:7;10065:6;10054:9;10050:22;10029:53;:::i;:::-;10019:63;;9975:117;9770:329;;;;:::o;10105:351::-;10175:6;10224:2;10212:9;10203:7;10199:23;10195:32;10192:119;;;10230:79;;:::i;:::-;10192:119;10350:1;10375:64;10431:7;10422:6;10411:9;10407:22;10375:64;:::i;:::-;10365:74;;10321:128;10105:351;;;;:::o;10462:654::-;10540:6;10548;10597:2;10585:9;10576:7;10572:23;10568:32;10565:119;;;10603:79;;:::i;:::-;10565:119;10723:1;10748:53;10793:7;10784:6;10773:9;10769:22;10748:53;:::i;:::-;10738:63;;10694:117;10878:2;10867:9;10863:18;10850:32;10909:18;10901:6;10898:30;10895:117;;;10931:79;;:::i;:::-;10895:117;11036:63;11091:7;11082:6;11071:9;11067:22;11036:63;:::i;:::-;11026:73;;10821:288;10462:654;;;;;:::o;11122:474::-;11190:6;11198;11247:2;11235:9;11226:7;11222:23;11218:32;11215:119;;;11253:79;;:::i;:::-;11215:119;11373:1;11398:53;11443:7;11434:6;11423:9;11419:22;11398:53;:::i;:::-;11388:63;;11344:117;11500:2;11526:53;11571:7;11562:6;11551:9;11547:22;11526:53;:::i;:::-;11516:63;;11471:118;11122:474;;;;;:::o;11602:179::-;11671:10;11692:46;11734:3;11726:6;11692:46;:::i;:::-;11770:4;11765:3;11761:14;11747:28;;11602:179;;;;:::o;11787:118::-;11874:24;11892:5;11874:24;:::i;:::-;11869:3;11862:37;11787:118;;:::o;11941:732::-;12060:3;12089:54;12137:5;12089:54;:::i;:::-;12159:86;12238:6;12233:3;12159:86;:::i;:::-;12152:93;;12269:56;12319:5;12269:56;:::i;:::-;12348:7;12379:1;12364:284;12389:6;12386:1;12383:13;12364:284;;;12465:6;12459:13;12492:63;12551:3;12536:13;12492:63;:::i;:::-;12485:70;;12578:60;12631:6;12578:60;:::i;:::-;12568:70;;12424:224;12411:1;12408;12404:9;12399:14;;12364:284;;;12368:14;12664:3;12657:10;;12065:608;;;11941:732;;;;:::o;12679:109::-;12760:21;12775:5;12760:21;:::i;:::-;12755:3;12748:34;12679:109;;:::o;12794:360::-;12880:3;12908:38;12940:5;12908:38;:::i;:::-;12962:70;13025:6;13020:3;12962:70;:::i;:::-;12955:77;;13041:52;13086:6;13081:3;13074:4;13067:5;13063:16;13041:52;:::i;:::-;13118:29;13140:6;13118:29;:::i;:::-;13113:3;13109:39;13102:46;;12884:270;12794:360;;;;:::o;13160:364::-;13248:3;13276:39;13309:5;13276:39;:::i;:::-;13331:71;13395:6;13390:3;13331:71;:::i;:::-;13324:78;;13411:52;13456:6;13451:3;13444:4;13437:5;13433:16;13411:52;:::i;:::-;13488:29;13510:6;13488:29;:::i;:::-;13483:3;13479:39;13472:46;;13252:272;13160:364;;;;:::o;13530:377::-;13636:3;13664:39;13697:5;13664:39;:::i;:::-;13719:89;13801:6;13796:3;13719:89;:::i;:::-;13712:96;;13817:52;13862:6;13857:3;13850:4;13843:5;13839:16;13817:52;:::i;:::-;13894:6;13889:3;13885:16;13878:23;;13640:267;13530:377;;;;:::o;13913:366::-;14055:3;14076:67;14140:2;14135:3;14076:67;:::i;:::-;14069:74;;14152:93;14241:3;14152:93;:::i;:::-;14270:2;14265:3;14261:12;14254:19;;13913:366;;;:::o;14285:::-;14427:3;14448:67;14512:2;14507:3;14448:67;:::i;:::-;14441:74;;14524:93;14613:3;14524:93;:::i;:::-;14642:2;14637:3;14633:12;14626:19;;14285:366;;;:::o;14657:::-;14799:3;14820:67;14884:2;14879:3;14820:67;:::i;:::-;14813:74;;14896:93;14985:3;14896:93;:::i;:::-;15014:2;15009:3;15005:12;14998:19;;14657:366;;;:::o;15029:::-;15171:3;15192:67;15256:2;15251:3;15192:67;:::i;:::-;15185:74;;15268:93;15357:3;15268:93;:::i;:::-;15386:2;15381:3;15377:12;15370:19;;15029:366;;;:::o;15401:::-;15543:3;15564:67;15628:2;15623:3;15564:67;:::i;:::-;15557:74;;15640:93;15729:3;15640:93;:::i;:::-;15758:2;15753:3;15749:12;15742:19;;15401:366;;;:::o;15773:::-;15915:3;15936:67;16000:2;15995:3;15936:67;:::i;:::-;15929:74;;16012:93;16101:3;16012:93;:::i;:::-;16130:2;16125:3;16121:12;16114:19;;15773:366;;;:::o;16145:::-;16287:3;16308:67;16372:2;16367:3;16308:67;:::i;:::-;16301:74;;16384:93;16473:3;16384:93;:::i;:::-;16502:2;16497:3;16493:12;16486:19;;16145:366;;;:::o;16517:::-;16659:3;16680:67;16744:2;16739:3;16680:67;:::i;:::-;16673:74;;16756:93;16845:3;16756:93;:::i;:::-;16874:2;16869:3;16865:12;16858:19;;16517:366;;;:::o;16889:::-;17031:3;17052:67;17116:2;17111:3;17052:67;:::i;:::-;17045:74;;17128:93;17217:3;17128:93;:::i;:::-;17246:2;17241:3;17237:12;17230:19;;16889:366;;;:::o;17261:::-;17403:3;17424:67;17488:2;17483:3;17424:67;:::i;:::-;17417:74;;17500:93;17589:3;17500:93;:::i;:::-;17618:2;17613:3;17609:12;17602:19;;17261:366;;;:::o;17633:::-;17775:3;17796:67;17860:2;17855:3;17796:67;:::i;:::-;17789:74;;17872:93;17961:3;17872:93;:::i;:::-;17990:2;17985:3;17981:12;17974:19;;17633:366;;;:::o;18005:::-;18147:3;18168:67;18232:2;18227:3;18168:67;:::i;:::-;18161:74;;18244:93;18333:3;18244:93;:::i;:::-;18362:2;18357:3;18353:12;18346:19;;18005:366;;;:::o;18377:::-;18519:3;18540:67;18604:2;18599:3;18540:67;:::i;:::-;18533:74;;18616:93;18705:3;18616:93;:::i;:::-;18734:2;18729:3;18725:12;18718:19;;18377:366;;;:::o;18749:::-;18891:3;18912:67;18976:2;18971:3;18912:67;:::i;:::-;18905:74;;18988:93;19077:3;18988:93;:::i;:::-;19106:2;19101:3;19097:12;19090:19;;18749:366;;;:::o;19121:::-;19263:3;19284:67;19348:2;19343:3;19284:67;:::i;:::-;19277:74;;19360:93;19449:3;19360:93;:::i;:::-;19478:2;19473:3;19469:12;19462:19;;19121:366;;;:::o;19493:::-;19635:3;19656:67;19720:2;19715:3;19656:67;:::i;:::-;19649:74;;19732:93;19821:3;19732:93;:::i;:::-;19850:2;19845:3;19841:12;19834:19;;19493:366;;;:::o;19865:::-;20007:3;20028:67;20092:2;20087:3;20028:67;:::i;:::-;20021:74;;20104:93;20193:3;20104:93;:::i;:::-;20222:2;20217:3;20213:12;20206:19;;19865:366;;;:::o;20237:::-;20379:3;20400:67;20464:2;20459:3;20400:67;:::i;:::-;20393:74;;20476:93;20565:3;20476:93;:::i;:::-;20594:2;20589:3;20585:12;20578:19;;20237:366;;;:::o;20609:::-;20751:3;20772:67;20836:2;20831:3;20772:67;:::i;:::-;20765:74;;20848:93;20937:3;20848:93;:::i;:::-;20966:2;20961:3;20957:12;20950:19;;20609:366;;;:::o;20981:::-;21123:3;21144:67;21208:2;21203:3;21144:67;:::i;:::-;21137:74;;21220:93;21309:3;21220:93;:::i;:::-;21338:2;21333:3;21329:12;21322:19;;20981:366;;;:::o;21353:::-;21495:3;21516:67;21580:2;21575:3;21516:67;:::i;:::-;21509:74;;21592:93;21681:3;21592:93;:::i;:::-;21710:2;21705:3;21701:12;21694:19;;21353:366;;;:::o;21725:::-;21867:3;21888:67;21952:2;21947:3;21888:67;:::i;:::-;21881:74;;21964:93;22053:3;21964:93;:::i;:::-;22082:2;22077:3;22073:12;22066:19;;21725:366;;;:::o;22097:::-;22239:3;22260:67;22324:2;22319:3;22260:67;:::i;:::-;22253:74;;22336:93;22425:3;22336:93;:::i;:::-;22454:2;22449:3;22445:12;22438:19;;22097:366;;;:::o;22469:::-;22611:3;22632:67;22696:2;22691:3;22632:67;:::i;:::-;22625:74;;22708:93;22797:3;22708:93;:::i;:::-;22826:2;22821:3;22817:12;22810:19;;22469:366;;;:::o;22841:::-;22983:3;23004:67;23068:2;23063:3;23004:67;:::i;:::-;22997:74;;23080:93;23169:3;23080:93;:::i;:::-;23198:2;23193:3;23189:12;23182:19;;22841:366;;;:::o;23213:::-;23355:3;23376:67;23440:2;23435:3;23376:67;:::i;:::-;23369:74;;23452:93;23541:3;23452:93;:::i;:::-;23570:2;23565:3;23561:12;23554:19;;23213:366;;;:::o;23585:::-;23727:3;23748:67;23812:2;23807:3;23748:67;:::i;:::-;23741:74;;23824:93;23913:3;23824:93;:::i;:::-;23942:2;23937:3;23933:12;23926:19;;23585:366;;;:::o;23957:::-;24099:3;24120:67;24184:2;24179:3;24120:67;:::i;:::-;24113:74;;24196:93;24285:3;24196:93;:::i;:::-;24314:2;24309:3;24305:12;24298:19;;23957:366;;;:::o;24329:365::-;24471:3;24492:66;24556:1;24551:3;24492:66;:::i;:::-;24485:73;;24567:93;24656:3;24567:93;:::i;:::-;24685:2;24680:3;24676:12;24669:19;;24329:365;;;:::o;24700:366::-;24842:3;24863:67;24927:2;24922:3;24863:67;:::i;:::-;24856:74;;24939:93;25028:3;24939:93;:::i;:::-;25057:2;25052:3;25048:12;25041:19;;24700:366;;;:::o;25072:::-;25214:3;25235:67;25299:2;25294:3;25235:67;:::i;:::-;25228:74;;25311:93;25400:3;25311:93;:::i;:::-;25429:2;25424:3;25420:12;25413:19;;25072:366;;;:::o;25444:108::-;25521:24;25539:5;25521:24;:::i;:::-;25516:3;25509:37;25444:108;;:::o;25558:118::-;25645:24;25663:5;25645:24;:::i;:::-;25640:3;25633:37;25558:118;;:::o;25682:595::-;25910:3;25932:95;26023:3;26014:6;25932:95;:::i;:::-;25925:102;;26044:95;26135:3;26126:6;26044:95;:::i;:::-;26037:102;;26156:95;26247:3;26238:6;26156:95;:::i;:::-;26149:102;;26268:3;26261:10;;25682:595;;;;;;:::o;26283:222::-;26376:4;26414:2;26403:9;26399:18;26391:26;;26427:71;26495:1;26484:9;26480:17;26471:6;26427:71;:::i;:::-;26283:222;;;;:::o;26511:442::-;26660:4;26698:2;26687:9;26683:18;26675:26;;26711:71;26779:1;26768:9;26764:17;26755:6;26711:71;:::i;:::-;26792:72;26860:2;26849:9;26845:18;26836:6;26792:72;:::i;:::-;26874;26942:2;26931:9;26927:18;26918:6;26874:72;:::i;:::-;26511:442;;;;;;:::o;26959:640::-;27154:4;27192:3;27181:9;27177:19;27169:27;;27206:71;27274:1;27263:9;27259:17;27250:6;27206:71;:::i;:::-;27287:72;27355:2;27344:9;27340:18;27331:6;27287:72;:::i;:::-;27369;27437:2;27426:9;27422:18;27413:6;27369:72;:::i;:::-;27488:9;27482:4;27478:20;27473:2;27462:9;27458:18;27451:48;27516:76;27587:4;27578:6;27516:76;:::i;:::-;27508:84;;26959:640;;;;;;;:::o;27605:332::-;27726:4;27764:2;27753:9;27749:18;27741:26;;27777:71;27845:1;27834:9;27830:17;27821:6;27777:71;:::i;:::-;27858:72;27926:2;27915:9;27911:18;27902:6;27858:72;:::i;:::-;27605:332;;;;;:::o;27943:373::-;28086:4;28124:2;28113:9;28109:18;28101:26;;28173:9;28167:4;28163:20;28159:1;28148:9;28144:17;28137:47;28201:108;28304:4;28295:6;28201:108;:::i;:::-;28193:116;;27943:373;;;;:::o;28322:210::-;28409:4;28447:2;28436:9;28432:18;28424:26;;28460:65;28522:1;28511:9;28507:17;28498:6;28460:65;:::i;:::-;28322:210;;;;:::o;28538:313::-;28651:4;28689:2;28678:9;28674:18;28666:26;;28738:9;28732:4;28728:20;28724:1;28713:9;28709:17;28702:47;28766:78;28839:4;28830:6;28766:78;:::i;:::-;28758:86;;28538:313;;;;:::o;28857:419::-;29023:4;29061:2;29050:9;29046:18;29038:26;;29110:9;29104:4;29100:20;29096:1;29085:9;29081:17;29074:47;29138:131;29264:4;29138:131;:::i;:::-;29130:139;;28857:419;;;:::o;29282:::-;29448:4;29486:2;29475:9;29471:18;29463:26;;29535:9;29529:4;29525:20;29521:1;29510:9;29506:17;29499:47;29563:131;29689:4;29563:131;:::i;:::-;29555:139;;29282:419;;;:::o;29707:::-;29873:4;29911:2;29900:9;29896:18;29888:26;;29960:9;29954:4;29950:20;29946:1;29935:9;29931:17;29924:47;29988:131;30114:4;29988:131;:::i;:::-;29980:139;;29707:419;;;:::o;30132:::-;30298:4;30336:2;30325:9;30321:18;30313:26;;30385:9;30379:4;30375:20;30371:1;30360:9;30356:17;30349:47;30413:131;30539:4;30413:131;:::i;:::-;30405:139;;30132:419;;;:::o;30557:::-;30723:4;30761:2;30750:9;30746:18;30738:26;;30810:9;30804:4;30800:20;30796:1;30785:9;30781:17;30774:47;30838:131;30964:4;30838:131;:::i;:::-;30830:139;;30557:419;;;:::o;30982:::-;31148:4;31186:2;31175:9;31171:18;31163:26;;31235:9;31229:4;31225:20;31221:1;31210:9;31206:17;31199:47;31263:131;31389:4;31263:131;:::i;:::-;31255:139;;30982:419;;;:::o;31407:::-;31573:4;31611:2;31600:9;31596:18;31588:26;;31660:9;31654:4;31650:20;31646:1;31635:9;31631:17;31624:47;31688:131;31814:4;31688:131;:::i;:::-;31680:139;;31407:419;;;:::o;31832:::-;31998:4;32036:2;32025:9;32021:18;32013:26;;32085:9;32079:4;32075:20;32071:1;32060:9;32056:17;32049:47;32113:131;32239:4;32113:131;:::i;:::-;32105:139;;31832:419;;;:::o;32257:::-;32423:4;32461:2;32450:9;32446:18;32438:26;;32510:9;32504:4;32500:20;32496:1;32485:9;32481:17;32474:47;32538:131;32664:4;32538:131;:::i;:::-;32530:139;;32257:419;;;:::o;32682:::-;32848:4;32886:2;32875:9;32871:18;32863:26;;32935:9;32929:4;32925:20;32921:1;32910:9;32906:17;32899:47;32963:131;33089:4;32963:131;:::i;:::-;32955:139;;32682:419;;;:::o;33107:::-;33273:4;33311:2;33300:9;33296:18;33288:26;;33360:9;33354:4;33350:20;33346:1;33335:9;33331:17;33324:47;33388:131;33514:4;33388:131;:::i;:::-;33380:139;;33107:419;;;:::o;33532:::-;33698:4;33736:2;33725:9;33721:18;33713:26;;33785:9;33779:4;33775:20;33771:1;33760:9;33756:17;33749:47;33813:131;33939:4;33813:131;:::i;:::-;33805:139;;33532:419;;;:::o;33957:::-;34123:4;34161:2;34150:9;34146:18;34138:26;;34210:9;34204:4;34200:20;34196:1;34185:9;34181:17;34174:47;34238:131;34364:4;34238:131;:::i;:::-;34230:139;;33957:419;;;:::o;34382:::-;34548:4;34586:2;34575:9;34571:18;34563:26;;34635:9;34629:4;34625:20;34621:1;34610:9;34606:17;34599:47;34663:131;34789:4;34663:131;:::i;:::-;34655:139;;34382:419;;;:::o;34807:::-;34973:4;35011:2;35000:9;34996:18;34988:26;;35060:9;35054:4;35050:20;35046:1;35035:9;35031:17;35024:47;35088:131;35214:4;35088:131;:::i;:::-;35080:139;;34807:419;;;:::o;35232:::-;35398:4;35436:2;35425:9;35421:18;35413:26;;35485:9;35479:4;35475:20;35471:1;35460:9;35456:17;35449:47;35513:131;35639:4;35513:131;:::i;:::-;35505:139;;35232:419;;;:::o;35657:::-;35823:4;35861:2;35850:9;35846:18;35838:26;;35910:9;35904:4;35900:20;35896:1;35885:9;35881:17;35874:47;35938:131;36064:4;35938:131;:::i;:::-;35930:139;;35657:419;;;:::o;36082:::-;36248:4;36286:2;36275:9;36271:18;36263:26;;36335:9;36329:4;36325:20;36321:1;36310:9;36306:17;36299:47;36363:131;36489:4;36363:131;:::i;:::-;36355:139;;36082:419;;;:::o;36507:::-;36673:4;36711:2;36700:9;36696:18;36688:26;;36760:9;36754:4;36750:20;36746:1;36735:9;36731:17;36724:47;36788:131;36914:4;36788:131;:::i;:::-;36780:139;;36507:419;;;:::o;36932:::-;37098:4;37136:2;37125:9;37121:18;37113:26;;37185:9;37179:4;37175:20;37171:1;37160:9;37156:17;37149:47;37213:131;37339:4;37213:131;:::i;:::-;37205:139;;36932:419;;;:::o;37357:::-;37523:4;37561:2;37550:9;37546:18;37538:26;;37610:9;37604:4;37600:20;37596:1;37585:9;37581:17;37574:47;37638:131;37764:4;37638:131;:::i;:::-;37630:139;;37357:419;;;:::o;37782:::-;37948:4;37986:2;37975:9;37971:18;37963:26;;38035:9;38029:4;38025:20;38021:1;38010:9;38006:17;37999:47;38063:131;38189:4;38063:131;:::i;:::-;38055:139;;37782:419;;;:::o;38207:::-;38373:4;38411:2;38400:9;38396:18;38388:26;;38460:9;38454:4;38450:20;38446:1;38435:9;38431:17;38424:47;38488:131;38614:4;38488:131;:::i;:::-;38480:139;;38207:419;;;:::o;38632:::-;38798:4;38836:2;38825:9;38821:18;38813:26;;38885:9;38879:4;38875:20;38871:1;38860:9;38856:17;38849:47;38913:131;39039:4;38913:131;:::i;:::-;38905:139;;38632:419;;;:::o;39057:::-;39223:4;39261:2;39250:9;39246:18;39238:26;;39310:9;39304:4;39300:20;39296:1;39285:9;39281:17;39274:47;39338:131;39464:4;39338:131;:::i;:::-;39330:139;;39057:419;;;:::o;39482:::-;39648:4;39686:2;39675:9;39671:18;39663:26;;39735:9;39729:4;39725:20;39721:1;39710:9;39706:17;39699:47;39763:131;39889:4;39763:131;:::i;:::-;39755:139;;39482:419;;;:::o;39907:::-;40073:4;40111:2;40100:9;40096:18;40088:26;;40160:9;40154:4;40150:20;40146:1;40135:9;40131:17;40124:47;40188:131;40314:4;40188:131;:::i;:::-;40180:139;;39907:419;;;:::o;40332:::-;40498:4;40536:2;40525:9;40521:18;40513:26;;40585:9;40579:4;40575:20;40571:1;40560:9;40556:17;40549:47;40613:131;40739:4;40613:131;:::i;:::-;40605:139;;40332:419;;;:::o;40757:::-;40923:4;40961:2;40950:9;40946:18;40938:26;;41010:9;41004:4;41000:20;40996:1;40985:9;40981:17;40974:47;41038:131;41164:4;41038:131;:::i;:::-;41030:139;;40757:419;;;:::o;41182:::-;41348:4;41386:2;41375:9;41371:18;41363:26;;41435:9;41429:4;41425:20;41421:1;41410:9;41406:17;41399:47;41463:131;41589:4;41463:131;:::i;:::-;41455:139;;41182:419;;;:::o;41607:::-;41773:4;41811:2;41800:9;41796:18;41788:26;;41860:9;41854:4;41850:20;41846:1;41835:9;41831:17;41824:47;41888:131;42014:4;41888:131;:::i;:::-;41880:139;;41607:419;;;:::o;42032:222::-;42125:4;42163:2;42152:9;42148:18;42140:26;;42176:71;42244:1;42233:9;42229:17;42220:6;42176:71;:::i;:::-;42032:222;;;;:::o;42260:129::-;42294:6;42321:20;;:::i;:::-;42311:30;;42350:33;42378:4;42370:6;42350:33;:::i;:::-;42260:129;;;:::o;42395:75::-;42428:6;42461:2;42455:9;42445:19;;42395:75;:::o;42476:311::-;42553:4;42643:18;42635:6;42632:30;42629:56;;;42665:18;;:::i;:::-;42629:56;42715:4;42707:6;42703:17;42695:25;;42775:4;42769;42765:15;42757:23;;42476:311;;;:::o;42793:307::-;42854:4;42944:18;42936:6;42933:30;42930:56;;;42966:18;;:::i;:::-;42930:56;43004:29;43026:6;43004:29;:::i;:::-;42996:37;;43088:4;43082;43078:15;43070:23;;42793:307;;;:::o;43106:308::-;43168:4;43258:18;43250:6;43247:30;43244:56;;;43280:18;;:::i;:::-;43244:56;43318:29;43340:6;43318:29;:::i;:::-;43310:37;;43402:4;43396;43392:15;43384:23;;43106:308;;;:::o;43420:132::-;43487:4;43510:3;43502:11;;43540:4;43535:3;43531:14;43523:22;;43420:132;;;:::o;43558:114::-;43625:6;43659:5;43653:12;43643:22;;43558:114;;;:::o;43678:98::-;43729:6;43763:5;43757:12;43747:22;;43678:98;;;:::o;43782:99::-;43834:6;43868:5;43862:12;43852:22;;43782:99;;;:::o;43887:113::-;43957:4;43989;43984:3;43980:14;43972:22;;43887:113;;;:::o;44006:184::-;44105:11;44139:6;44134:3;44127:19;44179:4;44174:3;44170:14;44155:29;;44006:184;;;;:::o;44196:168::-;44279:11;44313:6;44308:3;44301:19;44353:4;44348:3;44344:14;44329:29;;44196:168;;;;:::o;44370:169::-;44454:11;44488:6;44483:3;44476:19;44528:4;44523:3;44519:14;44504:29;;44370:169;;;;:::o;44545:148::-;44647:11;44684:3;44669:18;;44545:148;;;;:::o;44699:305::-;44739:3;44758:20;44776:1;44758:20;:::i;:::-;44753:25;;44792:20;44810:1;44792:20;:::i;:::-;44787:25;;44946:1;44878:66;44874:74;44871:1;44868:81;44865:107;;;44952:18;;:::i;:::-;44865:107;44996:1;44993;44989:9;44982:16;;44699:305;;;;:::o;45010:185::-;45050:1;45067:20;45085:1;45067:20;:::i;:::-;45062:25;;45101:20;45119:1;45101:20;:::i;:::-;45096:25;;45140:1;45130:35;;45145:18;;:::i;:::-;45130:35;45187:1;45184;45180:9;45175:14;;45010:185;;;;:::o;45201:348::-;45241:7;45264:20;45282:1;45264:20;:::i;:::-;45259:25;;45298:20;45316:1;45298:20;:::i;:::-;45293:25;;45486:1;45418:66;45414:74;45411:1;45408:81;45403:1;45396:9;45389:17;45385:105;45382:131;;;45493:18;;:::i;:::-;45382:131;45541:1;45538;45534:9;45523:20;;45201:348;;;;:::o;45555:191::-;45595:4;45615:20;45633:1;45615:20;:::i;:::-;45610:25;;45649:20;45667:1;45649:20;:::i;:::-;45644:25;;45688:1;45685;45682:8;45679:34;;;45693:18;;:::i;:::-;45679:34;45738:1;45735;45731:9;45723:17;;45555:191;;;;:::o;45752:96::-;45789:7;45818:24;45836:5;45818:24;:::i;:::-;45807:35;;45752:96;;;:::o;45854:90::-;45888:7;45931:5;45924:13;45917:21;45906:32;;45854:90;;;:::o;45950:149::-;45986:7;46026:66;46019:5;46015:78;46004:89;;45950:149;;;:::o;46105:89::-;46141:7;46181:6;46174:5;46170:18;46159:29;;46105:89;;;:::o;46200:126::-;46237:7;46277:42;46270:5;46266:54;46255:65;;46200:126;;;:::o;46332:77::-;46369:7;46398:5;46387:16;;46332:77;;;:::o;46415:154::-;46499:6;46494:3;46489;46476:30;46561:1;46552:6;46547:3;46543:16;46536:27;46415:154;;;:::o;46575:307::-;46643:1;46653:113;46667:6;46664:1;46661:13;46653:113;;;46752:1;46747:3;46743:11;46737:18;46733:1;46728:3;46724:11;46717:39;46689:2;46686:1;46682:10;46677:15;;46653:113;;;46784:6;46781:1;46778:13;46775:101;;;46864:1;46855:6;46850:3;46846:16;46839:27;46775:101;46624:258;46575:307;;;:::o;46888:320::-;46932:6;46969:1;46963:4;46959:12;46949:22;;47016:1;47010:4;47006:12;47037:18;47027:81;;47093:4;47085:6;47081:17;47071:27;;47027:81;47155:2;47147:6;47144:14;47124:18;47121:38;47118:84;;;47174:18;;:::i;:::-;47118:84;46939:269;46888:320;;;:::o;47214:281::-;47297:27;47319:4;47297:27;:::i;:::-;47289:6;47285:40;47427:6;47415:10;47412:22;47391:18;47379:10;47376:34;47373:62;47370:88;;;47438:18;;:::i;:::-;47370:88;47478:10;47474:2;47467:22;47257:238;47214:281;;:::o;47501:233::-;47540:3;47563:24;47581:5;47563:24;:::i;:::-;47554:33;;47609:66;47602:5;47599:77;47596:103;;;47679:18;;:::i;:::-;47596:103;47726:1;47719:5;47715:13;47708:20;;47501:233;;;:::o;47740:176::-;47772:1;47789:20;47807:1;47789:20;:::i;:::-;47784:25;;47823:20;47841:1;47823:20;:::i;:::-;47818:25;;47862:1;47852:35;;47867:18;;:::i;:::-;47852:35;47908:1;47905;47901:9;47896:14;;47740:176;;;;:::o;47922:180::-;47970:77;47967:1;47960:88;48067:4;48064:1;48057:15;48091:4;48088:1;48081:15;48108:180;48156:77;48153:1;48146:88;48253:4;48250:1;48243:15;48277:4;48274:1;48267:15;48294:180;48342:77;48339:1;48332:88;48439:4;48436:1;48429:15;48463:4;48460:1;48453:15;48480:180;48528:77;48525:1;48518:88;48625:4;48622:1;48615:15;48649:4;48646:1;48639:15;48666:180;48714:77;48711:1;48704:88;48811:4;48808:1;48801:15;48835:4;48832:1;48825:15;48852:180;48900:77;48897:1;48890:88;48997:4;48994:1;48987:15;49021:4;49018:1;49011:15;49038:117;49147:1;49144;49137:12;49161:117;49270:1;49267;49260:12;49284:117;49393:1;49390;49383:12;49407:117;49516:1;49513;49506:12;49530:117;49639:1;49636;49629:12;49653:102;49694:6;49745:2;49741:7;49736:2;49729:5;49725:14;49721:28;49711:38;;49653:102;;;:::o;49761:170::-;49901:22;49897:1;49889:6;49885:14;49878:46;49761:170;:::o;49937:230::-;50077:34;50073:1;50065:6;50061:14;50054:58;50146:13;50141:2;50133:6;50129:15;50122:38;49937:230;:::o;50173:237::-;50313:34;50309:1;50301:6;50297:14;50290:58;50382:20;50377:2;50369:6;50365:15;50358:45;50173:237;:::o;50416:225::-;50556:34;50552:1;50544:6;50540:14;50533:58;50625:8;50620:2;50612:6;50608:15;50601:33;50416:225;:::o;50647:178::-;50787:30;50783:1;50775:6;50771:14;50764:54;50647:178;:::o;50831:173::-;50971:25;50967:1;50959:6;50955:14;50948:49;50831:173;:::o;51010:238::-;51150:34;51146:1;51138:6;51134:14;51127:58;51219:21;51214:2;51206:6;51202:15;51195:46;51010:238;:::o;51254:221::-;51394:34;51390:1;51382:6;51378:14;51371:58;51463:4;51458:2;51450:6;51446:15;51439:29;51254:221;:::o;51481:223::-;51621:34;51617:1;51609:6;51605:14;51598:58;51690:6;51685:2;51677:6;51673:15;51666:31;51481:223;:::o;51710:175::-;51850:27;51846:1;51838:6;51834:14;51827:51;51710:175;:::o;51891:177::-;52031:29;52027:1;52019:6;52015:14;52008:53;51891:177;:::o;52074:231::-;52214:34;52210:1;52202:6;52198:14;52191:58;52283:14;52278:2;52270:6;52266:15;52259:39;52074:231;:::o;52311:166::-;52451:18;52447:1;52439:6;52435:14;52428:42;52311:166;:::o;52483:243::-;52623:34;52619:1;52611:6;52607:14;52600:58;52692:26;52687:2;52679:6;52675:15;52668:51;52483:243;:::o;52732:230::-;52872:34;52868:1;52860:6;52856:14;52849:58;52941:13;52936:2;52928:6;52924:15;52917:38;52732:230;:::o;52968:229::-;53108:34;53104:1;53096:6;53092:14;53085:58;53177:12;53172:2;53164:6;53160:15;53153:37;52968:229;:::o;53203:228::-;53343:34;53339:1;53331:6;53327:14;53320:58;53412:11;53407:2;53399:6;53395:15;53388:36;53203:228;:::o;53437:233::-;53577:34;53573:1;53565:6;53561:14;53554:58;53646:16;53641:2;53633:6;53629:15;53622:41;53437:233;:::o;53676:224::-;53816:34;53812:1;53804:6;53800:14;53793:58;53885:7;53880:2;53872:6;53868:15;53861:32;53676:224;:::o;53906:182::-;54046:34;54042:1;54034:6;54030:14;54023:58;53906:182;:::o;54094:236::-;54234:34;54230:1;54222:6;54218:14;54211:58;54303:19;54298:2;54290:6;54286:15;54279:44;54094:236;:::o;54336:220::-;54476:34;54472:1;54464:6;54460:14;54453:58;54545:3;54540:2;54532:6;54528:15;54521:28;54336:220;:::o;54562:231::-;54702:34;54698:1;54690:6;54686:14;54679:58;54771:14;54766:2;54758:6;54754:15;54747:39;54562:231;:::o;54799:182::-;54939:34;54935:1;54927:6;54923:14;54916:58;54799:182;:::o;54987:228::-;55127:34;55123:1;55115:6;55111:14;55104:58;55196:11;55191:2;55183:6;55179:15;55172:36;54987:228;:::o;55221:220::-;55361:34;55357:1;55349:6;55345:14;55338:58;55430:3;55425:2;55417:6;55413:15;55406:28;55221:220;:::o;55447:236::-;55587:34;55583:1;55575:6;55571:14;55564:58;55656:19;55651:2;55643:6;55639:15;55632:44;55447:236;:::o;55689:231::-;55829:34;55825:1;55817:6;55813:14;55806:58;55898:14;55893:2;55885:6;55881:15;55874:39;55689:231;:::o;55926:163::-;56066:11;56062:1;56054:6;56050:14;56043:35;55926:163;:::o;56099:247::-;56243:34;56239:1;56231:6;56227:14;56220:58;56316:18;56311:2;56303:6;56299:15;56292:43;56099:247;:::o;56356:244::-;56500:34;56496:1;56488:6;56484:14;56477:58;56573:15;56568:2;56560:6;56556:15;56549:40;56356:244;:::o;56610:130::-;56687:24;56705:5;56687:24;:::i;:::-;56680:5;56677:35;56667:63;;56726:1;56723;56716:12;56667:63;56610:130;:::o;56750:124::-;56824:21;56839:5;56824:21;:::i;:::-;56817:5;56814:32;56804:60;;56860:1;56857;56850:12;56804:60;56750:124;:::o;56884:128::-;56960:23;56977:5;56960:23;:::i;:::-;56953:5;56950:34;56940:62;;56998:1;56995;56988:12;56940:62;56884:128;:::o;57022:::-;57098:23;57115:5;57098:23;:::i;:::-;57091:5;57088:34;57078:62;;57136:1;57133;57126:12;57078:62;57022:128;:::o;57160:130::-;57237:24;57255:5;57237:24;:::i;:::-;57230:5;57227:35;57217:63;;57276:1;57273;57266:12;57217:63;57160:130;:::o

Swarm Source

ipfs://877eed653ae06318f4cfa9557e85be9bcfd5fc234638be98ea39ca537eb61c4c
Loading