ETH Price: $2,507.45 (-1.10%)
Gas: 1.11 Gwei

Token

PlootStars (PLOOT)
 

Overview

Max Total Supply

31 PLOOT

Holders

21

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PLOOT
0x3c5c56D474bBaA26A606f3BE4c000e91B5c30cE7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PlootStars

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-09-12
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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;
    }
}

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

interface LootInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract PlootStars is ERC721Enumerable, ReentrancyGuard, Ownable {
    address public lootAddress = 0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613;
    LootInterface public lootContract = LootInterface(lootAddress);

    string[] private fname = [
        "Stacey","Arcadia","Ron","Ali","Georgia","Luna","Cleo","Kaneda","Tan","Dirk","Diamond","Emerald","Ruby","Stormy","Sasha","Jenna","Lynda","Jeremy","Ronald","Manuel","Lance","Asher","Mariah","Desiree", "Joe", "Tony", "Lil", "Big", "Cherry"   
    ];

    string[] private lname = [
        "Muffin","Spottiswoode","Devereaux","Studebaker","Virgin","Morton","Bounce","Breeze","Flame","Love","Lust","Grey","Black","White","Lim","Low","Chu","Pierce","LFG","Diggler","Texas","Saint","Monroe","Lords","Lynn","Desire","Mack", "Blow"
    ];

    string[] private pronouns = [
        "He/Him","She/Her","They/Them","Per/Per","Zi/Hir","Ze/Zem","Ve/Ver","Attack Helicopter / Attack Helicopter","Xe / Xem","First Name Only","Sie/Sie","Ey/Em","Tey/Ter","E/Em","Hurensohn"
    ];

    string[] private accessory = [
        "Whip","Handcuffs","Cock Ring","Dildo", "Two Dildos","Condom","Hitachi Wand","Feather","Candle","Blowup Doll","Nipple Clamp","Butt Plug","Cucumber","Cock Cage","Viagra","Cell Phone","Selfie Stick","Yellow Underwear","Lace Panties","Latex Bra","Flamingo", "Rollerskates", "Toiletbrush", "G-String", "Mankini", "Bikini", "Nipple Tassels", "Ball Gag", "Popsicle"
    ];
    
    
    string[] private prefixes = [
        "Golden", "Mauve", "Pure", "Dirty", "Skanky", "Slutty", "Facetious", "Missionary", "Bareback", "Lubricated", "Hangry", "Lusty", "Fidenza", "888", "Lucky", "Sticky", "Well-Used", "Traci Lord's", "Linda Lovelace's", "Horny", "Foreplay", "Fisting", "Oriental", "Leopard-Spotted"
    ];


    string[] private suffixes = [
        "of Pleasure","of Joy", "of Pain", "of Desire", "of Sex", "of Denial", "of Immersion", "of Bollocking", "of Dreams", "of Fluffing", "of Perversion", "of Gagging", "of Cum", "of Orgasms", "of Multiple Orgasms", "of Squirting", "of Fisting", "of Penetration", "of Threesomes", "of Foreplay"
    ];


    string[] private favrole = [
        "Schoolgirl","Girl Next Door","Dominatrix","Boy Next Door","Mother","Father","Daddy","Sister","Brother","Handyman","Masseur","Geek","Stepson","Stepdaughter","MILF","FILF","Stripper","Failed Actor","Failed Actress","Cosplayer"
    ];

    string[] private price = [
        "USD$50","0.5eth","0.01eth","0.001eth","2eth","1eth","1btc","1doge","I Fuck For Free", "Only for Gas", "Only in GME", "Favours", "Two Snorts of Cocaine", "1 CryptoPunk", "1 Bored Ape", "1 Pudgy Penguin", "1 Loot Bag", "A Partridge in a Pear Tree"   
    ];


    string[] private privates = [
        "Regular Vagina", "Vagina - Concave", "Vagina - Tight", "Vagina - Smooth", "Where is the Hole?", "Vagina - Constantly Dripping", "Vagina - Wide Enough to fit a Brick", "Vagina - Bushy", "Vagina - Trimmed", "Asshole Only",
        "Mangina", "Two Dicks", "Penis - Disappointing","Penis - Curved upwards","Penis - Curved downwards","Penis - C-shaped","Penis - Straight","Penis - Large Base with Narrow Head","Penis - Narrow Base with Large Head","Chode", "Micropenis"
    ];
    

    string[] private flick1 = [
       "Easy","Blue","Hard","Hot","Hung","Lusting","Dreaming","Gay","XXX","Overage","Teenage","Bang","Deep","Dick","Frisky","Sex","Rear","Double","Hunting","Good","Fake"
    ];

    string[] private flick2 = [
        "Pump","Business","Schlong","Rack","Sin","69","Laid","Intercourse","Trouble","Thrust","Ass","Hole","Dreams","Desire","Heat","Legend","Guns","Cock", "Diaries", "Tits"
    ];

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getFName(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FNAME", fname);
    }

    function getLName(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "LNAME", lname);
    }

    function getAge(uint256 tokenId) public view returns (string memory) {
        return pluckAge(tokenId);
    }

    function getPronoun(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "PRONOUN", pronouns);
    }

    function getAccessory(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "ACCESSORY", accessory);
    }

    function getFavouriteRole(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FAVROLE", favrole);
    }

    function getPrice(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "PRICE", price);
    }

    function getPrivateType(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "PRIVATES", privates);
    }

    function getFlickType(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FLICK", flick1);
    }    
    

   function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray
    ) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;
        uint256 rand2 = random(string(abi.encodePacked(rand)));
        uint256 rand3 = random(string(abi.encodePacked(rand, rand2)));

        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("FLICK")) {
            string[3] memory name;
            name[0] = flick2[rand % flick2.length];
            output = string(abi.encodePacked(output, " ", name[0]));
                    
            if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("FLICK") && greatness > 14) {

            name[1] = flick1[rand2 % flick1.length];
            output = string(abi.encodePacked(name[1], " ",output));
                
                if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("FLICK") && greatness >= 19) {
                name[2] = flick1[rand3 % flick1.length];
                output = string(abi.encodePacked(name[2], " ",output));
                }
            }
        }
        
        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("FLICK") && greatness == 1 && rand2 % 20 == 1) {
            output = string(abi.encodePacked("The Lusty Argonian Maid"));
        }   
       
        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("ACCESSORY") && greatness > 10) {
            string[2] memory name;
            name[0] = prefixes[rand2 % prefixes.length];
            output = string(abi.encodePacked(name[0], " ", output));
                if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("ACCESSORY") && greatness >= 18) {
                name[1] = suffixes[rand3 % suffixes.length];
                output = string(abi.encodePacked(output, " ", name[1]));
            }
        }
        
        return output;
    }
    
    function pluckAge(
        uint256 tokenId
    ) internal view returns (string memory ) {
        uint256 rand = random(string(abi.encodePacked(toString(tokenId)))) % 51;
        string memory output;
        uint256 agegen = rand + 18;
        
        output = string(abi.encodePacked(toString(agegen)));
        return output;
        }


    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        string[19] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 400"><style>.base { fill: white; font-family: serif; font-size: 11px; }</style><rect width="100%" height="100%" fill="#AC47DE" /><text x="10" y="20" class="base">';

        parts[1] = string(abi.encodePacked("First Name: ",getFName(tokenId)));

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = string(abi.encodePacked("Last Name: ",getLName(tokenId)));

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = string(abi.encodePacked("Age: ",getAge(tokenId)));

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = string(abi.encodePacked("Pronouns: ",getPronoun(tokenId)));

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = string(abi.encodePacked("Favourite Accessory: ",getAccessory(tokenId)));

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = string(abi.encodePacked("Favourite Role: ",getFavouriteRole(tokenId)));

        parts[12] = '</text><text x="10" y="140" class="base">';

        parts[13] = string(abi.encodePacked("Cost to Hire: ",getPrice(tokenId)));

        parts[14] = '</text><text x="10" y="160" class="base">';

        parts[15] = string(abi.encodePacked("Genitalia: ",getPrivateType(tokenId)));

        parts[16] = '</text><text x="10" y="200" class="base">';

        parts[17] = string(abi.encodePacked("Breakout Flick: ",getFlickType(tokenId)));

        parts[18] = '</text><text x="10" y="220" class="base">';


        string memory output = string(
            abi.encodePacked(
                parts[0], 
                parts[1], 
                parts[2], 
                parts[3], 
                parts[4], 
                parts[5], 
                parts[6], 
                parts[7], 
                parts[8])
        );
        output = string(
            abi.encodePacked(
                output,
                parts[9],
                parts[10],
                parts[11],
                parts[12],
                parts[13],
                parts[14],
                parts[15],
                parts[16],
                parts[17],
                parts[18])
        );


        
        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "PlootStar #',
                        toString(tokenId),
                        '", "description": "Every metaverse deserves its stars. Meet the true p0rnstars of NFT! 6969 stars of the NFT universe, all on-chain, sometimes in-chains, on-demand. ", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }

    function mint(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId <= 6969, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function mintWithBloot(uint256 lootId) public nonReentrant {
        require(lootId > 0 && lootId <= 6969, "Token ID invalid");
        require(lootContract.ownerOf(lootId) == msg.sender, "Not the owner of this Bloot");
        _safeMint(_msgSender(), lootId);
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }

    constructor() ERC721("PlootStars", "PLOOT") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAccessory","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAge","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getFName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFavouriteRole","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFlickType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrivateType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPronoun","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootContract","outputs":[{"internalType":"contract LootInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootId","type":"uint256"}],"name":"mintWithBloot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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"}]

6080604052734f8730e0b32b04beaa5757e5aea3aef970e5b613600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806103a001604052806040518060400160405280600681526020017f537461636579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f417263616469610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f526f6e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f416c69000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f47656f726769610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c756e610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436c656f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b616e656461000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f54616e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4469726b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f456d6572616c640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f527562790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53746f726d79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536173686100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a656e6e6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c796e646100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a6572656d79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f526f6e616c64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d616e75656c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c616e636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f417368657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6172696168000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f446573697265650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4a6f65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f6e790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c696c000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f426967000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4368657272790000000000000000000000000000000000000000000000000000815250815250600e90601d6200078792919062003bac565b506040518061038001604052806040518060400160405280600681526020017f4d756666696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f53706f74746973776f6f6465000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446576657265617578000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f537475646562616b65720000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56697267696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6f72746f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426f756e6365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f427265657a65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466c616d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6f76650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c7573740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f477265790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426c61636b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f576869746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c696d000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c6f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f436875000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506965726365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c4647000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f446967676c65720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546578617300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5361696e7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6f6e726f65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6f72647300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c796e6e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446573697265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d61636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c6f7700000000000000000000000000000000000000000000000000000000815250815250600f90601c62000e1892919062003c13565b50604051806101e001604052806040518060400160405280600681526020017f48652f48696d000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5368652f4865720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865792f5468656d000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5065722f5065720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5a692f486972000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5a652f5a656d000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56652f566572000000000000000000000000000000000000000000000000000081525081526020016040518060600160405280602581526020016200a0306025913981526020016040518060400160405280600881526020017f5865202f2058656d00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4669727374204e616d65204f6e6c79000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5369652f5369650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f45792f456d00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5465792f5465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f452f456d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f487572656e736f686e0000000000000000000000000000000000000000000000815250815250601090600f6200118e92919062003c7a565b50604051806103a001604052806040518060400160405280600481526020017f576869700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f48616e646375666673000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f436f636b2052696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44696c646f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f54776f2044696c646f730000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f6e646f6d000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f486974616368692057616e64000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466561746865720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f43616e646c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f426c6f77757020446f6c6c00000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4e6970706c6520436c616d70000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4275747420506c7567000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f437563756d62657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f436f636b2043616765000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f566961677261000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f43656c6c2050686f6e650000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f53656c66696520537469636b000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f59656c6c6f7720556e646572776561720000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4c6163652050616e74696573000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4c6174657820427261000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f466c616d696e676f00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f526f6c6c6572736b61746573000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f546f696c6574627275736800000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f472d537472696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d616e6b696e690000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f42696b696e69000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4e6970706c652054617373656c7300000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f42616c6c2047616700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f506f707369636c65000000000000000000000000000000000000000000000000815250815250601190601d6200185a92919062003bac565b506040518061030001604052806040518060400160405280600681526020017f476f6c64656e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6175766500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f507572650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446972747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536b616e6b79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536c75747479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4661636574696f7573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4d697373696f6e6172790000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f426172656261636b00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4c7562726963617465640000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f48616e677279000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c7573747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466964656e7a610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f383838000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c75636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537469636b79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f57656c6c2d55736564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f5472616369204c6f72642773000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f4c696e6461204c6f76656c61636527730000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f726e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f466f7265706c617900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f46697374696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4f7269656e74616c00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4c656f706172642d53706f747465640000000000000000000000000000000000815250815250601290601862001dff92919062003ce1565b506040518061028001604052806040518060400160405280600b81526020017f6f6620506c65617375726500000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f66204a6f79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6f66205061696e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6f6620446573697265000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f6620536578000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6f662044656e69616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620496d6d657273696f6e000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f6620426f6c6c6f636b696e670000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f6f6620447265616d73000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f6620466c756666696e6700000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f662050657276657273696f6e0000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6f662047616767696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6f662043756d000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6f66204f726761736d730000000000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f6f66204d756c7469706c65204f726761736d730000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620537175697274696e67000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f6f662046697374696e670000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f662050656e6574726174696f6e00000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f66205468726565736f6d65730000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f6f6620466f7265706c61790000000000000000000000000000000000000000008152508152506013906014620022b892919062003d48565b506040518061028001604052806040518060400160405280600a81526020017f5363686f6f6c6769726c0000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4769726c204e65787420446f6f7200000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446f6d696e61747269780000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f426f79204e65787420446f6f720000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6f74686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f466174686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446164647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536973746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f42726f746865720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f48616e64796d616e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6173736575720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4765656b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53746570736f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f537465706461756768746572000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d494c460000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f46494c460000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537472697070657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4661696c6564204163746f72000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4661696c6564204163747265737300000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f436f73706c61796572000000000000000000000000000000000000000000000081525081525060149060146200277192919062003d48565b506040518061024001604052806040518060400160405280600681526020017f555344243530000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f302e35657468000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f302e30316574680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f302e30303165746800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f326574680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f316574680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f316274630000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f31646f676500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f49204675636b20466f722046726565000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4f6e6c7920666f7220476173000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4f6e6c7920696e20474d4500000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4661766f7572730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601581526020017f54776f20536e6f727473206f6620436f6361696e65000000000000000000000081525081526020016040518060400160405280600c81526020017f312043727970746f50756e6b000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f3120426f7265642041706500000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f312050756467792050656e6775696e000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f31204c6f6f74204261670000000000000000000000000000000000000000000081525081526020016040518060400160405280601a81526020017f412050617274726964676520696e206120506561722054726565000000000000815250815250601590601262002bb492919062003daf565b50604051806102a001604052806040518060400160405280600e81526020017f526567756c617220566167696e6100000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f566167696e61202d20436f6e636176650000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f566167696e61202d20546967687400000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f566167696e61202d20536d6f6f7468000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f57686572652069732074686520486f6c653f000000000000000000000000000081525081526020016040518060400160405280601c81526020017f566167696e61202d20436f6e7374616e746c79204472697070696e670000000081525081526020016040518060600160405280602381526020016200a0556023913981526020016040518060400160405280600e81526020017f566167696e61202d20427573687900000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f566167696e61202d205472696d6d65640000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f417373686f6c65204f6e6c79000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d616e67696e610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f54776f204469636b73000000000000000000000000000000000000000000000081525081526020016040518060400160405280601581526020017f50656e6973202d204469736170706f696e74696e67000000000000000000000081525081526020016040518060400160405280601681526020017f50656e6973202d2043757276656420757077617264730000000000000000000081525081526020016040518060400160405280601881526020017f50656e6973202d2043757276656420646f776e7761726473000000000000000081525081526020016040518060400160405280601081526020017f50656e6973202d20432d7368617065640000000000000000000000000000000081525081526020016040518060400160405280601081526020017f50656e6973202d2053747261696768740000000000000000000000000000000081525081526020016040518060600160405280602381526020016200a0786023913981526020016040518060600160405280602381526020016200a00d6023913981526020016040518060400160405280600581526020017f43686f646500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4d6963726f70656e69730000000000000000000000000000000000000000000081525081525060169060156200305492919062003e16565b50604051806102a001604052806040518060400160405280600481526020017f456173790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486172640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f486f74000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f48756e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c757374696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f447265616d696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f476179000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f585858000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4f7665726167650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5465656e6167650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f42616e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446565700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4469636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f467269736b79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f536578000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446f75626c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f48756e74696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476f6f640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f46616b650000000000000000000000000000000000000000000000000000000081525081525060179060156200354892919062003e16565b506040518061028001604052806040518060400160405280600481526020017f50756d700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f427573696e65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5363686c6f6e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5261636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f53696e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f363900000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6169640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f496e746572636f7572736500000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f54726f75626c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f546872757374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417373000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486f6c650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f447265616d73000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446573697265000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486561740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c6567656e64000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f47756e730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436f636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f446961726965730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5469747300000000000000000000000000000000000000000000000000000000815250815250601890601462003a0192919062003d48565b5034801562003a0f57600080fd5b506040518060400160405280600a81526020017f506c6f6f745374617273000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f504c4f4f54000000000000000000000000000000000000000000000000000000815250816000908051906020019062003a9492919062003e7d565b50806001908051906020019062003aad92919062003e7d565b5050506001600a8190555062003ad862003acc62003ade60201b60201c565b62003ae660201b60201c565b62004000565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562003c00579160200282015b8281111562003bff57825182908051906020019062003bee92919062003e7d565b509160200191906001019062003bcd565b5b50905062003c0f919062003f0e565b5090565b82805482825590600052602060002090810192821562003c67579160200282015b8281111562003c6657825182908051906020019062003c5592919062003e7d565b509160200191906001019062003c34565b5b50905062003c76919062003f0e565b5090565b82805482825590600052602060002090810192821562003cce579160200282015b8281111562003ccd57825182908051906020019062003cbc92919062003e7d565b509160200191906001019062003c9b565b5b50905062003cdd919062003f0e565b5090565b82805482825590600052602060002090810192821562003d35579160200282015b8281111562003d3457825182908051906020019062003d2392919062003e7d565b509160200191906001019062003d02565b5b50905062003d44919062003f0e565b5090565b82805482825590600052602060002090810192821562003d9c579160200282015b8281111562003d9b57825182908051906020019062003d8a92919062003e7d565b509160200191906001019062003d69565b5b50905062003dab919062003f0e565b5090565b82805482825590600052602060002090810192821562003e03579160200282015b8281111562003e0257825182908051906020019062003df192919062003e7d565b509160200191906001019062003dd0565b5b50905062003e12919062003f0e565b5090565b82805482825590600052602060002090810192821562003e6a579160200282015b8281111562003e6957825182908051906020019062003e5892919062003e7d565b509160200191906001019062003e37565b5b50905062003e79919062003f0e565b5090565b82805462003e8b9062003f9b565b90600052602060002090601f01602090048101928262003eaf576000855562003efb565b82601f1062003eca57805160ff191683800117855562003efb565b8280016001018555821562003efb579182015b8281111562003efa57825182559160200191906001019062003edd565b5b50905062003f0a919062003f36565b5090565b5b8082111562003f32576000818162003f28919062003f55565b5060010162003f0f565b5090565b5b8082111562003f5157600081600090555060010162003f37565b5090565b50805462003f639062003f9b565b6000825580601f1062003f77575062003f98565b601f01602090049060005260206000209081019062003f97919062003f36565b5b50565b6000600282049050600182168062003fb457607f821691505b6020821081141562003fcb5762003fca62003fd1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615ffd80620040106000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b40c25d2116100a2578063e757223011610071578063e757223014610617578063e985e9c514610647578063f2fde38b14610677578063f34963b814610693576101f0565b8063b40c25d21461057f578063b88d4fde1461059b578063c87b56dd146105b7578063d4e3f82a146105e7576101f0565b806395d89b41116100de57806395d89b41146104f95780639d749b4f14610517578063a0712d6814610547578063a22cb46514610563576101f0565b806370a0823114610471578063715018a6146104a15780638da5cb5b146104ab5780638ff26fa7146104c9576101f0565b806323b872dd1161018757806342842e0e1161015657806342842e0e146103c55780634c09a767146103e15780634f6ccce7146104115780636352211e14610441576101f0565b806323b872dd1461032b578063289b0514146103475780632f745c591461037757806335b48afd146103a7576101f0565b8063095ea7b3116101c3578063095ea7b3146102a35780630e37008a146102bf5780630e439326146102ef57806318160ddd1461030d576101f0565b806301637ff4146101f557806301ffc9a71461022557806306fdde0314610255578063081812fc14610273575b600080fd5b61020f600480360381019061020a91906142d4565b6106c3565b60405161021c9190614cd4565b60405180910390f35b61023f600480360381019061023a919061427a565b6107dd565b60405161024c9190614c9e565b60405180910390f35b61025d610857565b60405161026a9190614cd4565b60405180910390f35b61028d600480360381019061028891906142d4565b6108e9565b60405161029a9190614c37565b60405180910390f35b6102bd60048036038101906102b8919061423a565b61096e565b005b6102d960048036038101906102d491906142d4565b610a86565b6040516102e69190614cd4565b60405180910390f35b6102f7610a98565b6040516103049190614c37565b60405180910390f35b610315610abe565b6040516103229190614f76565b60405180910390f35b61034560048036038101906103409190614124565b610acb565b005b610361600480360381019061035c91906142d4565b610b2b565b60405161036e9190614cd4565b60405180910390f35b610391600480360381019061038c919061423a565b610c45565b60405161039e9190614f76565b60405180910390f35b6103af610cea565b6040516103bc9190614cb9565b60405180910390f35b6103df60048036038101906103da9190614124565b610d10565b005b6103fb60048036038101906103f691906142d4565b610d30565b6040516104089190614cd4565b60405180910390f35b61042b600480360381019061042691906142d4565b610e4a565b6040516104389190614f76565b60405180910390f35b61045b600480360381019061045691906142d4565b610ebb565b6040516104689190614c37565b60405180910390f35b61048b6004803603810190610486919061408a565b610f6d565b6040516104989190614f76565b60405180910390f35b6104a9611025565b005b6104b36110ad565b6040516104c09190614c37565b60405180910390f35b6104e360048036038101906104de91906142d4565b6110d7565b6040516104f09190614cd4565b60405180910390f35b6105016111f1565b60405161050e9190614cd4565b60405180910390f35b610531600480360381019061052c91906142d4565b611283565b60405161053e9190614cd4565b60405180910390f35b610561600480360381019061055c91906142d4565b61139d565b005b61057d600480360381019061057891906141fa565b611458565b005b610599600480360381019061059491906142d4565b6115d9565b005b6105b560048036038101906105b09190614177565b6117ac565b005b6105d160048036038101906105cc91906142d4565b61180e565b6040516105de9190614cd4565b60405180910390f35b61060160048036038101906105fc91906142d4565b611f2c565b60405161060e9190614cd4565b60405180910390f35b610631600480360381019061062c91906142d4565b612046565b60405161063e9190614cd4565b60405180910390f35b610661600480360381019061065c91906140e4565b612160565b60405161066e9190614c9e565b60405180910390f35b610691600480360381019061068c919061408a565b6121f4565b005b6106ad60048036038101906106a891906142d4565b6122ec565b6040516106ba9190614cd4565b60405180910390f35b60606107d6826040518060400160405280600981526020017f4143434553534f525900000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156107cd5783829060005260206000200180546107409061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461076c9061522b565b80156107b95780601f1061078e576101008083540402835291602001916107b9565b820191906000526020600020905b81548152906001019060200180831161079c57829003601f168201915b505050505081526020019060010190610721565b50505050612406565b9050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610850575061084f82612c8b565b5b9050919050565b6060600080546108669061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546108929061522b565b80156108df5780601f106108b4576101008083540402835291602001916108df565b820191906000526020600020905b8154815290600101906020018083116108c257829003601f168201915b5050505050905090565b60006108f482612d6d565b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614e76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097982610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190614ef6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a09612dd9565b73ffffffffffffffffffffffffffffffffffffffff161480610a385750610a3781610a32612dd9565b612160565b5b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90614df6565b60405180910390fd5b610a818383612de1565b505050565b6060610a9182612e9a565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610adc610ad6612dd9565b82612f24565b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290614f16565b60405180910390fd5b610b26838383613002565b505050565b6060610c3e826040518060400160405280600781526020017f50524f4e4f554e000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610c35578382906000526020600020018054610ba89061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd49061522b565b8015610c215780601f10610bf657610100808354040283529160200191610c21565b820191906000526020600020905b815481529060010190602001808311610c0457829003601f168201915b505050505081526020019060010190610b89565b50505050612406565b9050919050565b6000610c5083610f6d565b8210610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890614cf6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d2b838383604051806020016040528060008152506117ac565b505050565b6060610e43826040518060400160405280600581526020017f4c4e414d45000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610e3a578382906000526020600020018054610dad9061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd99061522b565b8015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b505050505081526020019060010190610d8e565b50505050612406565b9050919050565b6000610e54610abe565b8210610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90614f36565b60405180910390fd5b60088281548110610ea957610ea86153ce565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b90614e36565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614e16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102d612dd9565b73ffffffffffffffffffffffffffffffffffffffff1661104b6110ad565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890614e96565b60405180910390fd5b6110ab600061325e565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606111ea826040518060400160405280600581526020017f464e414d45000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156111e15783829060005260206000200180546111549061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546111809061522b565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b505050505081526020019060010190611135565b50505050612406565b9050919050565b6060600180546112009061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461122c9061522b565b80156112795780601f1061124e57610100808354040283529160200191611279565b820191906000526020600020905b81548152906001019060200180831161125c57829003601f168201915b5050505050905090565b6060611396826040518060400160405280600781526020017f464156524f4c45000000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b8282101561138d5783829060005260206000200180546113009061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461132c9061522b565b80156113795780601f1061134e57610100808354040283529160200191611379565b820191906000526020600020905b81548152906001019060200180831161135c57829003601f168201915b5050505050815260200190600101906112e1565b50505050612406565b9050919050565b6002600a5414156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614f56565b60405180910390fd5b6002600a819055506000811180156113fd5750611b398111155b61143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614eb6565b60405180910390fd5b61144d611447612dd9565b82613324565b6001600a8190555050565b611460612dd9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590614db6565b60405180910390fd5b80600560006114db612dd9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611588612dd9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115cd9190614c9e565b60405180910390a35050565b6002600a54141561161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690614f56565b60405180910390fd5b6002600a819055506000811180156116395750611b398111155b611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614eb6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116ea9190614f76565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906140b7565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178790614d36565b60405180910390fd5b6117a161179b612dd9565b82613324565b6001600a8190555050565b6117bd6117b7612dd9565b83612f24565b6117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390614f16565b60405180910390fd5b61180884848484613342565b50505050565b6060611818613f26565b60405180610120016040528060ff8152602001615dbe60ff913981600060138110611846576118456153ce565b5b6020020181905250611857836110d7565b6040516020016118679190614aca565b6040516020818303038152906040528160016013811061188a576118896153ce565b5b6020020181905250604051806060016040528060288152602001615fa060289139816002601381106118bf576118be6153ce565b5b60200201819052506118d083610d30565b6040516020016118e09190614aa8565b60405160208183030381529060405281600360138110611903576119026153ce565b5b6020020181905250604051806060016040528060288152602001615d1b6028913981600460138110611938576119376153ce565b5b602002018190525061194983610a86565b6040516020016119599190614a86565b6040516020818303038152906040528160056013811061197c5761197b6153ce565b5b6020020181905250604051806060016040528060288152602001615ebd60289139816006601381106119b1576119b06153ce565b5b60200201819052506119c283610b2b565b6040516020016119d29190614a64565b604051602081830303815290604052816007601381106119f5576119f46153ce565b5b6020020181905250604051806060016040528060298152602001615ee56029913981600860138110611a2a57611a296153ce565b5b6020020181905250611a3b836106c3565b604051602001611a4b9190614a42565b60405160208183030381529060405281600960138110611a6e57611a6d6153ce565b5b6020020181905250604051806060016040528060298152602001615d956029913981600a60138110611aa357611aa26153ce565b5b6020020181905250611ab483611283565b604051602001611ac49190614b8a565b60405160208183030381529060405281600b60138110611ae757611ae66153ce565b5b6020020181905250604051806060016040528060298152602001615f376029913981600c60138110611b1c57611b1b6153ce565b5b6020020181905250611b2d83612046565b604051602001611b3d9190614bac565b60405160208183030381529060405281600d60138110611b6057611b5f6153ce565b5b6020020181905250604051806060016040528060298152602001615d6c6029913981600e60138110611b9557611b946153ce565b5b6020020181905250611ba6836122ec565b604051602001611bb69190614bce565b60405160208183030381529060405281600f60138110611bd957611bd86153ce565b5b6020020181905250604051806060016040528060298152602001615f0e6029913981601060138110611c0e57611c0d6153ce565b5b6020020181905250611c1f83611f2c565b604051602001611c2f9190614aec565b60405160208183030381529060405281601160138110611c5257611c516153ce565b5b6020020181905250604051806060016040528060298152602001615d436029913981601260138110611c8757611c866153ce565b5b6020020181905250600081600060138110611ca557611ca46153ce565b5b602002015182600160138110611cbe57611cbd6153ce565b5b602002015183600260138110611cd757611cd66153ce565b5b602002015184600360138110611cf057611cef6153ce565b5b602002015185600460138110611d0957611d086153ce565b5b602002015186600560138110611d2257611d216153ce565b5b602002015187600660138110611d3b57611d3a6153ce565b5b602002015188600760138110611d5457611d536153ce565b5b602002015189600860138110611d6d57611d6c6153ce565b5b6020020151604051602001611d8a999897969594939291906148fb565b60405160208183030381529060405290508082600960138110611db057611daf6153ce565b5b602002015183600a60138110611dc957611dc86153ce565b5b602002015184600b60138110611de257611de16153ce565b5b602002015185600c60138110611dfb57611dfa6153ce565b5b602002015186600d60138110611e1457611e136153ce565b5b602002015187600e60138110611e2d57611e2c6153ce565b5b602002015188600f60138110611e4657611e456153ce565b5b602002015189601060138110611e5f57611e5e6153ce565b5b60200201518a601160138110611e7857611e776153ce565b5b60200201518b601260138110611e9157611e906153ce565b5b6020020151604051602001611eb09b9a9998979695949392919061497a565b60405160208183030381529060405290506000611efd611ecf8661339e565b611ed8846134ff565b604051602001611ee9929190614b30565b6040516020818303038152906040526134ff565b905080604051602001611f109190614b0e565b6040516020818303038152906040529150819350505050919050565b606061203f826040518060400160405280600581526020017f464c49434b0000000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020016000905b82821015612036578382906000526020600020018054611fa99061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd59061522b565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b505050505081526020019060010190611f8a565b50505050612406565b9050919050565b6060612159826040518060400160405280600581526020017f50524943450000000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b828210156121505783829060005260206000200180546120c39061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ef9061522b565b801561213c5780601f106121115761010080835404028352916020019161213c565b820191906000526020600020905b81548152906001019060200180831161211f57829003601f168201915b5050505050815260200190600101906120a4565b50505050612406565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121fc612dd9565b73ffffffffffffffffffffffffffffffffffffffff1661221a6110ad565b73ffffffffffffffffffffffffffffffffffffffff1614612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790614e96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d790614d56565b60405180910390fd5b6122e98161325e565b50565b60606123ff826040518060400160405280600881526020017f50524956415445530000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020016000905b828210156123f65783829060005260206000200180546123699061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546123959061522b565b80156123e25780601f106123b7576101008083540402835291602001916123e2565b820191906000526020600020905b8154815290600101906020018083116123c557829003601f168201915b50505050508152602001906001019061234a565b50505050612406565b9050919050565b6060600061243c846124178761339e565b6040516020016124289291906148d7565b604051602081830303815290604052613697565b905060008384518361244e91906152e1565b8151811061245f5761245e6153ce565b5b60200260200101519050600060158361247891906152e1565b905060006124a4846040516020016124909190614bf0565b604051602081830303815290604052613697565b905060006124d285836040516020016124be929190614c0b565b604051602081830303815290604052613697565b90507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78860405160200161250691906148c0565b60405160208183030381529060405280519060200120141561290d5761252a613f4e565b601880805490508761253c91906152e1565b8154811061254d5761254c6153ce565b5b9060005260206000200180546125629061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461258e9061522b565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b5050505050816000600381106125f4576125f36153ce565b5b60200201819052508481600060038110612611576126106153ce565b5b6020020151604051602001612627929190614a13565b60405160208183030381529060405294507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78960405160200161266a91906148c0565b6040516020818303038152906040528051906020012014801561268d5750600e84115b1561290b5760178080549050846126a491906152e1565b815481106126b5576126b46153ce565b5b9060005260206000200180546126ca9061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546126f69061522b565b80156127435780601f1061271857610100808354040283529160200191612743565b820191906000526020600020905b81548152906001019060200180831161272657829003601f168201915b50505050508160016003811061275c5761275b6153ce565b5b602002018190525080600160038110612778576127776153ce565b5b60200201518560405160200161278f929190614a13565b60405160208183030381529060405294507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd7896040516020016127d291906148c0565b604051602081830303815290604052805190602001201480156127f6575060138410155b1561290a57601780805490508361280d91906152e1565b8154811061281e5761281d6153ce565b5b9060005260206000200180546128339061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461285f9061522b565b80156128ac5780601f10612881576101008083540402835291602001916128ac565b820191906000526020600020905b81548152906001019060200180831161288f57829003601f168201915b5050505050816002600381106128c5576128c46153ce565b5b6020020181905250806002600381106128e1576128e06153ce565b5b6020020151856040516020016128f8929190614a13565b60405160208183030381529060405294505b5b505b7fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78860405160200161293f91906148c0565b604051602081830303815290604052805190602001201480156129625750600183145b801561297a5750600160148361297891906152e1565b145b156129a05760405160200161298e90614b75565b60405160208183030381529060405293505b7f2cd64190c5262efbfb6d4486df923a5a8a33915fa0b5f8983f3f248d831cd773886040516020016129d291906148c0565b604051602081830303815290604052805190602001201480156129f55750600a83115b15612c7c57612a02613f75565b6012808054905084612a1491906152e1565b81548110612a2557612a246153ce565b5b906000526020600020018054612a3a9061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a669061522b565b8015612ab35780601f10612a8857610100808354040283529160200191612ab3565b820191906000526020600020905b815481529060010190602001808311612a9657829003601f168201915b505050505081600060028110612acc57612acb6153ce565b5b602002018190525080600060028110612ae857612ae76153ce565b5b602002015185604051602001612aff929190614a13565b60405160208183030381529060405294507f2cd64190c5262efbfb6d4486df923a5a8a33915fa0b5f8983f3f248d831cd77389604051602001612b4291906148c0565b60405160208183030381529060405280519060200120148015612b66575060128410155b15612c7a576013808054905083612b7d91906152e1565b81548110612b8e57612b8d6153ce565b5b906000526020600020018054612ba39061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054612bcf9061522b565b8015612c1c5780601f10612bf157610100808354040283529160200191612c1c565b820191906000526020600020905b815481529060010190602001808311612bff57829003601f168201915b505050505081600160028110612c3557612c346153ce565b5b60200201819052508481600160028110612c5257612c516153ce565b5b6020020151604051602001612c68929190614a13565b60405160208183030381529060405294505b505b83955050505050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d5657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d665750612d65826136ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e5483610ebb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060006033612ed0612eac8561339e565b604051602001612ebc91906148c0565b604051602081830303815290604052613697565b612eda91906152e1565b905060606000601283612eed919061502a565b9050612ef88161339e565b604051602001612f0891906148c0565b6040516020818303038152906040529150819350505050919050565b6000612f2f82612d6d565b612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590614dd6565b60405180910390fd5b6000612f7983610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fe857508373ffffffffffffffffffffffffffffffffffffffff16612fd0846108e9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ff95750612ff88185612160565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661302282610ebb565b73ffffffffffffffffffffffffffffffffffffffff1614613078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306f90614ed6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130df90614d96565b60405180910390fd5b6130f3838383613734565b6130fe600082612de1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461314e919061510b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a5919061502a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61333e828260405180602001604052806000815250613848565b5050565b61334d848484613002565b613359848484846138a3565b613398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338f90614d16565b60405180910390fd5b50505050565b606060008214156133e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134fa565b600082905060005b600082146134185780806134019061528e565b915050600a826134119190615080565b91506133ee565b60008167ffffffffffffffff811115613434576134336153fd565b5b6040519080825280601f01601f1916602001820160405280156134665781602001600182028036833780820191505090505b5090505b600085146134f35760018261347f919061510b565b9150600a8561348e91906152e1565b603061349a919061502a565b60f81b8183815181106134b0576134af6153ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134ec9190615080565b945061346a565b8093505050505b919050565b606060008251905060008114156135285760405180602001604052806000815250915050613692565b60006003600283613539919061502a565b6135439190615080565b600461354f91906150b1565b90506000602082613560919061502a565b67ffffffffffffffff811115613579576135786153fd565b5b6040519080825280601f01601f1916602001820160405280156135ab5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615f60604091399050600181016020830160005b8681101561364f5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506135d6565b506003860660018114613669576002811461367957613684565b613d3d60f01b6002830352613684565b603d60f81b60018303525b508484525050819450505050505b919050565b6000816040516020016136aa91906148c0565b6040516020818303038152906040528051906020012060001c9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61373f838383613a3a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137825761377d81613a3f565b6137c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137c0576137bf8382613a88565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613804576137ff81613bf5565b613843565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613842576138418282613cc6565b5b5b505050565b6138528383613d45565b61385f60008484846138a3565b61389e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389590614d16565b60405180910390fd5b505050565b60006138c48473ffffffffffffffffffffffffffffffffffffffff16613f13565b15613a2d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138ed612dd9565b8786866040518563ffffffff1660e01b815260040161390f9493929190614c52565b602060405180830381600087803b15801561392957600080fd5b505af192505050801561395a57506040513d601f19601f8201168201806040525081019061395791906142a7565b60015b6139dd573d806000811461398a576040519150601f19603f3d011682016040523d82523d6000602084013e61398f565b606091505b506000815114156139d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139cc90614d16565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a32565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9584610f6d565b613a9f919061510b565b9050600060076000848152602001908152602001600020549050818114613b84576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c09919061510b565b9050600060096000848152602001908152602001600020549050600060088381548110613c3957613c386153ce565b5b906000526020600020015490508060088381548110613c5b57613c5a6153ce565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613caa57613ca961539f565b5b6001900381819060005260206000200160009055905550505050565b6000613cd183610f6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dac90614e56565b60405180910390fd5b613dbe81612d6d565b15613dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df590614d76565b60405180910390fd5b613e0a60008383613734565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e5a919061502a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061026001604052806013905b6060815260200190600190039081613f365790505090565b60405180606001604052806003905b6060815260200190600190039081613f5d5790505090565b60405180604001604052806002905b6060815260200190600190039081613f845790505090565b6000613faf613faa84614fb6565b614f91565b905082815260208101848484011115613fcb57613fca615431565b5b613fd68482856151e9565b509392505050565b600081359050613fed81615cbe565b92915050565b60008151905061400281615cbe565b92915050565b60008135905061401781615cd5565b92915050565b60008135905061402c81615cec565b92915050565b60008151905061404181615cec565b92915050565b600082601f83011261405c5761405b61542c565b5b813561406c848260208601613f9c565b91505092915050565b60008135905061408481615d03565b92915050565b6000602082840312156140a05761409f61543b565b5b60006140ae84828501613fde565b91505092915050565b6000602082840312156140cd576140cc61543b565b5b60006140db84828501613ff3565b91505092915050565b600080604083850312156140fb576140fa61543b565b5b600061410985828601613fde565b925050602061411a85828601613fde565b9150509250929050565b60008060006060848603121561413d5761413c61543b565b5b600061414b86828701613fde565b935050602061415c86828701613fde565b925050604061416d86828701614075565b9150509250925092565b600080600080608085870312156141915761419061543b565b5b600061419f87828801613fde565b94505060206141b087828801613fde565b93505060406141c187828801614075565b925050606085013567ffffffffffffffff8111156141e2576141e1615436565b5b6141ee87828801614047565b91505092959194509250565b600080604083850312156142115761421061543b565b5b600061421f85828601613fde565b925050602061423085828601614008565b9150509250929050565b600080604083850312156142515761425061543b565b5b600061425f85828601613fde565b925050602061427085828601614075565b9150509250929050565b6000602082840312156142905761428f61543b565b5b600061429e8482850161401d565b91505092915050565b6000602082840312156142bd576142bc61543b565b5b60006142cb84828501614032565b91505092915050565b6000602082840312156142ea576142e961543b565b5b60006142f884828501614075565b91505092915050565b61430a8161513f565b82525050565b61431981615151565b82525050565b600061432a82614fe7565b6143348185614ffd565b93506143448185602086016151f8565b61434d81615440565b840191505092915050565b614361816151b3565b82525050565b600061437282614ff2565b61437c818561500e565b935061438c8185602086016151f8565b61439581615440565b840191505092915050565b60006143ab82614ff2565b6143b5818561501f565b93506143c58185602086016151f8565b80840191505092915050565b60006143de60158361501f565b91506143e982615451565b601582019050919050565b6000614401600a8361501f565b915061440c8261547a565b600a82019050919050565b6000614424602b8361500e565b915061442f826154a3565b604082019050919050565b600061444760328361500e565b9150614452826154f2565b604082019050919050565b600061446a601b8361500e565b915061447582615541565b602082019050919050565b600061448d60268361500e565b91506144988261556a565b604082019050919050565b60006144b0601c8361500e565b91506144bb826155b9565b602082019050919050565b60006144d360248361500e565b91506144de826155e2565b604082019050919050565b60006144f660198361500e565b915061450182615631565b602082019050919050565b600061451960058361501f565b91506145248261565a565b600582019050919050565b600061453c602c8361500e565b915061454782615683565b604082019050919050565b600061455f60018361501f565b915061456a826156d2565b600182019050919050565b6000614582600b8361501f565b915061458d826156fb565b600b82019050919050565b60006145a560388361500e565b91506145b082615724565b604082019050919050565b60006145c8602a8361500e565b91506145d382615773565b604082019050919050565b60006145eb60298361500e565b91506145f6826157c2565b604082019050919050565b600061460e600c8361501f565b915061461982615811565b600c82019050919050565b600061463160108361501f565b915061463c8261583a565b601082019050919050565b600061465460028361501f565b915061465f82615863565b600282019050919050565b600061467760208361500e565b91506146828261588c565b602082019050919050565b600061469a602c8361500e565b91506146a5826158b5565b604082019050919050565b60006146bd60208361500e565b91506146c882615904565b602082019050919050565b60006146e060108361500e565b91506146eb8261592d565b602082019050919050565b600061470360298361500e565b915061470e82615956565b604082019050919050565b600061472660218361500e565b9150614731826159a5565b604082019050919050565b6000614749601d8361501f565b9150614754826159f4565b601d82019050919050565b600061476c60cc8361501f565b915061477782615a1d565b60cc82019050919050565b600061478f60158361501f565b915061479a82615b2a565b601582019050919050565b60006147b260318361500e565b91506147bd82615b53565b604082019050919050565b60006147d560178361501f565b91506147e082615ba2565b601782019050919050565b60006147f8602c8361500e565b915061480382615bcb565b604082019050919050565b600061481b60108361501f565b915061482682615c1a565b601082019050919050565b600061483e601f8361500e565b915061484982615c43565b602082019050919050565b6000614861600e8361501f565b915061486c82615c6c565b600e82019050919050565b6000614884600b8361501f565b915061488f82615c95565b600b82019050919050565b6148a3816151a9565b82525050565b6148ba6148b5826151a9565b6152d7565b82525050565b60006148cc82846143a0565b915081905092915050565b60006148e382856143a0565b91506148ef82846143a0565b91508190509392505050565b6000614907828c6143a0565b9150614913828b6143a0565b915061491f828a6143a0565b915061492b82896143a0565b915061493782886143a0565b915061494382876143a0565b915061494f82866143a0565b915061495b82856143a0565b915061496782846143a0565b91508190509a9950505050505050505050565b6000614986828e6143a0565b9150614992828d6143a0565b915061499e828c6143a0565b91506149aa828b6143a0565b91506149b6828a6143a0565b91506149c282896143a0565b91506149ce82886143a0565b91506149da82876143a0565b91506149e682866143a0565b91506149f282856143a0565b91506149fe82846143a0565b91508190509c9b505050505050505050505050565b6000614a1f82856143a0565b9150614a2a82614552565b9150614a3682846143a0565b91508190509392505050565b6000614a4d826143d1565b9150614a5982846143a0565b915081905092915050565b6000614a6f826143f4565b9150614a7b82846143a0565b915081905092915050565b6000614a918261450c565b9150614a9d82846143a0565b915081905092915050565b6000614ab382614575565b9150614abf82846143a0565b915081905092915050565b6000614ad582614601565b9150614ae182846143a0565b915081905092915050565b6000614af782614624565b9150614b0382846143a0565b915081905092915050565b6000614b198261473c565b9150614b2582846143a0565b915081905092915050565b6000614b3b82614782565b9150614b4782856143a0565b9150614b528261475f565b9150614b5e82846143a0565b9150614b6982614647565b91508190509392505050565b6000614b80826147c8565b9150819050919050565b6000614b958261480e565b9150614ba182846143a0565b915081905092915050565b6000614bb782614854565b9150614bc382846143a0565b915081905092915050565b6000614bd982614877565b9150614be582846143a0565b915081905092915050565b6000614bfc82846148a9565b60208201915081905092915050565b6000614c1782856148a9565b602082019150614c2782846148a9565b6020820191508190509392505050565b6000602082019050614c4c6000830184614301565b92915050565b6000608082019050614c676000830187614301565b614c746020830186614301565b614c81604083018561489a565b8181036060830152614c93818461431f565b905095945050505050565b6000602082019050614cb36000830184614310565b92915050565b6000602082019050614cce6000830184614358565b92915050565b60006020820190508181036000830152614cee8184614367565b905092915050565b60006020820190508181036000830152614d0f81614417565b9050919050565b60006020820190508181036000830152614d2f8161443a565b9050919050565b60006020820190508181036000830152614d4f8161445d565b9050919050565b60006020820190508181036000830152614d6f81614480565b9050919050565b60006020820190508181036000830152614d8f816144a3565b9050919050565b60006020820190508181036000830152614daf816144c6565b9050919050565b60006020820190508181036000830152614dcf816144e9565b9050919050565b60006020820190508181036000830152614def8161452f565b9050919050565b60006020820190508181036000830152614e0f81614598565b9050919050565b60006020820190508181036000830152614e2f816145bb565b9050919050565b60006020820190508181036000830152614e4f816145de565b9050919050565b60006020820190508181036000830152614e6f8161466a565b9050919050565b60006020820190508181036000830152614e8f8161468d565b9050919050565b60006020820190508181036000830152614eaf816146b0565b9050919050565b60006020820190508181036000830152614ecf816146d3565b9050919050565b60006020820190508181036000830152614eef816146f6565b9050919050565b60006020820190508181036000830152614f0f81614719565b9050919050565b60006020820190508181036000830152614f2f816147a5565b9050919050565b60006020820190508181036000830152614f4f816147eb565b9050919050565b60006020820190508181036000830152614f6f81614831565b9050919050565b6000602082019050614f8b600083018461489a565b92915050565b6000614f9b614fac565b9050614fa7828261525d565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd157614fd06153fd565b5b614fda82615440565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615035826151a9565b9150615040836151a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507557615074615312565b5b828201905092915050565b600061508b826151a9565b9150615096836151a9565b9250826150a6576150a5615341565b5b828204905092915050565b60006150bc826151a9565b91506150c7836151a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615100576150ff615312565b5b828202905092915050565b6000615116826151a9565b9150615121836151a9565b92508282101561513457615133615312565b5b828203905092915050565b600061514a82615189565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006151be826151c5565b9050919050565b60006151d0826151d7565b9050919050565b60006151e282615189565b9050919050565b82818337600083830152505050565b60005b838110156152165780820151818401526020810190506151fb565b83811115615225576000848401525b50505050565b6000600282049050600182168061524357607f821691505b6020821081141561525757615256615370565b5b50919050565b61526682615440565b810181811067ffffffffffffffff82111715615285576152846153fd565b5b80604052505050565b6000615299826151a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cc576152cb615312565b5b600182019050919050565b6000819050919050565b60006152ec826151a9565b91506152f7836151a9565b92508261530757615306615341565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4661766f7572697465204163636573736f72793a200000000000000000000000600082015250565b7f50726f6e6f756e733a2000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f66207468697320426c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4167653a20000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4c617374204e616d653a20000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4669727374204e616d653a200000000000000000000000000000000000000000600082015250565b7f427265616b6f757420466c69636b3a2000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f222c20226465736372697074696f6e223a20224576657279206d65746176657260008201527f7365206465736572766573206974732073746172732e204d656574207468652060208201527f74727565207030726e7374617273206f66204e4654212036393639207374617260408201527f73206f6620746865204e465420756e6976657273652c20616c6c206f6e2d636860608201527f61696e2c20736f6d6574696d657320696e2d636861696e732c206f6e2d64656d60808201527f616e642e20222c2022696d616765223a2022646174613a696d6167652f73766760a08201527f2b786d6c3b6261736536342c000000000000000000000000000000000000000060c082015250565b7f7b226e616d65223a2022506c6f6f745374617220230000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865204c75737479204172676f6e69616e204d616964000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4661766f757269746520526f6c653a2000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f436f737420746f20486972653a20000000000000000000000000000000000000600082015250565b7f47656e6974616c69613a20000000000000000000000000000000000000000000600082015250565b615cc78161513f565b8114615cd257600080fd5b50565b615cde81615151565b8114615ce957600080fd5b50565b615cf58161515d565b8114615d0057600080fd5b50565b615d0c816151a9565b8114615d1757600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020343030223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313170783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222341433437444522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223230302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220c25072faf60474c37365eed7bbf94529f6b4a40dbc0f48904d521944bfff031364736f6c6343000807003350656e6973202d204e6172726f7720426173652077697468204c61726765204865616441747461636b2048656c69636f70746572202f2041747461636b2048656c69636f70746572566167696e61202d205769646520456e6f75676820746f20666974206120427269636b50656e6973202d204c6172676520426173652077697468204e6172726f772048656164

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b40c25d2116100a2578063e757223011610071578063e757223014610617578063e985e9c514610647578063f2fde38b14610677578063f34963b814610693576101f0565b8063b40c25d21461057f578063b88d4fde1461059b578063c87b56dd146105b7578063d4e3f82a146105e7576101f0565b806395d89b41116100de57806395d89b41146104f95780639d749b4f14610517578063a0712d6814610547578063a22cb46514610563576101f0565b806370a0823114610471578063715018a6146104a15780638da5cb5b146104ab5780638ff26fa7146104c9576101f0565b806323b872dd1161018757806342842e0e1161015657806342842e0e146103c55780634c09a767146103e15780634f6ccce7146104115780636352211e14610441576101f0565b806323b872dd1461032b578063289b0514146103475780632f745c591461037757806335b48afd146103a7576101f0565b8063095ea7b3116101c3578063095ea7b3146102a35780630e37008a146102bf5780630e439326146102ef57806318160ddd1461030d576101f0565b806301637ff4146101f557806301ffc9a71461022557806306fdde0314610255578063081812fc14610273575b600080fd5b61020f600480360381019061020a91906142d4565b6106c3565b60405161021c9190614cd4565b60405180910390f35b61023f600480360381019061023a919061427a565b6107dd565b60405161024c9190614c9e565b60405180910390f35b61025d610857565b60405161026a9190614cd4565b60405180910390f35b61028d600480360381019061028891906142d4565b6108e9565b60405161029a9190614c37565b60405180910390f35b6102bd60048036038101906102b8919061423a565b61096e565b005b6102d960048036038101906102d491906142d4565b610a86565b6040516102e69190614cd4565b60405180910390f35b6102f7610a98565b6040516103049190614c37565b60405180910390f35b610315610abe565b6040516103229190614f76565b60405180910390f35b61034560048036038101906103409190614124565b610acb565b005b610361600480360381019061035c91906142d4565b610b2b565b60405161036e9190614cd4565b60405180910390f35b610391600480360381019061038c919061423a565b610c45565b60405161039e9190614f76565b60405180910390f35b6103af610cea565b6040516103bc9190614cb9565b60405180910390f35b6103df60048036038101906103da9190614124565b610d10565b005b6103fb60048036038101906103f691906142d4565b610d30565b6040516104089190614cd4565b60405180910390f35b61042b600480360381019061042691906142d4565b610e4a565b6040516104389190614f76565b60405180910390f35b61045b600480360381019061045691906142d4565b610ebb565b6040516104689190614c37565b60405180910390f35b61048b6004803603810190610486919061408a565b610f6d565b6040516104989190614f76565b60405180910390f35b6104a9611025565b005b6104b36110ad565b6040516104c09190614c37565b60405180910390f35b6104e360048036038101906104de91906142d4565b6110d7565b6040516104f09190614cd4565b60405180910390f35b6105016111f1565b60405161050e9190614cd4565b60405180910390f35b610531600480360381019061052c91906142d4565b611283565b60405161053e9190614cd4565b60405180910390f35b610561600480360381019061055c91906142d4565b61139d565b005b61057d600480360381019061057891906141fa565b611458565b005b610599600480360381019061059491906142d4565b6115d9565b005b6105b560048036038101906105b09190614177565b6117ac565b005b6105d160048036038101906105cc91906142d4565b61180e565b6040516105de9190614cd4565b60405180910390f35b61060160048036038101906105fc91906142d4565b611f2c565b60405161060e9190614cd4565b60405180910390f35b610631600480360381019061062c91906142d4565b612046565b60405161063e9190614cd4565b60405180910390f35b610661600480360381019061065c91906140e4565b612160565b60405161066e9190614c9e565b60405180910390f35b610691600480360381019061068c919061408a565b6121f4565b005b6106ad60048036038101906106a891906142d4565b6122ec565b6040516106ba9190614cd4565b60405180910390f35b60606107d6826040518060400160405280600981526020017f4143434553534f525900000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156107cd5783829060005260206000200180546107409061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461076c9061522b565b80156107b95780601f1061078e576101008083540402835291602001916107b9565b820191906000526020600020905b81548152906001019060200180831161079c57829003601f168201915b505050505081526020019060010190610721565b50505050612406565b9050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610850575061084f82612c8b565b5b9050919050565b6060600080546108669061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546108929061522b565b80156108df5780601f106108b4576101008083540402835291602001916108df565b820191906000526020600020905b8154815290600101906020018083116108c257829003601f168201915b5050505050905090565b60006108f482612d6d565b610933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092a90614e76565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097982610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190614ef6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a09612dd9565b73ffffffffffffffffffffffffffffffffffffffff161480610a385750610a3781610a32612dd9565b612160565b5b610a77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6e90614df6565b60405180910390fd5b610a818383612de1565b505050565b6060610a9182612e9a565b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b610adc610ad6612dd9565b82612f24565b610b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1290614f16565b60405180910390fd5b610b26838383613002565b505050565b6060610c3e826040518060400160405280600781526020017f50524f4e4f554e000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610c35578382906000526020600020018054610ba89061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd49061522b565b8015610c215780601f10610bf657610100808354040283529160200191610c21565b820191906000526020600020905b815481529060010190602001808311610c0457829003601f168201915b505050505081526020019060010190610b89565b50505050612406565b9050919050565b6000610c5083610f6d565b8210610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890614cf6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610d2b838383604051806020016040528060008152506117ac565b505050565b6060610e43826040518060400160405280600581526020017f4c4e414d45000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610e3a578382906000526020600020018054610dad9061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd99061522b565b8015610e265780601f10610dfb57610100808354040283529160200191610e26565b820191906000526020600020905b815481529060010190602001808311610e0957829003601f168201915b505050505081526020019060010190610d8e565b50505050612406565b9050919050565b6000610e54610abe565b8210610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90614f36565b60405180910390fd5b60088281548110610ea957610ea86153ce565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b90614e36565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590614e16565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102d612dd9565b73ffffffffffffffffffffffffffffffffffffffff1661104b6110ad565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890614e96565b60405180910390fd5b6110ab600061325e565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606111ea826040518060400160405280600581526020017f464e414d45000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156111e15783829060005260206000200180546111549061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546111809061522b565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b505050505081526020019060010190611135565b50505050612406565b9050919050565b6060600180546112009061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461122c9061522b565b80156112795780601f1061124e57610100808354040283529160200191611279565b820191906000526020600020905b81548152906001019060200180831161125c57829003601f168201915b5050505050905090565b6060611396826040518060400160405280600781526020017f464156524f4c45000000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b8282101561138d5783829060005260206000200180546113009061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461132c9061522b565b80156113795780601f1061134e57610100808354040283529160200191611379565b820191906000526020600020905b81548152906001019060200180831161135c57829003601f168201915b5050505050815260200190600101906112e1565b50505050612406565b9050919050565b6002600a5414156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614f56565b60405180910390fd5b6002600a819055506000811180156113fd5750611b398111155b61143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614eb6565b60405180910390fd5b61144d611447612dd9565b82613324565b6001600a8190555050565b611460612dd9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c590614db6565b60405180910390fd5b80600560006114db612dd9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611588612dd9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115cd9190614c9e565b60405180910390a35050565b6002600a54141561161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690614f56565b60405180910390fd5b6002600a819055506000811180156116395750611b398111155b611678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166f90614eb6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016116ea9190614f76565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906140b7565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178790614d36565b60405180910390fd5b6117a161179b612dd9565b82613324565b6001600a8190555050565b6117bd6117b7612dd9565b83612f24565b6117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390614f16565b60405180910390fd5b61180884848484613342565b50505050565b6060611818613f26565b60405180610120016040528060ff8152602001615dbe60ff913981600060138110611846576118456153ce565b5b6020020181905250611857836110d7565b6040516020016118679190614aca565b6040516020818303038152906040528160016013811061188a576118896153ce565b5b6020020181905250604051806060016040528060288152602001615fa060289139816002601381106118bf576118be6153ce565b5b60200201819052506118d083610d30565b6040516020016118e09190614aa8565b60405160208183030381529060405281600360138110611903576119026153ce565b5b6020020181905250604051806060016040528060288152602001615d1b6028913981600460138110611938576119376153ce565b5b602002018190525061194983610a86565b6040516020016119599190614a86565b6040516020818303038152906040528160056013811061197c5761197b6153ce565b5b6020020181905250604051806060016040528060288152602001615ebd60289139816006601381106119b1576119b06153ce565b5b60200201819052506119c283610b2b565b6040516020016119d29190614a64565b604051602081830303815290604052816007601381106119f5576119f46153ce565b5b6020020181905250604051806060016040528060298152602001615ee56029913981600860138110611a2a57611a296153ce565b5b6020020181905250611a3b836106c3565b604051602001611a4b9190614a42565b60405160208183030381529060405281600960138110611a6e57611a6d6153ce565b5b6020020181905250604051806060016040528060298152602001615d956029913981600a60138110611aa357611aa26153ce565b5b6020020181905250611ab483611283565b604051602001611ac49190614b8a565b60405160208183030381529060405281600b60138110611ae757611ae66153ce565b5b6020020181905250604051806060016040528060298152602001615f376029913981600c60138110611b1c57611b1b6153ce565b5b6020020181905250611b2d83612046565b604051602001611b3d9190614bac565b60405160208183030381529060405281600d60138110611b6057611b5f6153ce565b5b6020020181905250604051806060016040528060298152602001615d6c6029913981600e60138110611b9557611b946153ce565b5b6020020181905250611ba6836122ec565b604051602001611bb69190614bce565b60405160208183030381529060405281600f60138110611bd957611bd86153ce565b5b6020020181905250604051806060016040528060298152602001615f0e6029913981601060138110611c0e57611c0d6153ce565b5b6020020181905250611c1f83611f2c565b604051602001611c2f9190614aec565b60405160208183030381529060405281601160138110611c5257611c516153ce565b5b6020020181905250604051806060016040528060298152602001615d436029913981601260138110611c8757611c866153ce565b5b6020020181905250600081600060138110611ca557611ca46153ce565b5b602002015182600160138110611cbe57611cbd6153ce565b5b602002015183600260138110611cd757611cd66153ce565b5b602002015184600360138110611cf057611cef6153ce565b5b602002015185600460138110611d0957611d086153ce565b5b602002015186600560138110611d2257611d216153ce565b5b602002015187600660138110611d3b57611d3a6153ce565b5b602002015188600760138110611d5457611d536153ce565b5b602002015189600860138110611d6d57611d6c6153ce565b5b6020020151604051602001611d8a999897969594939291906148fb565b60405160208183030381529060405290508082600960138110611db057611daf6153ce565b5b602002015183600a60138110611dc957611dc86153ce565b5b602002015184600b60138110611de257611de16153ce565b5b602002015185600c60138110611dfb57611dfa6153ce565b5b602002015186600d60138110611e1457611e136153ce565b5b602002015187600e60138110611e2d57611e2c6153ce565b5b602002015188600f60138110611e4657611e456153ce565b5b602002015189601060138110611e5f57611e5e6153ce565b5b60200201518a601160138110611e7857611e776153ce565b5b60200201518b601260138110611e9157611e906153ce565b5b6020020151604051602001611eb09b9a9998979695949392919061497a565b60405160208183030381529060405290506000611efd611ecf8661339e565b611ed8846134ff565b604051602001611ee9929190614b30565b6040516020818303038152906040526134ff565b905080604051602001611f109190614b0e565b6040516020818303038152906040529150819350505050919050565b606061203f826040518060400160405280600581526020017f464c49434b0000000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020016000905b82821015612036578382906000526020600020018054611fa99061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd59061522b565b80156120225780601f10611ff757610100808354040283529160200191612022565b820191906000526020600020905b81548152906001019060200180831161200557829003601f168201915b505050505081526020019060010190611f8a565b50505050612406565b9050919050565b6060612159826040518060400160405280600581526020017f50524943450000000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b828210156121505783829060005260206000200180546120c39061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546120ef9061522b565b801561213c5780601f106121115761010080835404028352916020019161213c565b820191906000526020600020905b81548152906001019060200180831161211f57829003601f168201915b5050505050815260200190600101906120a4565b50505050612406565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121fc612dd9565b73ffffffffffffffffffffffffffffffffffffffff1661221a6110ad565b73ffffffffffffffffffffffffffffffffffffffff1614612270576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226790614e96565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d790614d56565b60405180910390fd5b6122e98161325e565b50565b60606123ff826040518060400160405280600881526020017f50524956415445530000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020016000905b828210156123f65783829060005260206000200180546123699061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546123959061522b565b80156123e25780601f106123b7576101008083540402835291602001916123e2565b820191906000526020600020905b8154815290600101906020018083116123c557829003601f168201915b50505050508152602001906001019061234a565b50505050612406565b9050919050565b6060600061243c846124178761339e565b6040516020016124289291906148d7565b604051602081830303815290604052613697565b905060008384518361244e91906152e1565b8151811061245f5761245e6153ce565b5b60200260200101519050600060158361247891906152e1565b905060006124a4846040516020016124909190614bf0565b604051602081830303815290604052613697565b905060006124d285836040516020016124be929190614c0b565b604051602081830303815290604052613697565b90507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78860405160200161250691906148c0565b60405160208183030381529060405280519060200120141561290d5761252a613f4e565b601880805490508761253c91906152e1565b8154811061254d5761254c6153ce565b5b9060005260206000200180546125629061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461258e9061522b565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b5050505050816000600381106125f4576125f36153ce565b5b60200201819052508481600060038110612611576126106153ce565b5b6020020151604051602001612627929190614a13565b60405160208183030381529060405294507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78960405160200161266a91906148c0565b6040516020818303038152906040528051906020012014801561268d5750600e84115b1561290b5760178080549050846126a491906152e1565b815481106126b5576126b46153ce565b5b9060005260206000200180546126ca9061522b565b80601f01602080910402602001604051908101604052809291908181526020018280546126f69061522b565b80156127435780601f1061271857610100808354040283529160200191612743565b820191906000526020600020905b81548152906001019060200180831161272657829003601f168201915b50505050508160016003811061275c5761275b6153ce565b5b602002018190525080600160038110612778576127776153ce565b5b60200201518560405160200161278f929190614a13565b60405160208183030381529060405294507fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd7896040516020016127d291906148c0565b604051602081830303815290604052805190602001201480156127f6575060138410155b1561290a57601780805490508361280d91906152e1565b8154811061281e5761281d6153ce565b5b9060005260206000200180546128339061522b565b80601f016020809104026020016040519081016040528092919081815260200182805461285f9061522b565b80156128ac5780601f10612881576101008083540402835291602001916128ac565b820191906000526020600020905b81548152906001019060200180831161288f57829003601f168201915b5050505050816002600381106128c5576128c46153ce565b5b6020020181905250806002600381106128e1576128e06153ce565b5b6020020151856040516020016128f8929190614a13565b60405160208183030381529060405294505b5b505b7fe76267497a40ae3845c3a0df3de5e74c51e248e6c744dc6317c39cf6ef6e9cd78860405160200161293f91906148c0565b604051602081830303815290604052805190602001201480156129625750600183145b801561297a5750600160148361297891906152e1565b145b156129a05760405160200161298e90614b75565b60405160208183030381529060405293505b7f2cd64190c5262efbfb6d4486df923a5a8a33915fa0b5f8983f3f248d831cd773886040516020016129d291906148c0565b604051602081830303815290604052805190602001201480156129f55750600a83115b15612c7c57612a02613f75565b6012808054905084612a1491906152e1565b81548110612a2557612a246153ce565b5b906000526020600020018054612a3a9061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a669061522b565b8015612ab35780601f10612a8857610100808354040283529160200191612ab3565b820191906000526020600020905b815481529060010190602001808311612a9657829003601f168201915b505050505081600060028110612acc57612acb6153ce565b5b602002018190525080600060028110612ae857612ae76153ce565b5b602002015185604051602001612aff929190614a13565b60405160208183030381529060405294507f2cd64190c5262efbfb6d4486df923a5a8a33915fa0b5f8983f3f248d831cd77389604051602001612b4291906148c0565b60405160208183030381529060405280519060200120148015612b66575060128410155b15612c7a576013808054905083612b7d91906152e1565b81548110612b8e57612b8d6153ce565b5b906000526020600020018054612ba39061522b565b80601f0160208091040260200160405190810160405280929190818152602001828054612bcf9061522b565b8015612c1c5780601f10612bf157610100808354040283529160200191612c1c565b820191906000526020600020905b815481529060010190602001808311612bff57829003601f168201915b505050505081600160028110612c3557612c346153ce565b5b60200201819052508481600160028110612c5257612c516153ce565b5b6020020151604051602001612c68929190614a13565b60405160208183030381529060405294505b505b83955050505050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d5657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d665750612d65826136ca565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e5483610ebb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060006033612ed0612eac8561339e565b604051602001612ebc91906148c0565b604051602081830303815290604052613697565b612eda91906152e1565b905060606000601283612eed919061502a565b9050612ef88161339e565b604051602001612f0891906148c0565b6040516020818303038152906040529150819350505050919050565b6000612f2f82612d6d565b612f6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6590614dd6565b60405180910390fd5b6000612f7983610ebb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fe857508373ffffffffffffffffffffffffffffffffffffffff16612fd0846108e9565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ff95750612ff88185612160565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661302282610ebb565b73ffffffffffffffffffffffffffffffffffffffff1614613078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306f90614ed6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130df90614d96565b60405180910390fd5b6130f3838383613734565b6130fe600082612de1565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461314e919061510b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131a5919061502a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61333e828260405180602001604052806000815250613848565b5050565b61334d848484613002565b613359848484846138a3565b613398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161338f90614d16565b60405180910390fd5b50505050565b606060008214156133e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134fa565b600082905060005b600082146134185780806134019061528e565b915050600a826134119190615080565b91506133ee565b60008167ffffffffffffffff811115613434576134336153fd565b5b6040519080825280601f01601f1916602001820160405280156134665781602001600182028036833780820191505090505b5090505b600085146134f35760018261347f919061510b565b9150600a8561348e91906152e1565b603061349a919061502a565b60f81b8183815181106134b0576134af6153ce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134ec9190615080565b945061346a565b8093505050505b919050565b606060008251905060008114156135285760405180602001604052806000815250915050613692565b60006003600283613539919061502a565b6135439190615080565b600461354f91906150b1565b90506000602082613560919061502a565b67ffffffffffffffff811115613579576135786153fd565b5b6040519080825280601f01601f1916602001820160405280156135ab5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615f60604091399050600181016020830160005b8681101561364f5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506135d6565b506003860660018114613669576002811461367957613684565b613d3d60f01b6002830352613684565b603d60f81b60018303525b508484525050819450505050505b919050565b6000816040516020016136aa91906148c0565b6040516020818303038152906040528051906020012060001c9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61373f838383613a3a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137825761377d81613a3f565b6137c1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137c0576137bf8382613a88565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613804576137ff81613bf5565b613843565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613842576138418282613cc6565b5b5b505050565b6138528383613d45565b61385f60008484846138a3565b61389e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389590614d16565b60405180910390fd5b505050565b60006138c48473ffffffffffffffffffffffffffffffffffffffff16613f13565b15613a2d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138ed612dd9565b8786866040518563ffffffff1660e01b815260040161390f9493929190614c52565b602060405180830381600087803b15801561392957600080fd5b505af192505050801561395a57506040513d601f19601f8201168201806040525081019061395791906142a7565b60015b6139dd573d806000811461398a576040519150601f19603f3d011682016040523d82523d6000602084013e61398f565b606091505b506000815114156139d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139cc90614d16565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a32565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613a9584610f6d565b613a9f919061510b565b9050600060076000848152602001908152602001600020549050818114613b84576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c09919061510b565b9050600060096000848152602001908152602001600020549050600060088381548110613c3957613c386153ce565b5b906000526020600020015490508060088381548110613c5b57613c5a6153ce565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613caa57613ca961539f565b5b6001900381819060005260206000200160009055905550505050565b6000613cd183610f6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dac90614e56565b60405180910390fd5b613dbe81612d6d565b15613dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df590614d76565b60405180910390fd5b613e0a60008383613734565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613e5a919061502a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061026001604052806013905b6060815260200190600190039081613f365790505090565b60405180606001604052806003905b6060815260200190600190039081613f5d5790505090565b60405180604001604052806002905b6060815260200190600190039081613f845790505090565b6000613faf613faa84614fb6565b614f91565b905082815260208101848484011115613fcb57613fca615431565b5b613fd68482856151e9565b509392505050565b600081359050613fed81615cbe565b92915050565b60008151905061400281615cbe565b92915050565b60008135905061401781615cd5565b92915050565b60008135905061402c81615cec565b92915050565b60008151905061404181615cec565b92915050565b600082601f83011261405c5761405b61542c565b5b813561406c848260208601613f9c565b91505092915050565b60008135905061408481615d03565b92915050565b6000602082840312156140a05761409f61543b565b5b60006140ae84828501613fde565b91505092915050565b6000602082840312156140cd576140cc61543b565b5b60006140db84828501613ff3565b91505092915050565b600080604083850312156140fb576140fa61543b565b5b600061410985828601613fde565b925050602061411a85828601613fde565b9150509250929050565b60008060006060848603121561413d5761413c61543b565b5b600061414b86828701613fde565b935050602061415c86828701613fde565b925050604061416d86828701614075565b9150509250925092565b600080600080608085870312156141915761419061543b565b5b600061419f87828801613fde565b94505060206141b087828801613fde565b93505060406141c187828801614075565b925050606085013567ffffffffffffffff8111156141e2576141e1615436565b5b6141ee87828801614047565b91505092959194509250565b600080604083850312156142115761421061543b565b5b600061421f85828601613fde565b925050602061423085828601614008565b9150509250929050565b600080604083850312156142515761425061543b565b5b600061425f85828601613fde565b925050602061427085828601614075565b9150509250929050565b6000602082840312156142905761428f61543b565b5b600061429e8482850161401d565b91505092915050565b6000602082840312156142bd576142bc61543b565b5b60006142cb84828501614032565b91505092915050565b6000602082840312156142ea576142e961543b565b5b60006142f884828501614075565b91505092915050565b61430a8161513f565b82525050565b61431981615151565b82525050565b600061432a82614fe7565b6143348185614ffd565b93506143448185602086016151f8565b61434d81615440565b840191505092915050565b614361816151b3565b82525050565b600061437282614ff2565b61437c818561500e565b935061438c8185602086016151f8565b61439581615440565b840191505092915050565b60006143ab82614ff2565b6143b5818561501f565b93506143c58185602086016151f8565b80840191505092915050565b60006143de60158361501f565b91506143e982615451565b601582019050919050565b6000614401600a8361501f565b915061440c8261547a565b600a82019050919050565b6000614424602b8361500e565b915061442f826154a3565b604082019050919050565b600061444760328361500e565b9150614452826154f2565b604082019050919050565b600061446a601b8361500e565b915061447582615541565b602082019050919050565b600061448d60268361500e565b91506144988261556a565b604082019050919050565b60006144b0601c8361500e565b91506144bb826155b9565b602082019050919050565b60006144d360248361500e565b91506144de826155e2565b604082019050919050565b60006144f660198361500e565b915061450182615631565b602082019050919050565b600061451960058361501f565b91506145248261565a565b600582019050919050565b600061453c602c8361500e565b915061454782615683565b604082019050919050565b600061455f60018361501f565b915061456a826156d2565b600182019050919050565b6000614582600b8361501f565b915061458d826156fb565b600b82019050919050565b60006145a560388361500e565b91506145b082615724565b604082019050919050565b60006145c8602a8361500e565b91506145d382615773565b604082019050919050565b60006145eb60298361500e565b91506145f6826157c2565b604082019050919050565b600061460e600c8361501f565b915061461982615811565b600c82019050919050565b600061463160108361501f565b915061463c8261583a565b601082019050919050565b600061465460028361501f565b915061465f82615863565b600282019050919050565b600061467760208361500e565b91506146828261588c565b602082019050919050565b600061469a602c8361500e565b91506146a5826158b5565b604082019050919050565b60006146bd60208361500e565b91506146c882615904565b602082019050919050565b60006146e060108361500e565b91506146eb8261592d565b602082019050919050565b600061470360298361500e565b915061470e82615956565b604082019050919050565b600061472660218361500e565b9150614731826159a5565b604082019050919050565b6000614749601d8361501f565b9150614754826159f4565b601d82019050919050565b600061476c60cc8361501f565b915061477782615a1d565b60cc82019050919050565b600061478f60158361501f565b915061479a82615b2a565b601582019050919050565b60006147b260318361500e565b91506147bd82615b53565b604082019050919050565b60006147d560178361501f565b91506147e082615ba2565b601782019050919050565b60006147f8602c8361500e565b915061480382615bcb565b604082019050919050565b600061481b60108361501f565b915061482682615c1a565b601082019050919050565b600061483e601f8361500e565b915061484982615c43565b602082019050919050565b6000614861600e8361501f565b915061486c82615c6c565b600e82019050919050565b6000614884600b8361501f565b915061488f82615c95565b600b82019050919050565b6148a3816151a9565b82525050565b6148ba6148b5826151a9565b6152d7565b82525050565b60006148cc82846143a0565b915081905092915050565b60006148e382856143a0565b91506148ef82846143a0565b91508190509392505050565b6000614907828c6143a0565b9150614913828b6143a0565b915061491f828a6143a0565b915061492b82896143a0565b915061493782886143a0565b915061494382876143a0565b915061494f82866143a0565b915061495b82856143a0565b915061496782846143a0565b91508190509a9950505050505050505050565b6000614986828e6143a0565b9150614992828d6143a0565b915061499e828c6143a0565b91506149aa828b6143a0565b91506149b6828a6143a0565b91506149c282896143a0565b91506149ce82886143a0565b91506149da82876143a0565b91506149e682866143a0565b91506149f282856143a0565b91506149fe82846143a0565b91508190509c9b505050505050505050505050565b6000614a1f82856143a0565b9150614a2a82614552565b9150614a3682846143a0565b91508190509392505050565b6000614a4d826143d1565b9150614a5982846143a0565b915081905092915050565b6000614a6f826143f4565b9150614a7b82846143a0565b915081905092915050565b6000614a918261450c565b9150614a9d82846143a0565b915081905092915050565b6000614ab382614575565b9150614abf82846143a0565b915081905092915050565b6000614ad582614601565b9150614ae182846143a0565b915081905092915050565b6000614af782614624565b9150614b0382846143a0565b915081905092915050565b6000614b198261473c565b9150614b2582846143a0565b915081905092915050565b6000614b3b82614782565b9150614b4782856143a0565b9150614b528261475f565b9150614b5e82846143a0565b9150614b6982614647565b91508190509392505050565b6000614b80826147c8565b9150819050919050565b6000614b958261480e565b9150614ba182846143a0565b915081905092915050565b6000614bb782614854565b9150614bc382846143a0565b915081905092915050565b6000614bd982614877565b9150614be582846143a0565b915081905092915050565b6000614bfc82846148a9565b60208201915081905092915050565b6000614c1782856148a9565b602082019150614c2782846148a9565b6020820191508190509392505050565b6000602082019050614c4c6000830184614301565b92915050565b6000608082019050614c676000830187614301565b614c746020830186614301565b614c81604083018561489a565b8181036060830152614c93818461431f565b905095945050505050565b6000602082019050614cb36000830184614310565b92915050565b6000602082019050614cce6000830184614358565b92915050565b60006020820190508181036000830152614cee8184614367565b905092915050565b60006020820190508181036000830152614d0f81614417565b9050919050565b60006020820190508181036000830152614d2f8161443a565b9050919050565b60006020820190508181036000830152614d4f8161445d565b9050919050565b60006020820190508181036000830152614d6f81614480565b9050919050565b60006020820190508181036000830152614d8f816144a3565b9050919050565b60006020820190508181036000830152614daf816144c6565b9050919050565b60006020820190508181036000830152614dcf816144e9565b9050919050565b60006020820190508181036000830152614def8161452f565b9050919050565b60006020820190508181036000830152614e0f81614598565b9050919050565b60006020820190508181036000830152614e2f816145bb565b9050919050565b60006020820190508181036000830152614e4f816145de565b9050919050565b60006020820190508181036000830152614e6f8161466a565b9050919050565b60006020820190508181036000830152614e8f8161468d565b9050919050565b60006020820190508181036000830152614eaf816146b0565b9050919050565b60006020820190508181036000830152614ecf816146d3565b9050919050565b60006020820190508181036000830152614eef816146f6565b9050919050565b60006020820190508181036000830152614f0f81614719565b9050919050565b60006020820190508181036000830152614f2f816147a5565b9050919050565b60006020820190508181036000830152614f4f816147eb565b9050919050565b60006020820190508181036000830152614f6f81614831565b9050919050565b6000602082019050614f8b600083018461489a565b92915050565b6000614f9b614fac565b9050614fa7828261525d565b919050565b6000604051905090565b600067ffffffffffffffff821115614fd157614fd06153fd565b5b614fda82615440565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615035826151a9565b9150615040836151a9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561507557615074615312565b5b828201905092915050565b600061508b826151a9565b9150615096836151a9565b9250826150a6576150a5615341565b5b828204905092915050565b60006150bc826151a9565b91506150c7836151a9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615100576150ff615312565b5b828202905092915050565b6000615116826151a9565b9150615121836151a9565b92508282101561513457615133615312565b5b828203905092915050565b600061514a82615189565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006151be826151c5565b9050919050565b60006151d0826151d7565b9050919050565b60006151e282615189565b9050919050565b82818337600083830152505050565b60005b838110156152165780820151818401526020810190506151fb565b83811115615225576000848401525b50505050565b6000600282049050600182168061524357607f821691505b6020821081141561525757615256615370565b5b50919050565b61526682615440565b810181811067ffffffffffffffff82111715615285576152846153fd565b5b80604052505050565b6000615299826151a9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152cc576152cb615312565b5b600182019050919050565b6000819050919050565b60006152ec826151a9565b91506152f7836151a9565b92508261530757615306615341565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4661766f7572697465204163636573736f72793a200000000000000000000000600082015250565b7f50726f6e6f756e733a2000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f66207468697320426c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4167653a20000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4c617374204e616d653a20000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4669727374204e616d653a200000000000000000000000000000000000000000600082015250565b7f427265616b6f757420466c69636b3a2000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f222c20226465736372697074696f6e223a20224576657279206d65746176657260008201527f7365206465736572766573206974732073746172732e204d656574207468652060208201527f74727565207030726e7374617273206f66204e4654212036393639207374617260408201527f73206f6620746865204e465420756e6976657273652c20616c6c206f6e2d636860608201527f61696e2c20736f6d6574696d657320696e2d636861696e732c206f6e2d64656d60808201527f616e642e20222c2022696d616765223a2022646174613a696d6167652f73766760a08201527f2b786d6c3b6261736536342c000000000000000000000000000000000000000060c082015250565b7f7b226e616d65223a2022506c6f6f745374617220230000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f546865204c75737479204172676f6e69616e204d616964000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4661766f757269746520526f6c653a2000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f436f737420746f20486972653a20000000000000000000000000000000000000600082015250565b7f47656e6974616c69613a20000000000000000000000000000000000000000000600082015250565b615cc78161513f565b8114615cd257600080fd5b50565b615cde81615151565b8114615ce957600080fd5b50565b615cf58161515d565b8114615d0057600080fd5b50565b615d0c816151a9565b8114615d1757600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020343030223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313170783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222341433437444522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223230302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220c25072faf60474c37365eed7bbf94529f6b4a40dbc0f48904d521944bfff031364736f6c63430008070033

Deployed Bytecode Sourcemap

44484:12008:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48845:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38226:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25354:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26913:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48583:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44557:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38866:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27803:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48703:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38534:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44635:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28213:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48448:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39056:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25048:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24778:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9818:94;;;:::i;:::-;;9167:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48313:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25523:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48992:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55244:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27206:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55424:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28469:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52014:3222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49421:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49139:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27572:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10067:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49274:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48845;48905:13;48938:38;48944:7;48938:38;;;;;;;;;;;;;;;;;48966:9;48938:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;48931:45;;48845:139;;;:::o;38226:224::-;38328:4;38367:35;38352:50;;;:11;:50;;;;:90;;;;38406:36;38430:11;38406:23;:36::i;:::-;38352:90;38345:97;;38226:224;;;:::o;25354:100::-;25408:13;25441:5;25434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25354:100;:::o;26913:221::-;26989:7;27017:16;27025:7;27017;:16::i;:::-;27009:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27102:15;:24;27118:7;27102:24;;;;;;;;;;;;;;;;;;;;;27095:31;;26913:221;;;:::o;26436:411::-;26517:13;26533:23;26548:7;26533:14;:23::i;:::-;26517:39;;26581:5;26575:11;;:2;:11;;;;26567:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26675:5;26659:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26684:37;26701:5;26708:12;:10;:12::i;:::-;26684:16;:37::i;:::-;26659:62;26637:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26818:21;26827:2;26831:7;26818:8;:21::i;:::-;26506:341;26436:411;;:::o;48583:112::-;48637:13;48670:17;48679:7;48670:8;:17::i;:::-;48663:24;;48583:112;;;:::o;44557:71::-;;;;;;;;;;;;;:::o;38866:113::-;38927:7;38954:10;:17;;;;38947:24;;38866:113;:::o;27803:339::-;27998:41;28017:12;:10;:12::i;:::-;28031:7;27998:18;:41::i;:::-;27990:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28106:28;28116:4;28122:2;28126:7;28106:9;:28::i;:::-;27803:339;;;:::o;48703:134::-;48761:13;48794:35;48800:7;48794:35;;;;;;;;;;;;;;;;;48820:8;48794:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;48787:42;;48703:134;;;:::o;38534:256::-;38631:7;38667:23;38684:5;38667:16;:23::i;:::-;38659:5;:31;38651:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38756:12;:19;38769:5;38756:19;;;;;;;;;;;;;;;:26;38776:5;38756:26;;;;;;;;;;;;38749:33;;38534:256;;;;:::o;44635:62::-;;;;;;;;;;;;;:::o;28213:185::-;28351:39;28368:4;28374:2;28378:7;28351:39;;;;;;;;;;;;:16;:39::i;:::-;28213:185;;;:::o;48448:127::-;48504:13;48537:30;48543:7;48537:30;;;;;;;;;;;;;;;;;48561:5;48537:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;48530:37;;48448:127;;;:::o;39056:233::-;39131:7;39167:30;:28;:30::i;:::-;39159:5;:38;39151:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39264:10;39275:5;39264:17;;;;;;;;:::i;:::-;;;;;;;;;;39257:24;;39056:233;;;:::o;25048:239::-;25120:7;25140:13;25156:7;:16;25164:7;25156:16;;;;;;;;;;;;;;;;;;;;;25140:32;;25208:1;25191:19;;:5;:19;;;;25183:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25274:5;25267:12;;;25048:239;;;:::o;24778:208::-;24850:7;24895:1;24878:19;;:5;:19;;;;24870:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24962:9;:16;24972:5;24962:16;;;;;;;;;;;;;;;;24955:23;;24778:208;;;:::o;9818:94::-;9398:12;:10;:12::i;:::-;9387:23;;:7;:5;:7::i;:::-;:23;;;9379:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9883:21:::1;9901:1;9883:9;:21::i;:::-;9818:94::o:0;9167:87::-;9213:7;9240:6;;;;;;;;;;;9233:13;;9167:87;:::o;48313:127::-;48369:13;48402:30;48408:7;48402:30;;;;;;;;;;;;;;;;;48426:5;48402:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;48395:37;;48313:127;;;:::o;25523:104::-;25579:13;25612:7;25605:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25523:104;:::o;48992:139::-;49056:13;49089:34;49095:7;49089:34;;;;;;;;;;;;;;;;;49115:7;49089:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:34::i;:::-;49082:41;;48992:139;;;:::o;55244:172::-;12098:1;12694:7;;:19;;12686:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12098:1;12827:7;:18;;;;55324:1:::1;55314:7;:11;:30;;;;;55340:4;55329:7;:15;;55314:30;55306:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;55376:32;55386:12;:10;:12::i;:::-;55400:7;55376:9;:32::i;:::-;12054:1:::0;13006:7;:22;;;;55244:172;:::o;27206:295::-;27321:12;:10;:12::i;:::-;27309:24;;:8;:24;;;;27301:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27421:8;27376:18;:32;27395:12;:10;:12::i;:::-;27376:32;;;;;;;;;;;;;;;:42;27409:8;27376:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27474:8;27445:48;;27460:12;:10;:12::i;:::-;27445:48;;;27484:8;27445:48;;;;;;:::i;:::-;;;;;;;;27206:295;;:::o;55424:270::-;12098:1;12694:7;;:19;;12686:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12098:1;12827:7;:18;;;;55511:1:::1;55502:6;:10;:28;;;;;55526:4;55516:6;:14;;55502:28;55494:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55602:10;55570:42;;:12;;;;;;;;;;;:20;;;55591:6;55570:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;55562:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55655:31;55665:12;:10;:12::i;:::-;55679:6;55655:9;:31::i;:::-;12054:1:::0;13006:7;:22;;;;55424:270;:::o;28469:328::-;28644:41;28663:12;:10;:12::i;:::-;28677:7;28644:18;:41::i;:::-;28636:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28750:39;28764:4;28770:2;28774:7;28783:5;28750:13;:39::i;:::-;28469:328;;;;:::o;52014:3222::-;52079:13;52105:23;;:::i;:::-;52139:268;;;;;;;;;;;;;;;;;:5;52145:1;52139:8;;;;;;;:::i;:::-;;;;;:268;;;;52470:17;52479:7;52470:8;:17::i;:::-;52438:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;52420:5;52426:1;52420:8;;;;;;;:::i;:::-;;;;;:69;;;;52502:53;;;;;;;;;;;;;;;;;:5;52508:1;52502:8;;;;;;;:::i;:::-;;;;;:53;;;;52617:17;52626:7;52617:8;:17::i;:::-;52586:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;52568:5;52574:1;52568:8;;;;;;;:::i;:::-;;;;;:68;;;;52649:53;;;;;;;;;;;;;;;;;:5;52655:1;52649:8;;;;;;;:::i;:::-;;;;;:53;;;;52758:15;52765:7;52758:6;:15::i;:::-;52733:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;52715:5;52721:1;52715:8;;;;;;;:::i;:::-;;;;;:60;;;;52788:53;;;;;;;;;;;;;;;;;:5;52794:1;52788:8;;;;;;;:::i;:::-;;;;;:53;;;;52902:19;52913:7;52902:10;:19::i;:::-;52872:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;52854:5;52860:1;52854:8;;;;;;;:::i;:::-;;;;;:69;;;;52936:54;;;;;;;;;;;;;;;;;:5;52942:1;52936:8;;;;;;;:::i;:::-;;;;;:54;;;;53062:21;53075:7;53062:12;:21::i;:::-;53021:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;53003:5;53009:1;53003:8;;;;;;;:::i;:::-;;;;;:82;;;;53098:55;;;;;;;;;;;;;;;;;:5;53104:2;53098:9;;;;;;;:::i;:::-;;;;;:55;;;;53221:25;53238:7;53221:16;:25::i;:::-;53185:62;;;;;;;;:::i;:::-;;;;;;;;;;;;;53166:5;53172:2;53166:9;;;;;;;:::i;:::-;;;;;:82;;;;53261:55;;;;;;;;;;;;;;;;;:5;53267:2;53261:9;;;;;;;:::i;:::-;;;;;:55;;;;53382:17;53391:7;53382:8;:17::i;:::-;53348:52;;;;;;;;:::i;:::-;;;;;;;;;;;;;53329:5;53335:2;53329:9;;;;;;;:::i;:::-;;;;;:72;;;;53414:55;;;;;;;;;;;;;;;;;:5;53420:2;53414:9;;;;;;;:::i;:::-;;;;;:55;;;;53532:23;53547:7;53532:14;:23::i;:::-;53501:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;53482:5;53488:2;53482:9;;;;;;;:::i;:::-;;;;;:75;;;;53570:55;;;;;;;;;;;;;;;;;:5;53576:2;53570:9;;;;;;;:::i;:::-;;;;;:55;;;;53693:21;53706:7;53693:12;:21::i;:::-;53657:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;53638:5;53644:2;53638:9;;;;;;;:::i;:::-;;;;;:78;;;;53729:55;;;;;;;;;;;;;;;;;:5;53735:2;53729:9;;;;;;;:::i;:::-;;;;;:55;;;;53799:20;53878:5;53884:1;53878:8;;;;;;;:::i;:::-;;;;;;53906:5;53912:1;53906:8;;;;;;;:::i;:::-;;;;;;53934:5;53940:1;53934:8;;;;;;;:::i;:::-;;;;;;53962:5;53968:1;53962:8;;;;;;;:::i;:::-;;;;;;53990:5;53996:1;53990:8;;;;;;;:::i;:::-;;;;;;54018:5;54024:1;54018:8;;;;;;;:::i;:::-;;;;;;54046:5;54052:1;54046:8;;;;;;;:::i;:::-;;;;;;54074:5;54080:1;54074:8;;;;;;;:::i;:::-;;;;;;54102:5;54108:1;54102:8;;;;;;;:::i;:::-;;;;;;53843:268;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53799:323;;54198:6;54223:5;54229:1;54223:8;;;;;;;:::i;:::-;;;;;;54250:5;54256:2;54250:9;;;;;;;:::i;:::-;;;;;;54278:5;54284:2;54278:9;;;;;;;:::i;:::-;;;;;;54306:5;54312:2;54306:9;;;;;;;:::i;:::-;;;;;;54334:5;54340:2;54334:9;;;;;;;:::i;:::-;;;;;;54362:5;54368:2;54362:9;;;;;;;:::i;:::-;;;;;;54390:5;54396:2;54390:9;;;;;;;:::i;:::-;;;;;;54418:5;54424:2;54418:9;;;;;;;:::i;:::-;;;;;;54446:5;54452:2;54446:9;;;;;;;:::i;:::-;;;;;;54474:5;54480:2;54474:9;;;;;;;:::i;:::-;;;;;;54163:321;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54133:362;;54520:18;54541:578;54715:17;54724:7;54715:8;:17::i;:::-;54992:28;55012:6;54992:13;:28::i;:::-;54622:452;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54541:13;:578::i;:::-;54520:599;;55196:4;55146:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;55130:72;;55222:6;55215:13;;;;;52014:3222;;;:::o;49421:132::-;49481:13;49514:31;49520:7;49514:31;;;;;;;;;;;;;;;;;49538:6;49514:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:31::i;:::-;49507:38;;49421:132;;;:::o;49139:127::-;49195:13;49228:30;49234:7;49228:30;;;;;;;;;;;;;;;;;49252:5;49228:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;49221:37;;49139:127;;;:::o;27572:164::-;27669:4;27693:18;:25;27712:5;27693:25;;;;;;;;;;;;;;;:35;27719:8;27693:35;;;;;;;;;;;;;;;;;;;;;;;;;27686:42;;27572:164;;;;:::o;10067:192::-;9398:12;:10;:12::i;:::-;9387:23;;:7;:5;:7::i;:::-;:23;;;9379:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10176:1:::1;10156:22;;:8;:22;;;;10148:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10232:19;10242:8;10232:9;:19::i;:::-;10067:192:::0;:::o;49274:139::-;49336:13;49369:36;49375:7;49369:36;;;;;;;;;;;;;;;;;49396:8;49369:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;:::-;49362:43;;49274:139;;;:::o;49570:2074::-;49713:13;49739:12;49754:62;49785:9;49796:17;49805:7;49796:8;:17::i;:::-;49768:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49754:6;:62::i;:::-;49739:77;;49827:20;49850:11;49869;:18;49862:4;:25;;;;:::i;:::-;49850:38;;;;;;;;:::i;:::-;;;;;;;;49827:61;;49899:17;49926:2;49919:4;:9;;;;:::i;:::-;49899:29;;49939:13;49955:38;49986:4;49969:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;49955:6;:38::i;:::-;49939:54;;50004:13;50020:45;50051:4;50057:5;50034:29;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50020:6;:45::i;:::-;50004:61;;50124:18;50109:9;50092:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50082:38;;;;;;:60;50078:770;;;50159:21;;:::i;:::-;50205:6;50219;:13;;;;50212:4;:20;;;;:::i;:::-;50205:28;;;;;;;;:::i;:::-;;;;;;;;;50195:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50200:1;50195:7;;;;;;;:::i;:::-;;;;;:38;;;;50281:6;50294:4;50299:1;50294:7;;;;;;;:::i;:::-;;;;;;50264:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50248:55;;50386:18;50371:9;50354:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50344:38;;;;;;:60;:78;;;;;50420:2;50408:9;:14;50344:78;50340:497;;;50451:6;50466;:13;;;;50458:5;:21;;;;:::i;:::-;50451:29;;;;;;;;:::i;:::-;;;;;;;;;50441:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50446:1;50441:7;;;;;;;:::i;:::-;;;;;:39;;;;50528:4;50533:1;50528:7;;;;;;;:::i;:::-;;;;;;50541:6;50511:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50495:54;;50632:18;50617:9;50600:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50590:38;;;;;;:60;:79;;;;;50667:2;50654:9;:15;;50590:79;50586:236;;;50700:6;50715;:13;;;;50707:5;:21;;;;:::i;:::-;50700:29;;;;;;;;:::i;:::-;;;;;;;;;50690:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50695:1;50690:7;;;;;;;:::i;:::-;;;;;:39;;;;50781:4;50786:1;50781:7;;;;;;;:::i;:::-;;;;;;50794:6;50764:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50748:54;;50586:236;50340:497;50144:704;50078:770;50914:18;50899:9;50882:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50872:38;;;;;;:60;:78;;;;;50949:1;50936:9;:14;50872:78;:97;;;;;50968:1;50962:2;50954:5;:10;;;;:::i;:::-;:15;50872:97;50868:190;;;51002:43;;;;;;;:::i;:::-;;;;;;;;;;;;;50986:60;;50868:190;51126:22;51111:9;51094:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;51084:38;;;;;;:64;:82;;;;;51164:2;51152:9;:14;51084:82;51080:523;;;51183:21;;:::i;:::-;51229:8;51246;:15;;;;51238:5;:23;;;;:::i;:::-;51229:33;;;;;;;;:::i;:::-;;;;;;;;;51219:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;51224:1;51219:7;;;;;;;:::i;:::-;;;;;:43;;;;51310:4;51315:1;51310:7;;;;;;;:::i;:::-;;;;;;51324:6;51293:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51277:55;;51397:22;51382:9;51365:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;51355:38;;;;;;:64;:83;;;;;51436:2;51423:9;:15;;51355:83;51351:241;;;51469:8;51486;:15;;;;51478:5;:23;;;;:::i;:::-;51469:33;;;;;;;;:::i;:::-;;;;;;;;;51459:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;51464:1;51459:7;;;;;;;:::i;:::-;;;;;:43;;;;51554:6;51567:4;51572:1;51567:7;;;;;;;:::i;:::-;;;;;;51537:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51521:55;;51351:241;51168:435;51080:523;51630:6;51623:13;;;;;;;49570:2074;;;;;:::o;24409:305::-;24511:4;24563:25;24548:40;;;:11;:40;;;;:105;;;;24620:33;24605:48;;;:11;:48;;;;24548:105;:158;;;;24670:36;24694:11;24670:23;:36::i;:::-;24548:158;24528:178;;24409:305;;;:::o;30307:127::-;30372:4;30424:1;30396:30;;:7;:16;30404:7;30396:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30389:37;;30307:127;;;:::o;8043:98::-;8096:7;8123:10;8116:17;;8043:98;:::o;34289:174::-;34391:2;34364:15;:24;34380:7;34364:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34447:7;34443:2;34409:46;;34418:23;34433:7;34418:14;:23::i;:::-;34409:46;;;;;;;;;;;;34289:174;;:::o;51656:348::-;51730:13;51757:12;51826:2;51772:51;51803:17;51812:7;51803:8;:17::i;:::-;51786:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;51772:6;:51::i;:::-;:56;;;;:::i;:::-;51757:71;;51839:20;51870:14;51894:2;51887:4;:9;;;;:::i;:::-;51870:26;;51950:16;51959:6;51950:8;:16::i;:::-;51933:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;51917:51;;51986:6;51979:13;;;;;51656:348;;;:::o;30601:::-;30694:4;30719:16;30727:7;30719;:16::i;:::-;30711:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30795:13;30811:23;30826:7;30811:14;:23::i;:::-;30795:39;;30864:5;30853:16;;:7;:16;;;:51;;;;30897:7;30873:31;;:20;30885:7;30873:11;:20::i;:::-;:31;;;30853:51;:87;;;;30908:32;30925:5;30932:7;30908:16;:32::i;:::-;30853:87;30845:96;;;30601:348;;;;:::o;33593:578::-;33752:4;33725:31;;:23;33740:7;33725:14;:23::i;:::-;:31;;;33717:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33835:1;33821:16;;:2;:16;;;;33813:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33891:39;33912:4;33918:2;33922:7;33891:20;:39::i;:::-;33995:29;34012:1;34016:7;33995:8;:29::i;:::-;34056:1;34037:9;:15;34047:4;34037:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34085:1;34068:9;:13;34078:2;34068:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34116:2;34097:7;:16;34105:7;34097:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34155:7;34151:2;34136:27;;34145:4;34136:27;;;;;;;;;;;;33593:578;;;:::o;10267:173::-;10323:16;10342:6;;;;;;;;;;;10323:25;;10368:8;10359:6;;:17;;;;;;;;;;;;;;;;;;10423:8;10392:40;;10413:8;10392:40;;;;;;;;;;;;10312:128;10267:173;:::o;31291:110::-;31367:26;31377:2;31381:7;31367:26;;;;;;;;;;;;:9;:26::i;:::-;31291:110;;:::o;29679:315::-;29836:28;29846:4;29852:2;29856:7;29836:9;:28::i;:::-;29883:48;29906:4;29912:2;29916:7;29925:5;29883:22;:48::i;:::-;29875:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29679:315;;;;:::o;55702:723::-;55758:13;55988:1;55979:5;:10;55975:53;;;56006:10;;;;;;;;;;;;;;;;;;;;;55975:53;56038:12;56053:5;56038:20;;56069:14;56094:78;56109:1;56101:4;:9;56094:78;;56127:8;;;;;:::i;:::-;;;;56158:2;56150:10;;;;;:::i;:::-;;;56094:78;;;56182:19;56214:6;56204:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56182:39;;56232:154;56248:1;56239:5;:10;56232:154;;56276:1;56266:11;;;;;:::i;:::-;;;56343:2;56335:5;:10;;;;:::i;:::-;56322:2;:24;;;;:::i;:::-;56309:39;;56292:6;56299;56292:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;56372:2;56363:11;;;;;:::i;:::-;;;56232:154;;;56410:6;56396:21;;;;;55702:723;;;;:::o;56843:1607::-;56901:13;56927:11;56941:4;:11;56927:25;;56974:1;56967:3;:8;56963:23;;;56977:9;;;;;;;;;;;;;;;;;56963:23;57038:18;57076:1;57071;57065:3;:7;;;;:::i;:::-;57064:13;;;;:::i;:::-;57059:1;:19;;;;:::i;:::-;57038:40;;57136:19;57181:2;57168:10;:15;;;;:::i;:::-;57158:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57136:48;;57197:18;57218:5;;;;;;;;;;;;;;;;;57197:26;;57287:1;57280:5;57276:13;57332:2;57324:6;57320:15;57383:1;57351:777;57406:3;57403:1;57400:10;57351:777;;;57461:1;57458;57454:9;57449:14;;57519:8;57514:1;57508:4;57504:12;57498:19;57494:34;57599:4;57591:5;57587:2;57583:14;57579:25;57569:8;57565:40;57559:47;57638:3;57635:1;57631:11;57624:18;;57729:4;57720;57712:5;57708:2;57704:14;57700:25;57690:8;57686:40;57680:47;57676:58;57671:3;57667:68;57660:75;;57767:3;57764:1;57760:11;57753:18;;57857:4;57848;57840:5;57837:1;57833:13;57829:24;57819:8;57815:39;57809:46;57805:57;57800:3;57796:67;57789:74;;57895:3;57892:1;57888:11;57881:18;;57977:4;57968;57961:5;57957:16;57947:8;57943:31;57937:38;57933:49;57928:3;57924:59;57917:66;;58017:3;58012;58008:13;58001:20;;58059:3;58048:9;58041:22;58111:1;58100:9;58096:17;58083:30;;57430:698;;57351:777;;;57355:44;58160:1;58155:3;58151:11;58181:1;58176:84;;;;58279:1;58274:82;;;;58144:212;;58176:84;58237:6;58232:3;58228:16;58224:1;58213:9;58209:17;58202:43;58176:84;;58274:82;58335:4;58330:3;58326:14;58322:1;58311:9;58307:17;58300:41;58144:212;;58387:10;58379:6;58372:26;57245:1164;;58435:6;58421:21;;;;;;56843:1607;;;;:::o;48167:138::-;48227:7;48289:5;48272:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;48262:34;;;;;;48254:43;;48247:50;;48167:138;;;:::o;23018:157::-;23103:4;23142:25;23127:40;;;:11;:40;;;;23120:47;;23018:157;;;:::o;39902:589::-;40046:45;40073:4;40079:2;40083:7;40046:26;:45::i;:::-;40124:1;40108:18;;:4;:18;;;40104:187;;;40143:40;40175:7;40143:31;:40::i;:::-;40104:187;;;40213:2;40205:10;;:4;:10;;;40201:90;;40232:47;40265:4;40271:7;40232:32;:47::i;:::-;40201:90;40104:187;40319:1;40305:16;;:2;:16;;;40301:183;;;40338:45;40375:7;40338:36;:45::i;:::-;40301:183;;;40411:4;40405:10;;:2;:10;;;40401:83;;40432:40;40460:2;40464:7;40432:27;:40::i;:::-;40401:83;40301:183;39902:589;;;:::o;31628:321::-;31758:18;31764:2;31768:7;31758:5;:18::i;:::-;31809:54;31840:1;31844:2;31848:7;31857:5;31809:22;:54::i;:::-;31787:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31628:321;;;:::o;35028:803::-;35183:4;35204:15;:2;:13;;;:15::i;:::-;35200:624;;;35256:2;35240:36;;;35277:12;:10;:12::i;:::-;35291:4;35297:7;35306:5;35240:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35236:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35503:1;35486:6;:13;:18;35482:272;;;35529:60;;;;;;;;;;:::i;:::-;;;;;;;;35482:272;35704:6;35698:13;35689:6;35685:2;35681:15;35674:38;35236:533;35373:45;;;35363:55;;;:6;:55;;;;35356:62;;;;;35200:624;35808:4;35801:11;;35028:803;;;;;;;:::o;36403:126::-;;;;:::o;41214:164::-;41318:10;:17;;;;41291:15;:24;41307:7;41291:24;;;;;;;;;;;:44;;;;41346:10;41362:7;41346:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41214:164;:::o;42005:988::-;42271:22;42321:1;42296:22;42313:4;42296:16;:22::i;:::-;:26;;;;:::i;:::-;42271:51;;42333:18;42354:17;:26;42372:7;42354:26;;;;;;;;;;;;42333:47;;42501:14;42487:10;:28;42483:328;;42532:19;42554:12;:18;42567:4;42554:18;;;;;;;;;;;;;;;:34;42573:14;42554:34;;;;;;;;;;;;42532:56;;42638:11;42605:12;:18;42618:4;42605:18;;;;;;;;;;;;;;;:30;42624:10;42605:30;;;;;;;;;;;:44;;;;42755:10;42722:17;:30;42740:11;42722:30;;;;;;;;;;;:43;;;;42517:294;42483:328;42907:17;:26;42925:7;42907:26;;;;;;;;;;;42900:33;;;42951:12;:18;42964:4;42951:18;;;;;;;;;;;;;;;:34;42970:14;42951:34;;;;;;;;;;;42944:41;;;42086:907;;42005:988;;:::o;43288:1079::-;43541:22;43586:1;43566:10;:17;;;;:21;;;;:::i;:::-;43541:46;;43598:18;43619:15;:24;43635:7;43619:24;;;;;;;;;;;;43598:45;;43970:19;43992:10;44003:14;43992:26;;;;;;;;:::i;:::-;;;;;;;;;;43970:48;;44056:11;44031:10;44042;44031:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44167:10;44136:15;:28;44152:11;44136:28;;;;;;;;;;;:41;;;;44308:15;:24;44324:7;44308:24;;;;;;;;;;;44301:31;;;44343:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43359:1008;;;43288:1079;:::o;40792:221::-;40877:14;40894:20;40911:2;40894:16;:20::i;:::-;40877:37;;40952:7;40925:12;:16;40938:2;40925:16;;;;;;;;;;;;;;;:24;40942:6;40925:24;;;;;;;;;;;:34;;;;40999:6;40970:17;:26;40988:7;40970:26;;;;;;;;;;;:35;;;;40866:147;40792:221;;:::o;32285:382::-;32379:1;32365:16;;:2;:16;;;;32357:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32438:16;32446:7;32438;:16::i;:::-;32437:17;32429:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32500:45;32529:1;32533:2;32537:7;32500:20;:45::i;:::-;32575:1;32558:9;:13;32568:2;32558:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32606:2;32587:7;:16;32595:7;32587:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32651:7;32647:2;32626:33;;32643:1;32626:33;;;;;;;;;;;;32285:382;;:::o;15206:387::-;15266:4;15474:12;15541:7;15529:20;15521:28;;15584:1;15577:4;:8;15570:15;;;15206:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:143::-;625:5;656:6;650:13;641:22;;672:33;699:5;672:33;:::i;:::-;568:143;;;;:::o;717:133::-;760:5;798:6;785:20;776:29;;814:30;838:5;814:30;:::i;:::-;717:133;;;;:::o;856:137::-;901:5;939:6;926:20;917:29;;955:32;981:5;955:32;:::i;:::-;856:137;;;;:::o;999:141::-;1055:5;1086:6;1080:13;1071:22;;1102:32;1128:5;1102:32;:::i;:::-;999:141;;;;:::o;1159:338::-;1214:5;1263:3;1256:4;1248:6;1244:17;1240:27;1230:122;;1271:79;;:::i;:::-;1230:122;1388:6;1375:20;1413:78;1487:3;1479:6;1472:4;1464:6;1460:17;1413:78;:::i;:::-;1404:87;;1220:277;1159:338;;;;:::o;1503:139::-;1549:5;1587:6;1574:20;1565:29;;1603:33;1630:5;1603:33;:::i;:::-;1503:139;;;;:::o;1648:329::-;1707:6;1756:2;1744:9;1735:7;1731:23;1727:32;1724:119;;;1762:79;;:::i;:::-;1724:119;1882:1;1907:53;1952:7;1943:6;1932:9;1928:22;1907:53;:::i;:::-;1897:63;;1853:117;1648:329;;;;:::o;1983:351::-;2053:6;2102:2;2090:9;2081:7;2077:23;2073:32;2070:119;;;2108:79;;:::i;:::-;2070:119;2228:1;2253:64;2309:7;2300:6;2289:9;2285:22;2253:64;:::i;:::-;2243:74;;2199:128;1983:351;;;;:::o;2340:474::-;2408:6;2416;2465:2;2453:9;2444:7;2440:23;2436:32;2433:119;;;2471:79;;:::i;:::-;2433:119;2591:1;2616:53;2661:7;2652:6;2641:9;2637:22;2616:53;:::i;:::-;2606:63;;2562:117;2718:2;2744:53;2789:7;2780:6;2769:9;2765:22;2744:53;:::i;:::-;2734:63;;2689:118;2340:474;;;;;:::o;2820:619::-;2897:6;2905;2913;2962:2;2950:9;2941:7;2937:23;2933:32;2930:119;;;2968:79;;:::i;:::-;2930:119;3088:1;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3059:117;3215:2;3241:53;3286:7;3277:6;3266:9;3262:22;3241:53;:::i;:::-;3231:63;;3186:118;3343:2;3369:53;3414:7;3405:6;3394:9;3390:22;3369:53;:::i;:::-;3359:63;;3314:118;2820:619;;;;;:::o;3445:943::-;3540:6;3548;3556;3564;3613:3;3601:9;3592:7;3588:23;3584:33;3581:120;;;3620:79;;:::i;:::-;3581:120;3740:1;3765:53;3810:7;3801:6;3790:9;3786:22;3765:53;:::i;:::-;3755:63;;3711:117;3867:2;3893:53;3938:7;3929:6;3918:9;3914:22;3893:53;:::i;:::-;3883:63;;3838:118;3995:2;4021:53;4066:7;4057:6;4046:9;4042:22;4021:53;:::i;:::-;4011:63;;3966:118;4151:2;4140:9;4136:18;4123:32;4182:18;4174:6;4171:30;4168:117;;;4204:79;;:::i;:::-;4168:117;4309:62;4363:7;4354:6;4343:9;4339:22;4309:62;:::i;:::-;4299:72;;4094:287;3445:943;;;;;;;:::o;4394:468::-;4459:6;4467;4516:2;4504:9;4495:7;4491:23;4487:32;4484:119;;;4522:79;;:::i;:::-;4484:119;4642:1;4667:53;4712:7;4703:6;4692:9;4688:22;4667:53;:::i;:::-;4657:63;;4613:117;4769:2;4795:50;4837:7;4828:6;4817:9;4813:22;4795:50;:::i;:::-;4785:60;;4740:115;4394:468;;;;;:::o;4868:474::-;4936:6;4944;4993:2;4981:9;4972:7;4968:23;4964:32;4961:119;;;4999:79;;:::i;:::-;4961:119;5119:1;5144:53;5189:7;5180:6;5169:9;5165:22;5144:53;:::i;:::-;5134:63;;5090:117;5246:2;5272:53;5317:7;5308:6;5297:9;5293:22;5272:53;:::i;:::-;5262:63;;5217:118;4868:474;;;;;:::o;5348:327::-;5406:6;5455:2;5443:9;5434:7;5430:23;5426:32;5423:119;;;5461:79;;:::i;:::-;5423:119;5581:1;5606:52;5650:7;5641:6;5630:9;5626:22;5606:52;:::i;:::-;5596:62;;5552:116;5348:327;;;;:::o;5681:349::-;5750:6;5799:2;5787:9;5778:7;5774:23;5770:32;5767:119;;;5805:79;;:::i;:::-;5767:119;5925:1;5950:63;6005:7;5996:6;5985:9;5981:22;5950:63;:::i;:::-;5940:73;;5896:127;5681:349;;;;:::o;6036:329::-;6095:6;6144:2;6132:9;6123:7;6119:23;6115:32;6112:119;;;6150:79;;:::i;:::-;6112:119;6270:1;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6241:117;6036:329;;;;:::o;6371:118::-;6458:24;6476:5;6458:24;:::i;:::-;6453:3;6446:37;6371:118;;:::o;6495:109::-;6576:21;6591:5;6576:21;:::i;:::-;6571:3;6564:34;6495:109;;:::o;6610:360::-;6696:3;6724:38;6756:5;6724:38;:::i;:::-;6778:70;6841:6;6836:3;6778:70;:::i;:::-;6771:77;;6857:52;6902:6;6897:3;6890:4;6883:5;6879:16;6857:52;:::i;:::-;6934:29;6956:6;6934:29;:::i;:::-;6929:3;6925:39;6918:46;;6700:270;6610:360;;;;:::o;6976:175::-;7085:59;7138:5;7085:59;:::i;:::-;7080:3;7073:72;6976:175;;:::o;7157:364::-;7245:3;7273:39;7306:5;7273:39;:::i;:::-;7328:71;7392:6;7387:3;7328:71;:::i;:::-;7321:78;;7408:52;7453:6;7448:3;7441:4;7434:5;7430:16;7408:52;:::i;:::-;7485:29;7507:6;7485:29;:::i;:::-;7480:3;7476:39;7469:46;;7249:272;7157:364;;;;:::o;7527:377::-;7633:3;7661:39;7694:5;7661:39;:::i;:::-;7716:89;7798:6;7793:3;7716:89;:::i;:::-;7709:96;;7814:52;7859:6;7854:3;7847:4;7840:5;7836:16;7814:52;:::i;:::-;7891:6;7886:3;7882:16;7875:23;;7637:267;7527:377;;;;:::o;7910:402::-;8070:3;8091:85;8173:2;8168:3;8091:85;:::i;:::-;8084:92;;8185:93;8274:3;8185:93;:::i;:::-;8303:2;8298:3;8294:12;8287:19;;7910:402;;;:::o;8318:::-;8478:3;8499:85;8581:2;8576:3;8499:85;:::i;:::-;8492:92;;8593:93;8682:3;8593:93;:::i;:::-;8711:2;8706:3;8702:12;8695:19;;8318:402;;;:::o;8726:366::-;8868:3;8889:67;8953:2;8948:3;8889:67;:::i;:::-;8882:74;;8965:93;9054:3;8965:93;:::i;:::-;9083:2;9078:3;9074:12;9067:19;;8726:366;;;:::o;9098:::-;9240:3;9261:67;9325:2;9320:3;9261:67;:::i;:::-;9254:74;;9337:93;9426:3;9337:93;:::i;:::-;9455:2;9450:3;9446:12;9439:19;;9098:366;;;:::o;9470:::-;9612:3;9633:67;9697:2;9692:3;9633:67;:::i;:::-;9626:74;;9709:93;9798:3;9709:93;:::i;:::-;9827:2;9822:3;9818:12;9811:19;;9470:366;;;:::o;9842:::-;9984:3;10005:67;10069:2;10064:3;10005:67;:::i;:::-;9998:74;;10081:93;10170:3;10081:93;:::i;:::-;10199:2;10194:3;10190:12;10183:19;;9842:366;;;:::o;10214:::-;10356:3;10377:67;10441:2;10436:3;10377:67;:::i;:::-;10370:74;;10453:93;10542:3;10453:93;:::i;:::-;10571:2;10566:3;10562:12;10555:19;;10214:366;;;:::o;10586:::-;10728:3;10749:67;10813:2;10808:3;10749:67;:::i;:::-;10742:74;;10825:93;10914:3;10825:93;:::i;:::-;10943:2;10938:3;10934:12;10927:19;;10586:366;;;:::o;10958:::-;11100:3;11121:67;11185:2;11180:3;11121:67;:::i;:::-;11114:74;;11197:93;11286:3;11197:93;:::i;:::-;11315:2;11310:3;11306:12;11299:19;;10958:366;;;:::o;11330:400::-;11490:3;11511:84;11593:1;11588:3;11511:84;:::i;:::-;11504:91;;11604:93;11693:3;11604:93;:::i;:::-;11722:1;11717:3;11713:11;11706:18;;11330:400;;;:::o;11736:366::-;11878:3;11899:67;11963:2;11958:3;11899:67;:::i;:::-;11892:74;;11975:93;12064:3;11975:93;:::i;:::-;12093:2;12088:3;12084:12;12077:19;;11736:366;;;:::o;12108:400::-;12268:3;12289:84;12371:1;12366:3;12289:84;:::i;:::-;12282:91;;12382:93;12471:3;12382:93;:::i;:::-;12500:1;12495:3;12491:11;12484:18;;12108:400;;;:::o;12514:402::-;12674:3;12695:85;12777:2;12772:3;12695:85;:::i;:::-;12688:92;;12789:93;12878:3;12789:93;:::i;:::-;12907:2;12902:3;12898:12;12891:19;;12514:402;;;:::o;12922:366::-;13064:3;13085:67;13149:2;13144:3;13085:67;:::i;:::-;13078:74;;13161:93;13250:3;13161:93;:::i;:::-;13279:2;13274:3;13270:12;13263:19;;12922:366;;;:::o;13294:::-;13436:3;13457:67;13521:2;13516:3;13457:67;:::i;:::-;13450:74;;13533:93;13622:3;13533:93;:::i;:::-;13651:2;13646:3;13642:12;13635:19;;13294:366;;;:::o;13666:::-;13808:3;13829:67;13893:2;13888:3;13829:67;:::i;:::-;13822:74;;13905:93;13994:3;13905:93;:::i;:::-;14023:2;14018:3;14014:12;14007:19;;13666:366;;;:::o;14038:402::-;14198:3;14219:85;14301:2;14296:3;14219:85;:::i;:::-;14212:92;;14313:93;14402:3;14313:93;:::i;:::-;14431:2;14426:3;14422:12;14415:19;;14038:402;;;:::o;14446:::-;14606:3;14627:85;14709:2;14704:3;14627:85;:::i;:::-;14620:92;;14721:93;14810:3;14721:93;:::i;:::-;14839:2;14834:3;14830:12;14823:19;;14446:402;;;:::o;14854:400::-;15014:3;15035:84;15117:1;15112:3;15035:84;:::i;:::-;15028:91;;15128:93;15217:3;15128:93;:::i;:::-;15246:1;15241:3;15237:11;15230:18;;14854:400;;;:::o;15260:366::-;15402:3;15423:67;15487:2;15482:3;15423:67;:::i;:::-;15416:74;;15499:93;15588:3;15499:93;:::i;:::-;15617:2;15612:3;15608:12;15601:19;;15260:366;;;:::o;15632:::-;15774:3;15795:67;15859:2;15854:3;15795:67;:::i;:::-;15788:74;;15871:93;15960:3;15871:93;:::i;:::-;15989:2;15984:3;15980:12;15973:19;;15632:366;;;:::o;16004:::-;16146:3;16167:67;16231:2;16226:3;16167:67;:::i;:::-;16160:74;;16243:93;16332:3;16243:93;:::i;:::-;16361:2;16356:3;16352:12;16345:19;;16004:366;;;:::o;16376:::-;16518:3;16539:67;16603:2;16598:3;16539:67;:::i;:::-;16532:74;;16615:93;16704:3;16615:93;:::i;:::-;16733:2;16728:3;16724:12;16717:19;;16376:366;;;:::o;16748:::-;16890:3;16911:67;16975:2;16970:3;16911:67;:::i;:::-;16904:74;;16987:93;17076:3;16987:93;:::i;:::-;17105:2;17100:3;17096:12;17089:19;;16748:366;;;:::o;17120:::-;17262:3;17283:67;17347:2;17342:3;17283:67;:::i;:::-;17276:74;;17359:93;17448:3;17359:93;:::i;:::-;17477:2;17472:3;17468:12;17461:19;;17120:366;;;:::o;17492:402::-;17652:3;17673:85;17755:2;17750:3;17673:85;:::i;:::-;17666:92;;17767:93;17856:3;17767:93;:::i;:::-;17885:2;17880:3;17876:12;17869:19;;17492:402;;;:::o;17900:404::-;18060:3;18081:86;18163:3;18158;18081:86;:::i;:::-;18074:93;;18176;18265:3;18176:93;:::i;:::-;18294:3;18289;18285:13;18278:20;;17900:404;;;:::o;18310:402::-;18470:3;18491:85;18573:2;18568:3;18491:85;:::i;:::-;18484:92;;18585:93;18674:3;18585:93;:::i;:::-;18703:2;18698:3;18694:12;18687:19;;18310:402;;;:::o;18718:366::-;18860:3;18881:67;18945:2;18940:3;18881:67;:::i;:::-;18874:74;;18957:93;19046:3;18957:93;:::i;:::-;19075:2;19070:3;19066:12;19059:19;;18718:366;;;:::o;19090:402::-;19250:3;19271:85;19353:2;19348:3;19271:85;:::i;:::-;19264:92;;19365:93;19454:3;19365:93;:::i;:::-;19483:2;19478:3;19474:12;19467:19;;19090:402;;;:::o;19498:366::-;19640:3;19661:67;19725:2;19720:3;19661:67;:::i;:::-;19654:74;;19737:93;19826:3;19737:93;:::i;:::-;19855:2;19850:3;19846:12;19839:19;;19498:366;;;:::o;19870:402::-;20030:3;20051:85;20133:2;20128:3;20051:85;:::i;:::-;20044:92;;20145:93;20234:3;20145:93;:::i;:::-;20263:2;20258:3;20254:12;20247:19;;19870:402;;;:::o;20278:366::-;20420:3;20441:67;20505:2;20500:3;20441:67;:::i;:::-;20434:74;;20517:93;20606:3;20517:93;:::i;:::-;20635:2;20630:3;20626:12;20619:19;;20278:366;;;:::o;20650:402::-;20810:3;20831:85;20913:2;20908:3;20831:85;:::i;:::-;20824:92;;20925:93;21014:3;20925:93;:::i;:::-;21043:2;21038:3;21034:12;21027:19;;20650:402;;;:::o;21058:::-;21218:3;21239:85;21321:2;21316:3;21239:85;:::i;:::-;21232:92;;21333:93;21422:3;21333:93;:::i;:::-;21451:2;21446:3;21442:12;21435:19;;21058:402;;;:::o;21466:118::-;21553:24;21571:5;21553:24;:::i;:::-;21548:3;21541:37;21466:118;;:::o;21590:157::-;21695:45;21715:24;21733:5;21715:24;:::i;:::-;21695:45;:::i;:::-;21690:3;21683:58;21590:157;;:::o;21753:275::-;21885:3;21907:95;21998:3;21989:6;21907:95;:::i;:::-;21900:102;;22019:3;22012:10;;21753:275;;;;:::o;22034:435::-;22214:3;22236:95;22327:3;22318:6;22236:95;:::i;:::-;22229:102;;22348:95;22439:3;22430:6;22348:95;:::i;:::-;22341:102;;22460:3;22453:10;;22034:435;;;;;:::o;22475:1555::-;22991:3;23013:95;23104:3;23095:6;23013:95;:::i;:::-;23006:102;;23125:95;23216:3;23207:6;23125:95;:::i;:::-;23118:102;;23237:95;23328:3;23319:6;23237:95;:::i;:::-;23230:102;;23349:95;23440:3;23431:6;23349:95;:::i;:::-;23342:102;;23461:95;23552:3;23543:6;23461:95;:::i;:::-;23454:102;;23573:95;23664:3;23655:6;23573:95;:::i;:::-;23566:102;;23685:95;23776:3;23767:6;23685:95;:::i;:::-;23678:102;;23797:95;23888:3;23879:6;23797:95;:::i;:::-;23790:102;;23909:95;24000:3;23991:6;23909:95;:::i;:::-;23902:102;;24021:3;24014:10;;22475:1555;;;;;;;;;;;;:::o;24036:1877::-;24649:3;24671:95;24762:3;24753:6;24671:95;:::i;:::-;24664:102;;24783:95;24874:3;24865:6;24783:95;:::i;:::-;24776:102;;24895:95;24986:3;24977:6;24895:95;:::i;:::-;24888:102;;25007:95;25098:3;25089:6;25007:95;:::i;:::-;25000:102;;25119:95;25210:3;25201:6;25119:95;:::i;:::-;25112:102;;25231:95;25322:3;25313:6;25231:95;:::i;:::-;25224:102;;25343:95;25434:3;25425:6;25343:95;:::i;:::-;25336:102;;25455:95;25546:3;25537:6;25455:95;:::i;:::-;25448:102;;25567:95;25658:3;25649:6;25567:95;:::i;:::-;25560:102;;25679:95;25770:3;25761:6;25679:95;:::i;:::-;25672:102;;25791:96;25883:3;25873:7;25791:96;:::i;:::-;25784:103;;25904:3;25897:10;;24036:1877;;;;;;;;;;;;;;:::o;25919:701::-;26200:3;26222:95;26313:3;26304:6;26222:95;:::i;:::-;26215:102;;26334:148;26478:3;26334:148;:::i;:::-;26327:155;;26499:95;26590:3;26581:6;26499:95;:::i;:::-;26492:102;;26611:3;26604:10;;25919:701;;;;;:::o;26626:541::-;26859:3;26881:148;27025:3;26881:148;:::i;:::-;26874:155;;27046:95;27137:3;27128:6;27046:95;:::i;:::-;27039:102;;27158:3;27151:10;;26626:541;;;;:::o;27173:::-;27406:3;27428:148;27572:3;27428:148;:::i;:::-;27421:155;;27593:95;27684:3;27675:6;27593:95;:::i;:::-;27586:102;;27705:3;27698:10;;27173:541;;;;:::o;27720:::-;27953:3;27975:148;28119:3;27975:148;:::i;:::-;27968:155;;28140:95;28231:3;28222:6;28140:95;:::i;:::-;28133:102;;28252:3;28245:10;;27720:541;;;;:::o;28267:::-;28500:3;28522:148;28666:3;28522:148;:::i;:::-;28515:155;;28687:95;28778:3;28769:6;28687:95;:::i;:::-;28680:102;;28799:3;28792:10;;28267:541;;;;:::o;28814:::-;29047:3;29069:148;29213:3;29069:148;:::i;:::-;29062:155;;29234:95;29325:3;29316:6;29234:95;:::i;:::-;29227:102;;29346:3;29339:10;;28814:541;;;;:::o;29361:::-;29594:3;29616:148;29760:3;29616:148;:::i;:::-;29609:155;;29781:95;29872:3;29863:6;29781:95;:::i;:::-;29774:102;;29893:3;29886:10;;29361:541;;;;:::o;29908:::-;30141:3;30163:148;30307:3;30163:148;:::i;:::-;30156:155;;30328:95;30419:3;30410:6;30328:95;:::i;:::-;30321:102;;30440:3;30433:10;;29908:541;;;;:::o;30455:1233::-;30938:3;30960:148;31104:3;30960:148;:::i;:::-;30953:155;;31125:95;31216:3;31207:6;31125:95;:::i;:::-;31118:102;;31237:148;31381:3;31237:148;:::i;:::-;31230:155;;31402:95;31493:3;31484:6;31402:95;:::i;:::-;31395:102;;31514:148;31658:3;31514:148;:::i;:::-;31507:155;;31679:3;31672:10;;30455:1233;;;;;:::o;31694:381::-;31879:3;31901:148;32045:3;31901:148;:::i;:::-;31894:155;;32066:3;32059:10;;31694:381;;;:::o;32081:541::-;32314:3;32336:148;32480:3;32336:148;:::i;:::-;32329:155;;32501:95;32592:3;32583:6;32501:95;:::i;:::-;32494:102;;32613:3;32606:10;;32081:541;;;;:::o;32628:::-;32861:3;32883:148;33027:3;32883:148;:::i;:::-;32876:155;;33048:95;33139:3;33130:6;33048:95;:::i;:::-;33041:102;;33160:3;33153:10;;32628:541;;;;:::o;33175:::-;33408:3;33430:148;33574:3;33430:148;:::i;:::-;33423:155;;33595:95;33686:3;33677:6;33595:95;:::i;:::-;33588:102;;33707:3;33700:10;;33175:541;;;;:::o;33722:256::-;33834:3;33849:75;33920:3;33911:6;33849:75;:::i;:::-;33949:2;33944:3;33940:12;33933:19;;33969:3;33962:10;;33722:256;;;;:::o;33984:397::-;34124:3;34139:75;34210:3;34201:6;34139:75;:::i;:::-;34239:2;34234:3;34230:12;34223:19;;34252:75;34323:3;34314:6;34252:75;:::i;:::-;34352:2;34347:3;34343:12;34336:19;;34372:3;34365:10;;33984:397;;;;;:::o;34387:222::-;34480:4;34518:2;34507:9;34503:18;34495:26;;34531:71;34599:1;34588:9;34584:17;34575:6;34531:71;:::i;:::-;34387:222;;;;:::o;34615:640::-;34810:4;34848:3;34837:9;34833:19;34825:27;;34862:71;34930:1;34919:9;34915:17;34906:6;34862:71;:::i;:::-;34943:72;35011:2;35000:9;34996:18;34987:6;34943:72;:::i;:::-;35025;35093:2;35082:9;35078:18;35069:6;35025:72;:::i;:::-;35144:9;35138:4;35134:20;35129:2;35118:9;35114:18;35107:48;35172:76;35243:4;35234:6;35172:76;:::i;:::-;35164:84;;34615:640;;;;;;;:::o;35261:210::-;35348:4;35386:2;35375:9;35371:18;35363:26;;35399:65;35461:1;35450:9;35446:17;35437:6;35399:65;:::i;:::-;35261:210;;;;:::o;35477:266::-;35592:4;35630:2;35619:9;35615:18;35607:26;;35643:93;35733:1;35722:9;35718:17;35709:6;35643:93;:::i;:::-;35477:266;;;;:::o;35749:313::-;35862:4;35900:2;35889:9;35885:18;35877:26;;35949:9;35943:4;35939:20;35935:1;35924:9;35920:17;35913:47;35977:78;36050:4;36041:6;35977:78;:::i;:::-;35969:86;;35749:313;;;;:::o;36068:419::-;36234:4;36272:2;36261:9;36257:18;36249:26;;36321:9;36315:4;36311:20;36307:1;36296:9;36292:17;36285:47;36349:131;36475:4;36349:131;:::i;:::-;36341:139;;36068:419;;;:::o;36493:::-;36659:4;36697:2;36686:9;36682:18;36674:26;;36746:9;36740:4;36736:20;36732:1;36721:9;36717:17;36710:47;36774:131;36900:4;36774:131;:::i;:::-;36766:139;;36493:419;;;:::o;36918:::-;37084:4;37122:2;37111:9;37107:18;37099:26;;37171:9;37165:4;37161:20;37157:1;37146:9;37142:17;37135:47;37199:131;37325:4;37199:131;:::i;:::-;37191:139;;36918:419;;;:::o;37343:::-;37509:4;37547:2;37536:9;37532:18;37524:26;;37596:9;37590:4;37586:20;37582:1;37571:9;37567:17;37560:47;37624:131;37750:4;37624:131;:::i;:::-;37616:139;;37343:419;;;:::o;37768:::-;37934:4;37972:2;37961:9;37957:18;37949:26;;38021:9;38015:4;38011:20;38007:1;37996:9;37992:17;37985:47;38049:131;38175:4;38049:131;:::i;:::-;38041:139;;37768:419;;;:::o;38193:::-;38359:4;38397:2;38386:9;38382:18;38374:26;;38446:9;38440:4;38436:20;38432:1;38421:9;38417:17;38410:47;38474:131;38600:4;38474:131;:::i;:::-;38466:139;;38193:419;;;:::o;38618:::-;38784:4;38822:2;38811:9;38807:18;38799:26;;38871:9;38865:4;38861:20;38857:1;38846:9;38842:17;38835:47;38899:131;39025:4;38899:131;:::i;:::-;38891:139;;38618:419;;;:::o;39043:::-;39209:4;39247:2;39236:9;39232:18;39224:26;;39296:9;39290:4;39286:20;39282:1;39271:9;39267:17;39260:47;39324:131;39450:4;39324:131;:::i;:::-;39316:139;;39043:419;;;:::o;39468:::-;39634:4;39672:2;39661:9;39657:18;39649:26;;39721:9;39715:4;39711:20;39707:1;39696:9;39692:17;39685:47;39749:131;39875:4;39749:131;:::i;:::-;39741:139;;39468:419;;;:::o;39893:::-;40059:4;40097:2;40086:9;40082:18;40074:26;;40146:9;40140:4;40136:20;40132:1;40121:9;40117:17;40110:47;40174:131;40300:4;40174:131;:::i;:::-;40166:139;;39893:419;;;:::o;40318:::-;40484:4;40522:2;40511:9;40507:18;40499:26;;40571:9;40565:4;40561:20;40557:1;40546:9;40542:17;40535:47;40599:131;40725:4;40599:131;:::i;:::-;40591:139;;40318:419;;;:::o;40743:::-;40909:4;40947:2;40936:9;40932:18;40924:26;;40996:9;40990:4;40986:20;40982:1;40971:9;40967:17;40960:47;41024:131;41150:4;41024:131;:::i;:::-;41016:139;;40743:419;;;:::o;41168:::-;41334:4;41372:2;41361:9;41357:18;41349:26;;41421:9;41415:4;41411:20;41407:1;41396:9;41392:17;41385:47;41449:131;41575:4;41449:131;:::i;:::-;41441:139;;41168:419;;;:::o;41593:::-;41759:4;41797:2;41786:9;41782:18;41774:26;;41846:9;41840:4;41836:20;41832:1;41821:9;41817:17;41810:47;41874:131;42000:4;41874:131;:::i;:::-;41866:139;;41593:419;;;:::o;42018:::-;42184:4;42222:2;42211:9;42207:18;42199:26;;42271:9;42265:4;42261:20;42257:1;42246:9;42242:17;42235:47;42299:131;42425:4;42299:131;:::i;:::-;42291:139;;42018:419;;;:::o;42443:::-;42609:4;42647:2;42636:9;42632:18;42624:26;;42696:9;42690:4;42686:20;42682:1;42671:9;42667:17;42660:47;42724:131;42850:4;42724:131;:::i;:::-;42716:139;;42443:419;;;:::o;42868:::-;43034:4;43072:2;43061:9;43057:18;43049:26;;43121:9;43115:4;43111:20;43107:1;43096:9;43092:17;43085:47;43149:131;43275:4;43149:131;:::i;:::-;43141:139;;42868:419;;;:::o;43293:::-;43459:4;43497:2;43486:9;43482:18;43474:26;;43546:9;43540:4;43536:20;43532:1;43521:9;43517:17;43510:47;43574:131;43700:4;43574:131;:::i;:::-;43566:139;;43293:419;;;:::o;43718:::-;43884:4;43922:2;43911:9;43907:18;43899:26;;43971:9;43965:4;43961:20;43957:1;43946:9;43942:17;43935:47;43999:131;44125:4;43999:131;:::i;:::-;43991:139;;43718:419;;;:::o;44143:::-;44309:4;44347:2;44336:9;44332:18;44324:26;;44396:9;44390:4;44386:20;44382:1;44371:9;44367:17;44360:47;44424:131;44550:4;44424:131;:::i;:::-;44416:139;;44143:419;;;:::o;44568:222::-;44661:4;44699:2;44688:9;44684:18;44676:26;;44712:71;44780:1;44769:9;44765:17;44756:6;44712:71;:::i;:::-;44568:222;;;;:::o;44796:129::-;44830:6;44857:20;;:::i;:::-;44847:30;;44886:33;44914:4;44906:6;44886:33;:::i;:::-;44796:129;;;:::o;44931:75::-;44964:6;44997:2;44991:9;44981:19;;44931:75;:::o;45012:307::-;45073:4;45163:18;45155:6;45152:30;45149:56;;;45185:18;;:::i;:::-;45149:56;45223:29;45245:6;45223:29;:::i;:::-;45215:37;;45307:4;45301;45297:15;45289:23;;45012:307;;;:::o;45325:98::-;45376:6;45410:5;45404:12;45394:22;;45325:98;;;:::o;45429:99::-;45481:6;45515:5;45509:12;45499:22;;45429:99;;;:::o;45534:168::-;45617:11;45651:6;45646:3;45639:19;45691:4;45686:3;45682:14;45667:29;;45534:168;;;;:::o;45708:169::-;45792:11;45826:6;45821:3;45814:19;45866:4;45861:3;45857:14;45842:29;;45708:169;;;;:::o;45883:148::-;45985:11;46022:3;46007:18;;45883:148;;;;:::o;46037:305::-;46077:3;46096:20;46114:1;46096:20;:::i;:::-;46091:25;;46130:20;46148:1;46130:20;:::i;:::-;46125:25;;46284:1;46216:66;46212:74;46209:1;46206:81;46203:107;;;46290:18;;:::i;:::-;46203:107;46334:1;46331;46327:9;46320:16;;46037:305;;;;:::o;46348:185::-;46388:1;46405:20;46423:1;46405:20;:::i;:::-;46400:25;;46439:20;46457:1;46439:20;:::i;:::-;46434:25;;46478:1;46468:35;;46483:18;;:::i;:::-;46468:35;46525:1;46522;46518:9;46513:14;;46348:185;;;;:::o;46539:348::-;46579:7;46602:20;46620:1;46602:20;:::i;:::-;46597:25;;46636:20;46654:1;46636:20;:::i;:::-;46631:25;;46824:1;46756:66;46752:74;46749:1;46746:81;46741:1;46734:9;46727:17;46723:105;46720:131;;;46831:18;;:::i;:::-;46720:131;46879:1;46876;46872:9;46861:20;;46539:348;;;;:::o;46893:191::-;46933:4;46953:20;46971:1;46953:20;:::i;:::-;46948:25;;46987:20;47005:1;46987:20;:::i;:::-;46982:25;;47026:1;47023;47020:8;47017:34;;;47031:18;;:::i;:::-;47017:34;47076:1;47073;47069:9;47061:17;;46893:191;;;;:::o;47090:96::-;47127:7;47156:24;47174:5;47156:24;:::i;:::-;47145:35;;47090:96;;;:::o;47192:90::-;47226:7;47269:5;47262:13;47255:21;47244:32;;47192:90;;;:::o;47288:149::-;47324:7;47364:66;47357:5;47353:78;47342:89;;47288:149;;;:::o;47443:126::-;47480:7;47520:42;47513:5;47509:54;47498:65;;47443:126;;;:::o;47575:77::-;47612:7;47641:5;47630:16;;47575:77;;;:::o;47658:148::-;47730:9;47763:37;47794:5;47763:37;:::i;:::-;47750:50;;47658:148;;;:::o;47812:126::-;47862:9;47895:37;47926:5;47895:37;:::i;:::-;47882:50;;47812:126;;;:::o;47944:113::-;47994:9;48027:24;48045:5;48027:24;:::i;:::-;48014:37;;47944:113;;;:::o;48063:154::-;48147:6;48142:3;48137;48124:30;48209:1;48200:6;48195:3;48191:16;48184:27;48063:154;;;:::o;48223:307::-;48291:1;48301:113;48315:6;48312:1;48309:13;48301:113;;;48400:1;48395:3;48391:11;48385:18;48381:1;48376:3;48372:11;48365:39;48337:2;48334:1;48330:10;48325:15;;48301:113;;;48432:6;48429:1;48426:13;48423:101;;;48512:1;48503:6;48498:3;48494:16;48487:27;48423:101;48272:258;48223:307;;;:::o;48536:320::-;48580:6;48617:1;48611:4;48607:12;48597:22;;48664:1;48658:4;48654:12;48685:18;48675:81;;48741:4;48733:6;48729:17;48719:27;;48675:81;48803:2;48795:6;48792:14;48772:18;48769:38;48766:84;;;48822:18;;:::i;:::-;48766:84;48587:269;48536:320;;;:::o;48862:281::-;48945:27;48967:4;48945:27;:::i;:::-;48937:6;48933:40;49075:6;49063:10;49060:22;49039:18;49027:10;49024:34;49021:62;49018:88;;;49086:18;;:::i;:::-;49018:88;49126:10;49122:2;49115:22;48905:238;48862:281;;:::o;49149:233::-;49188:3;49211:24;49229:5;49211:24;:::i;:::-;49202:33;;49257:66;49250:5;49247:77;49244:103;;;49327:18;;:::i;:::-;49244:103;49374:1;49367:5;49363:13;49356:20;;49149:233;;;:::o;49388:79::-;49427:7;49456:5;49445:16;;49388:79;;;:::o;49473:176::-;49505:1;49522:20;49540:1;49522:20;:::i;:::-;49517:25;;49556:20;49574:1;49556:20;:::i;:::-;49551:25;;49595:1;49585:35;;49600:18;;:::i;:::-;49585:35;49641:1;49638;49634:9;49629:14;;49473:176;;;;:::o;49655:180::-;49703:77;49700:1;49693:88;49800:4;49797:1;49790:15;49824:4;49821:1;49814:15;49841:180;49889:77;49886:1;49879:88;49986:4;49983:1;49976:15;50010:4;50007:1;50000:15;50027:180;50075:77;50072:1;50065:88;50172:4;50169:1;50162:15;50196:4;50193:1;50186:15;50213:180;50261:77;50258:1;50251:88;50358:4;50355:1;50348:15;50382:4;50379:1;50372:15;50399:180;50447:77;50444:1;50437:88;50544:4;50541:1;50534:15;50568:4;50565:1;50558:15;50585:180;50633:77;50630:1;50623:88;50730:4;50727:1;50720:15;50754:4;50751:1;50744:15;50771:117;50880:1;50877;50870:12;50894:117;51003:1;51000;50993:12;51017:117;51126:1;51123;51116:12;51140:117;51249:1;51246;51239:12;51263:102;51304:6;51355:2;51351:7;51346:2;51339:5;51335:14;51331:28;51321:38;;51263:102;;;:::o;51371:171::-;51511:23;51507:1;51499:6;51495:14;51488:47;51371:171;:::o;51548:160::-;51688:12;51684:1;51676:6;51672:14;51665:36;51548:160;:::o;51714:230::-;51854:34;51850:1;51842:6;51838:14;51831:58;51923:13;51918:2;51910:6;51906:15;51899:38;51714:230;:::o;51950:237::-;52090:34;52086:1;52078:6;52074:14;52067:58;52159:20;52154:2;52146:6;52142:15;52135:45;51950:237;:::o;52193:177::-;52333:29;52329:1;52321:6;52317:14;52310:53;52193:177;:::o;52376:225::-;52516:34;52512:1;52504:6;52500:14;52493:58;52585:8;52580:2;52572:6;52568:15;52561:33;52376:225;:::o;52607:178::-;52747:30;52743:1;52735:6;52731:14;52724:54;52607:178;:::o;52791:223::-;52931:34;52927:1;52919:6;52915:14;52908:58;53000:6;52995:2;52987:6;52983:15;52976:31;52791:223;:::o;53020:175::-;53160:27;53156:1;53148:6;53144:14;53137:51;53020:175;:::o;53201:155::-;53341:7;53337:1;53329:6;53325:14;53318:31;53201:155;:::o;53362:231::-;53502:34;53498:1;53490:6;53486:14;53479:58;53571:14;53566:2;53558:6;53554:15;53547:39;53362:231;:::o;53599:151::-;53739:3;53735:1;53727:6;53723:14;53716:27;53599:151;:::o;53756:161::-;53896:13;53892:1;53884:6;53880:14;53873:37;53756:161;:::o;53923:243::-;54063:34;54059:1;54051:6;54047:14;54040:58;54132:26;54127:2;54119:6;54115:15;54108:51;53923:243;:::o;54172:229::-;54312:34;54308:1;54300:6;54296:14;54289:58;54381:12;54376:2;54368:6;54364:15;54357:37;54172:229;:::o;54407:228::-;54547:34;54543:1;54535:6;54531:14;54524:58;54616:11;54611:2;54603:6;54599:15;54592:36;54407:228;:::o;54641:162::-;54781:14;54777:1;54769:6;54765:14;54758:38;54641:162;:::o;54809:166::-;54949:18;54945:1;54937:6;54933:14;54926:42;54809:166;:::o;54981:214::-;55121:66;55117:1;55109:6;55105:14;55098:90;54981:214;:::o;55201:182::-;55341:34;55337:1;55329:6;55325:14;55318:58;55201:182;:::o;55389:231::-;55529:34;55525:1;55517:6;55513:14;55506:58;55598:14;55593:2;55585:6;55581:15;55574:39;55389:231;:::o;55626:182::-;55766:34;55762:1;55754:6;55750:14;55743:58;55626:182;:::o;55814:166::-;55954:18;55950:1;55942:6;55938:14;55931:42;55814:166;:::o;55986:228::-;56126:34;56122:1;56114:6;56110:14;56103:58;56195:11;56190:2;56182:6;56178:15;56171:36;55986:228;:::o;56220:220::-;56360:34;56356:1;56348:6;56344:14;56337:58;56429:3;56424:2;56416:6;56412:15;56405:28;56220:220;:::o;56446:179::-;56586:31;56582:1;56574:6;56570:14;56563:55;56446:179;:::o;56631:643::-;56771:66;56767:1;56759:6;56755:14;56748:90;56872:34;56867:2;56859:6;56855:15;56848:59;56941:34;56936:2;56928:6;56924:15;56917:59;57010:34;57005:2;56997:6;56993:15;56986:59;57080:34;57074:3;57066:6;57062:16;57055:60;57150:66;57144:3;57136:6;57132:16;57125:92;57252:14;57246:3;57238:6;57234:16;57227:40;56631:643;:::o;57280:214::-;57420:66;57416:1;57408:6;57404:14;57397:90;57280:214;:::o;57500:236::-;57640:34;57636:1;57628:6;57624:14;57617:58;57709:19;57704:2;57696:6;57692:15;57685:44;57500:236;:::o;57742:173::-;57882:25;57878:1;57870:6;57866:14;57859:49;57742:173;:::o;57921:231::-;58061:34;58057:1;58049:6;58045:14;58038:58;58130:14;58125:2;58117:6;58113:15;58106:39;57921:231;:::o;58158:166::-;58298:18;58294:1;58286:6;58282:14;58275:42;58158:166;:::o;58330:181::-;58470:33;58466:1;58458:6;58454:14;58447:57;58330:181;:::o;58517:164::-;58657:16;58653:1;58645:6;58641:14;58634:40;58517:164;:::o;58687:161::-;58827:13;58823:1;58815:6;58811:14;58804:37;58687:161;:::o;58854:122::-;58927:24;58945:5;58927:24;:::i;:::-;58920:5;58917:35;58907:63;;58966:1;58963;58956:12;58907:63;58854:122;:::o;58982:116::-;59052:21;59067:5;59052:21;:::i;:::-;59045:5;59042:32;59032:60;;59088:1;59085;59078:12;59032:60;58982:116;:::o;59104:120::-;59176:23;59193:5;59176:23;:::i;:::-;59169:5;59166:34;59156:62;;59214:1;59211;59204:12;59156:62;59104:120;:::o;59230:122::-;59303:24;59321:5;59303:24;:::i;:::-;59296:5;59293:35;59283:63;;59342:1;59339;59332:12;59283:63;59230:122;:::o

Swarm Source

ipfs://c25072faf60474c37365eed7bbf94529f6b4a40dbc0f48904d521944bfff0313
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.