ETH Price: $3,424.42 (+3.13%)

Token

Bloot Dogg (DOGG)
 

Overview

Max Total Supply

14,672 DOGG

Holders

4,176

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
snuggster.eth
Balance
13 DOGG
0x483b613641720bdd7848f4d90a01883141b753db
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:
BlootDoggs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

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

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

// 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 BlootDoggs is ERC721Enumerable, ReentrancyGuard, Ownable {
    //Loot Contract
    address public lootAddress = 0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613;
    LootInterface public lootContract = LootInterface(lootAddress);

    string[] private tag = [
        "Sushi","Dumpling","Genevive","Pancake","Yuki","Gigi","Happy","Chibi","Lucky","Mochi","Bubba","Yui","Matcha","Jerry","Bunny","Candy","Bubbles","Apricot","Bear","Button","Freckles","Noodle","Muffin","Sprout","Peachy","Wafflestiltskin","Peanut","Teddy","Pebbles","Kabochan","Tadeo","Abby","Abe","Addie","Ace","Alexis","Aero","Alice","Aiden","Amelia","AJ","Angel","Alfie","Annie","Andy","Ariel","Archie","Ava","Artie","Avery","Atlas","Baby","Austin","Bailey","Bailey","Bambi","Baja","Basil","Barkley","Bea","Basil","Bean","Baxter","Bella","Bean","Belle","Bear","Betty","Beau","Birdie","Benji","Biscuit","Benny","Blanche","Billy","Blondie","Bingo","Blossom","Biscuit","Bonnie","Blaze","Brooklyn","Blue","Buffy","Bo","Callie","Bolt","Candy","Boomer","Carly","Boots","Carmen","Brady","Casey","Brownie","Cece","Bubba","Chance","Buck","Chanel","Buddy","Cherry","Buster","Cheyenne","Buttons","Chloe","Buzz","Cinnamon","Cain","Clara","Captain","Cleo","Carter","Clover","Champ","Coco","Chance","Cookie","Charlie","Cora","Chase","Cricket","Chester","Daisy","Chewy","Dakota","Chico","Dallas","Chip","Daphne","CJ","Darla","Clifford","Delia","Clyde","Delilah","Cody","Destiny","Cooper","Diamond","Corky","Diva","Cosmo","Dixie","Darwin","Dolly","Dash","Dora","Davy","Dory","Denver","Dot","Dexter","Dottie","Diesel","Duchess","Dijon","Eden","Donnie","Edie","Dudley","Effie","Duffy","Eliza","Duke","Ella","Dusty","Ellie","Dylan","Eloise","Eddie","Elsa","Eli","Ember","Eliot","Emma","Elton","Emmy","Everett","Etta","Ezra","Eva","Farley","Faith","Felix","Fancy","Finley","Fannie","Finn","Fanny","Fisher","Faye","Flash","Fifi","Forrest","Flo","Frank","Foxy","Frankie","Frida","Franklin","Gabby","Freddy","Georgia","Fritz","Gia","Gage","Gidget","George","Gigi","Ghost","Ginger","Goose","Gloria","Gordy","Goldie","Grady","Grace","Gus","Gracie","Harley","Hadley","Harry","Hailey","Harvey","Hannah","Hayes","Harley","Henry","Harper","Hooch","Hazel","Hoss","Heidi","Huck","Hershey","Hudson","Holly","Hunter","Honey","Ike","Hope","Indy","Ibby","Ira","Ida","Jack","Iris","Jackson","Ivory","Jasper","Ivy","Java","Izzy","Jesse","Jackie","Jethro","Jada","Joey","Jade","Jordan","Jasmine","Jordy","Jazzy","Kane","Jenna","King","Jersey","Knox","Jewel","Koby","Jolene","Koda","Josie","Lance","Juno","Lenny","Karma","Leo","Kayla","Leroy","Kennedy","Levi","Kiki","Lewis","Kinley","Lightning","Kira","Lincoln","Kiwi","Linus","Koda","Logan","Koko","Loki","Lacy","Louie","Lady","Lyle","Laika","Mac","Lassie","Major","Layla","Marley","Leia","Marty","Lena","Mason","Lexi","Max","Lexy","Maximus","Libby","Maxwell","Liberty","Mickey","Lilly","Miles","Lola","Milo","Lottie","Moe","Lucky","Monty","Lucy","Morty","Lulu","Murphy","Luna","Murray","Mabel","Nelson","Macy","Newton","Maddie","Nico","Maisie","Niles","Mavis","Noah","Maya","Norm","Mia","Oakley","Miley","Odin","Millie","Ollie","Mimi","Orson","Minnie","Oscar","Missy","Otis","Mocha","Otto","Molly","Ozzy","Morgan","Paco","Moxie","Pal","Muffin","Parka","Nala","Parker","Nellie","Patch","Nessie","Peanut","Nettie","Pepper","Nikki","Percy","Nola","Perry","Nori","Petey","Odessa","Pip","Olive","Piper","Olivia","Poe","Opal","Pogo","Oreo","Pongo","Paige","Porter","Paris","Prince","Parker","Quincy","Peaches","Randy","Peanut","Ranger","Pearl","Rascal","Pebbles","Red","Peggy","Reggie","Penny","Ricky","Pepper","Ringo","Petra","Ripley","Phoenix","Rocky","Piper","Rudy","Pippa","Rufus","Pixie","Rusty","Polly","Sam","Poppy","Sammy","Precious","Sarge","Princess","Sawyer","Pumpkin","Scooby","Queenie","Scooter","Remy","Scout","Riley","Scrappy","Rosie","Shadow","Roxy","Shiloh","Ruby","Simba","Ruthie","Skip","Sadie","Smoky","Sandy","Snoopy","Sasha","Socks","Sassy","Sparky","Scarlet","Spencer","Shadow","Spike","Sheba","Spot","Shelby","Stanley","Shiloh","Stewie","Sierra","Stitch","Sissy","Taco","Skye","Tank","Skylar","Tanner","Sophie","Taylor","Star","Taz","Starla","Teddy","Stella","Titus","Storm","TJ","Sugar","Tobias","Suki","Toby","Summer","Tot","Sunny","Toto","Suzie","Tripp","Sweetie","Tucker","Sydney","Turbo","Tabby","Turner","Taffy","Tyler","Tasha","Tyson","Tessa","Vernon","Theo","Vince","Tilly","Vinnie","Trixie","Wade","Trudy","Waffles","Violet","Wally","Vixen","Walter","Wiggles","Watson","Willa","Wilbur","Willow","Winston","Winnie","Woody","Xena","Wyatt","Zelda","Wylie","Zoe","Yogi","Zola","Zane","Zuri","Ziggy"
    ];

    string[] private breed = [
        "Shiba Inu","Bulldog","Dalmatian","Golden Retriever","Shih Tzu","Bernese Mountain Dog","Border Collie","Chow Chow","Bichon Frise","Miniature Schnauzer","Pomeranian ","Maltese Terrier","Goldendoodle","Dachshund","Yorkshire Terrier","Corgi","German Shepherd","Labrador","Beagle","Chihuahua","Great Dane","Greyhound","Frenchie","Pug","Spitz","Husky"
    ];

    string[] private health = [
        "Health 1","Health 2","Health 3","Health 4","Health 5","Health 6","Health 7","Health 8","Health 9","Health 10","Health 11","Health 12","Health 13","Health 14","Health 15","Health 16","Health 17","Health 18","Health 19","Health 20"
    ];

    string[] private attack = [
        "Attack 1","Attack 2","Attack 3","Attack 4","Attack 5","Attack 6","Attack 7","Attack 8","Attack 9","Attack 10","Attack 11","Attack 12","Attack 13","Attack 14","Attack 15","Attack 16","Attack 17","Attack 18","Attack 19","Attack 20"
    ];

    string[] private defense = [
        "Defense 1","Defense 2","Defense 3","Defense 4","Defense 5","Defense 6","Defense 7","Defense 8","Defense 9","Defense 10","Defense 11","Defense 12","Defense 13","Defense 14","Defense 15","Defense 16","Defense 17","Defense 18","Defense 19","Defense 20"
    ];

    string[] private speed = [
        "Speed 1","Speed 2","Speed 3","Speed 4","Speed 5","Speed 6","Speed 7","Speed 8","Speed 9","Speed 10","Speed 11","Speed 12","Speed 13","Speed 14","Speed 15","Speed 16","Speed 17","Speed 18","Speed 19","Speed 20"
    ];

    string[] private accuracy = [
        "Accuracy 1","Accuracy 2","Accuracy 3","Accuracy 4","Accuracy 5","Accuracy 6","Accuracy 7","Accuracy 8","Accuracy 9","Accuracy 10","Accuracy 11","Accuracy 12","Accuracy 13","Accuracy 14","Accuracy 15","Accuracy 16","Accuracy 17","Accuracy 18","Accuracy 19","Accuracy 20"
    ];

    string[] private luck = [
        "Luck 1","Luck 2","Luck 3","Luck 4","Luck 5","Luck 6","Luck 7","Luck 8","Luck 9","Luck 10","Luck 11","Luck 12","Luck 13","Luck 14","Luck 15","Luck 16","Luck 17","Luck 18","Luck 19","Luck 20"
    ];

    string[] private suffixes = [
        "The Pound Dog","The Peanut Butter Licker","The Runt of the Litter","The Cargo Rider","The Leash Breaker","The Small Rodent Slayer","The Squirrel Hunter","The Gate Protector","The Guardian of the Chickens","The Purebred","The Guidedog","The Hound of Couch Destruction","The Herder of the Sheep","The Sock Thief","Explorer of the Dog Park","The Son of Mongrels","The Pooch of the Purse","The Squeaky Toy Killer","The Bringer of Bark","The Bringer of Shoes","The Lord of Slobber","The Keeper of the Kennel"
    ];

    string[] private namePrefixes = [
        "The Bull-Headed","The Crate-Trained","The Groomed","The Scruffy","The Brave","The Prissy","The Neutered Stud","The Toothless","The Kingly","The Princely","The Housebroken","The Watchful","The Cowardly","The Moody","The Unleashed","The Begging","The Loyal","The Blue and Brown Eyed","The Stray","The Well Trained","The Husky","The Submissive","The Dominant","The Well Bred","The Ready-to-Please","The Wagging","The Good-Natured","The Nervous","The Rambunctious","The Ancient","The Newbie","The Wise","The Three-Legged","The Trust Worthy","The Noble","The Obedient","The Huffy","The Nippy"
    ];

    string[] private nameSuffixes = [
        "of Gundog Guild","of Canine Club","of Hound Hall","of Puppy Place","of Mongrel Mountain","of the Mutt Assembly","of the Backyard Hunters","Last of his Breed","of the Spayed Society","of the Cat-Friendly Clique","of the Curious Crew","of the Dog Run","of the Fenced","of the Four-Legged Fraternity","of Housebroken Hill","of the Slobber Society","follower of Cars","follower of Cats","of Hunter Hub"
    ];

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

    function getTag(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "TAG", tag);
    }

    function getBreed(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "BREED", breed);
    }

    function getHealth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HEALTH", health);
    }

    function getAttack(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "ATTACK", attack);
    }

    function getDefense(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "DEFENSE", defense);
    }

    function getSpeed(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SPEED", speed);
    }

    function getAccuracy(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "ACCURACY", accuracy);
    }

    function getLuck(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "LUCK", luck);
    }

    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;

        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("TAG") && greatness > 14) {
            string[2] memory name;
            name[0] = namePrefixes[rand % namePrefixes.length];
            name[1] = nameSuffixes[rand % nameSuffixes.length];
            output = string(abi.encodePacked(name[0], " ", output, " ", name[1]));

        }
        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("BREED") && greatness >= 19) {
            output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length]));
        }
        return output;
    }

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

        parts[1] = getTag(tokenId);

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

        parts[3] = getBreed(tokenId);

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

        parts[5] = getHealth(tokenId);

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

        parts[7] = getAttack(tokenId);

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

        parts[9] = getDefense(tokenId);

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

        parts[11] = getSpeed(tokenId);

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

        parts[13] = getAccuracy(tokenId);

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

        parts[15] = getLuck(tokenId);

        parts[16] = "</text></svg>";

        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]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Dogg #',
                        toString(tokenId),
                        '", "description": "Bloot Doggs are randomized, generated and stored on chain. Images and other functionality are intentionally omitted for others to interpret. Feel free to use Bloot Doggs in any way you want. Inspired by and compatible with Bloot.", "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 > 8008 && tokenId <= 20000, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }

    function multiMint(uint256[] memory tokenIds) public nonReentrant {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] > 8008 && tokenIds[i] < 20000, "Token ID invalid");
            _safeMint(msg.sender, tokenIds[i]);
        }
    }

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

    function multiMintWithBloot(uint256[] memory lootIds) public nonReentrant {
        for (uint256 i = 0; i < lootIds.length; i++) {
            require(lootContract.ownerOf(lootIds[i]) == msg.sender, "Not the owner of this Bloot");
            _safeMint(_msgSender(), lootIds[i]);
        }
    }

    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("Bloot Dogg", "DOGG") 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":"getAccuracy","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":"getAttack","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBreed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDefense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHealth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLuck","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSpeed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTag","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":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"lootIds","type":"uint256[]"}],"name":"multiMintWithBloot","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"}]

6080604052734f8730e0b32b04beaa5757e5aea3aef970e5b613600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518061426001604052806040518060400160405280600581526020017f537573686900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f44756d706c696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f47656e657669766500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50616e63616b650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f59756b690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476967690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486170707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436869626900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c75636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f63686900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427562626100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f597569000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6174636861000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a6572727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42756e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f43616e647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f427562626c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f41707269636f740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f427574746f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f467265636b6c657300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6f6f646c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d756666696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5370726f7574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506561636879000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f576166666c657374696c74736b696e000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5065616e7574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546564647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506562626c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4b61626f6368616e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546164656f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f416262790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f416265000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416464696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f416365000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f416c65786973000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4165726f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416c69636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416964656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f416d656c6961000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f414a00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416e67656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416c66696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f416e6e696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f416e64790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f417269656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f417263686965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417661000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f417274696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f417665727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f41746c617300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426162790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f41757374696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4261696c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4261696c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42616d626900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f42616a610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426173696c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4261726b6c65790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f426561000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426173696c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4265616e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426178746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42656c6c6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4265616e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42656c6c6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426574747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426561750000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426972646965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42656e6a6900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426973637569740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42656e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426c616e6368650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42696c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426c6f6e6469650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f42696e676f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426c6f73736f6d0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f426973637569740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426f6e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426c617a6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f42726f6f6b6c796e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426c75650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427566667900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f426f00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f43616c6c6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426f6c740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f43616e647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426f6f6d6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4361726c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f426f6f747300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4361726d656e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427261647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436173657900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f42726f776e69650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436563650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427562626100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4368616e6365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4275636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4368616e656c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f427564647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436865727279000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f427573746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f43686579656e6e6500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f427574746f6e730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f43686c6f6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f42757a7a0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f43696e6e616d6f6e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4361696e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436c61726100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4361707461696e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436c656f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436172746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436c6f766572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4368616d7000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436f636f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4368616e6365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f6f6b6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f436861726c69650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436f72610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436861736500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f437269636b65740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f436865737465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446169737900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436865777900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f44616b6f7461000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436869636f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f44616c6c6173000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436869700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446170686e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f434a00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4461726c6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f436c6966666f726400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44656c696100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436c79646500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44656c696c61680000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436f64790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f44657374696e790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436f6f706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436f726b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446976610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436f736d6f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446978696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f44617277696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f446f6c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446173680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446f72610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446176790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f446f72790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f44656e766572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f446f74000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446578746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446f74746965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f44696573656c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f447563686573730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44696a6f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4564656e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446f6e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f456469650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4475646c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456666696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f447566667900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456c697a6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f44756b650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f456c6c610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f447573747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456c6c696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f44796c616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f456c6f697365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456464696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f456c73610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f456c69000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456d62657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456c696f7400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f456d6d610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f456c746f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f456d6d790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f457665726574740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f457474610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f457a72610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f457661000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4661726c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466169746800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f46656c697800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f46616e637900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f46696e6c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f46616e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f46696e6e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f46616e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f466973686572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466179650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f466c61736800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466966690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466f72726573740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f466c6f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4672616e6b00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f466f78790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4672616e6b69650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f467269646100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4672616e6b6c696e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f476162627900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f467265646479000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f47656f726769610000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f467269747a00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f476961000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476167650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476964676574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f47656f726765000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f476967690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f47686f737400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f47696e676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f476f6f736500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476c6f726961000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f476f72647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476f6c646965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f477261647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f477261636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f477573000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f477261636965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4861726c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4861646c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486172727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4861696c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486172766579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f48616e6e6168000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486179657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4861726c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48656e727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486172706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f6f636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48617a656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486f73730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486569646900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4875636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f486572736865790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f487564736f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f6c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f48756e746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f486f6e657900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f496b65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486f70650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f496e64790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f496262790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f497261000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f496461000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a61636b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f497269730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4a61636b736f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f49766f727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a6173706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f497679000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a6176610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f497a7a790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a6573736500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a61636b6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a657468726f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a6164610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a6f65790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a6164650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a6f7264616e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4a61736d696e650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a6f72647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a617a7a7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b616e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a656e6e6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b696e670000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a6572736579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6e6f780000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a6577656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6f62790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4a6f6c656e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6f64610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4a6f73696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c616e636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a756e6f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c656e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4b61726d6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c656f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4b61796c6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c65726f7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4b656e6e6564790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6576690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b696b690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6577697300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b696e6c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4c696768746e696e67000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6972610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c696e636f6c6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6977690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c696e757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6f64610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6f67616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4b6f6b6f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6f6b690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6163790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6f75696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6164790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c796c650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c61696b6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6163000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c6173736965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d616a6f7200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c61796c6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d61726c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6569610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6172747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c656e610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d61736f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6578690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6178000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6578790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d6178696d75730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6962627900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4d617877656c6c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c6962657274790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d69636b6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c696c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d696c657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c6f6c610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d696c6f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c6f74746965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6f65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c75636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f6e747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c7563790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f72747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c756c750000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d7572706879000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4c756e610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d7572726179000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6162656c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e656c736f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6163790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6577746f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6164646965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e69636f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6169736965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4e696c657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6176697300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e6f61680000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6179610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e6f726d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6961000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4f616b6c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d696c657900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f64696e0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d696c6c6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f6c6c696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d696d690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f72736f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d696e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f7363617200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6973737900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f7469730000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f63686100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f74746f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f6c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f7a7a790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d6f7267616e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5061636f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4d6f78696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f50616c000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d756666696e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5061726b6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e616c610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5061726b6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e656c6c6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506174636800000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6573736965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5065616e7574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4e6574746965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506570706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4e696b6b6900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506572637900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e6f6c610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506572727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4e6f72690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506574657900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4f6465737361000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f506970000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f6c69766500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506970657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4f6c69766961000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f506f65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f70616c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f506f676f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4f72656f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506f6e676f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506169676500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506f72746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506172697300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5072696e6365000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5061726b6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5175696e6379000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506561636865730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52616e647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5065616e7574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f52616e676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506561726c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f52617363616c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506562626c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f526564000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506567677900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f526567676965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f50656e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5269636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f506570706572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52696e676f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506574726100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5269706c6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50686f656e69780000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f526f636b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506970657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f527564790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506970706100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f527566757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506978696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f527573747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506f6c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f53616d000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f506f70707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53616d6d7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f50726563696f757300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536172676500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5072696e6365737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536177796572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50756d706b696e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53636f6f6279000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f517565656e69650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53636f6f7465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f52656d790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53636f757400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f52696c657900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f536372617070790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f526f73696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536861646f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526f78790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5368696c6f68000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f527562790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53696d626100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f527574686965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f536b69700000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536164696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536d6f6b7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53616e647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536e6f6f7079000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536173686100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536f636b7300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536173737900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537061726b79000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f536361726c65740000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5370656e6365720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536861646f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5370696b6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536865626100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f53706f740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5368656c6279000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5374616e6c65790000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5368696c6f68000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537465776965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536965727261000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537469746368000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536973737900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5461636f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f536b79650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f54616e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536b796c6172000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f54616e6e6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536f70686965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5461796c6f72000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f537461720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f54617a000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f537461726c61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546564647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5374656c6c61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546974757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53746f726d00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f544a00000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537567617200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f546f62696173000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f53756b690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f62790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53756d6d6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f546f74000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53756e6e7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f746f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53757a696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f547269707000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537765657469650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5475636b6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5379646e6579000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f547572626f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546162627900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5475726e6572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546166667900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54796c657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546173686100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5479736f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f546573736100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5665726e6f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5468656f0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f56696e636500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54696c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56696e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f547269786965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f576164650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f547275647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f576166666c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f56696f6c6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f57616c6c7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f566978656e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f57616c746572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f576967676c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f576174736f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f57696c6c6100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f57696c627572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f57696c6c6f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f57696e73746f6e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f57696e6e6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f576f6f647900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f58656e610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f577961747400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5a656c646100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f57796c696500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f5a6f65000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f596f67690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5a6f6c610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5a616e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5a7572690000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f5a69676779000000000000000000000000000000000000000000000000000000815250815250600e9061021362007b3a9291906200b1e2565b506040518061034001604052806040518060400160405280600981526020017f536869626120496e75000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f42756c6c646f670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f44616c6d617469616e000000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f476f6c64656e205265747269657665720000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5368696820547a7500000000000000000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f4265726e657365204d6f756e7461696e20446f6700000000000000000000000081525081526020016040518060400160405280600d81526020017f426f7264657220436f6c6c69650000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f43686f772043686f77000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f426963686f6e204672697365000000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f4d696e696174757265205363686e61757a65720000000000000000000000000081525081526020016040518060400160405280600b81526020017f506f6d6572616e69616e2000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4d616c746573652054657272696572000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f476f6c64656e646f6f646c65000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446163687368756e64000000000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f596f726b7368697265205465727269657200000000000000000000000000000081525081526020016040518060400160405280600581526020017f436f72676900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f4765726d616e205368657068657264000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4c61627261646f7200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f426561676c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f436869687561687561000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f47726561742044616e650000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f47726579686f756e64000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4672656e6368696500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f507567000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f537069747a00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4875736b79000000000000000000000000000000000000000000000000000000815250815250600f90601a620081559291906200b249565b506040518061028001604052806040518060400160405280600881526020017f4865616c7468203100000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203600000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4865616c7468203900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203130000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203131000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203132000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203133000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203134000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203135000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203136000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203137000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203138000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203139000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4865616c7468203230000000000000000000000000000000000000000000000081525081525060109060146200860e9291906200b2b0565b506040518061028001604052806040518060400160405280600881526020017f41747461636b203100000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203600000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f41747461636b203900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203130000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203131000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203132000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203133000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203134000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203135000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203136000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203137000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203138000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b203139000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f41747461636b2032300000000000000000000000000000000000000000000000815250815250601190601462008ac79291906200b2b0565b506040518061028001604052806040518060400160405280600981526020017f446566656e73652031000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652032000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652033000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652034000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652035000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652036000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652037000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652038000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f446566656e73652039000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031300000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031310000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031320000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031330000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031340000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031350000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031360000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031370000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031380000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e73652031390000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f446566656e736520323000000000000000000000000000000000000000000000815250815250601290601462008f809291906200b2b0565b506040518061028001604052806040518060400160405280600781526020017f537065656420310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f537065656420390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313100000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313600000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313800000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f537065656420313900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f53706565642032300000000000000000000000000000000000000000000000008152508152506013906014620094399291906200b2b0565b506040518061028001604052806040518060400160405280600a81526020017f416363757261637920310000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920320000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920330000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920340000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920350000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920360000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920370000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920380000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416363757261637920390000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313100000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313200000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313300000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313400000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313500000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313600000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313700000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313800000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f416363757261637920313900000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f41636375726163792032300000000000000000000000000000000000000000008152508152506014906014620098f29291906200b2b0565b506040518061028001604052806040518060400160405280600681526020017f4c75636b2031000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2032000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2033000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2034000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2035000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2036000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2037000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2038000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c75636b2039000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031300000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031310000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031320000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031330000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031340000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031350000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031360000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031370000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031380000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b2031390000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4c75636b20323000000000000000000000000000000000000000000000000000815250815250601590601462009dab9291906200b2b0565b50604051806102c001604052806040518060400160405280600d81526020017f54686520506f756e6420446f670000000000000000000000000000000000000081525081526020016040518060400160405280601881526020017f546865205065616e757420427574746572204c69636b6572000000000000000081525081526020016040518060400160405280601681526020017f5468652052756e74206f6620746865204c69747465720000000000000000000081525081526020016040518060400160405280600f81526020017f54686520436172676f205269646572000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f546865204c6561736820427265616b657200000000000000000000000000000081525081526020016040518060400160405280601781526020017f54686520536d616c6c20526f64656e7420536c6179657200000000000000000081525081526020016040518060400160405280601381526020017f54686520537175697272656c2048756e7465720000000000000000000000000081525081526020016040518060400160405280601281526020017f54686520476174652050726f746563746f72000000000000000000000000000081525081526020016040518060400160405280601c81526020017f54686520477561726469616e206f662074686520436869636b656e730000000081525081526020016040518060400160405280600c81526020017f546865205075726562726564000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f546865204775696465646f67000000000000000000000000000000000000000081525081526020016040518060400160405280601e81526020017f54686520486f756e64206f6620436f756368204465737472756374696f6e000081525081526020016040518060400160405280601781526020017f54686520486572646572206f662074686520536865657000000000000000000081525081526020016040518060400160405280600e81526020017f54686520536f636b20546869656600000000000000000000000000000000000081525081526020016040518060400160405280601881526020017f4578706c6f726572206f662074686520446f67205061726b000000000000000081525081526020016040518060400160405280601381526020017f54686520536f6e206f66204d6f6e6772656c730000000000000000000000000081525081526020016040518060400160405280601681526020017f54686520506f6f6368206f66207468652050757273650000000000000000000081525081526020016040518060400160405280601681526020017f5468652053717565616b7920546f79204b696c6c65720000000000000000000081525081526020016040518060400160405280601381526020017f546865204272696e676572206f66204261726b0000000000000000000000000081525081526020016040518060400160405280601481526020017f546865204272696e676572206f662053686f657300000000000000000000000081525081526020016040518060400160405280601381526020017f546865204c6f7264206f6620536c6f626265720000000000000000000000000081525081526020016040518060400160405280601881526020017f546865204b6565706572206f6620746865204b656e6e656c000000000000000081525081525060169060166200a2da9291906200b317565b50604051806104c001604052806040518060400160405280600f81526020017f5468652042756c6c2d486561646564000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f5468652043726174652d547261696e656400000000000000000000000000000081525081526020016040518060400160405280600b81526020017f5468652047726f6f6d656400000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f546865205363727566667900000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204272617665000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f546865205072697373790000000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f546865204e65757465726564205374756400000000000000000000000000000081525081526020016040518060400160405280600d81526020017f54686520546f6f74686c6573730000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f546865204b696e676c790000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f546865205072696e63656c79000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f54686520486f75736562726f6b656e000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f54686520576174636866756c000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f54686520436f776172646c79000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204d6f6f6479000000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f54686520556e6c6561736865640000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f5468652042656767696e6700000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204c6f79616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280601781526020017f54686520426c756520616e642042726f776e204579656400000000000000000081525081526020016040518060400160405280600981526020017f546865205374726179000000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f5468652057656c6c20547261696e65640000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204875736b79000000000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f546865205375626d69737369766500000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f54686520446f6d696e616e74000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f5468652057656c6c20427265640000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f5468652052656164792d746f2d506c656173650000000000000000000000000081525081526020016040518060400160405280600b81526020017f5468652057616767696e6700000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f54686520476f6f642d4e6174757265640000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f546865204e6572766f757300000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f5468652052616d62756e6374696f75730000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f54686520416e6369656e7400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f546865204e65776269650000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f546865205769736500000000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f5468652054687265652d4c65676765640000000000000000000000000000000081525081526020016040518060400160405280601081526020017f54686520547275737420576f727468790000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204e6f626c65000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f546865204f62656469656e74000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204875666679000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f546865204e69707079000000000000000000000000000000000000000000000081525081525060179060266200abb99291906200b37e565b506040518061026001604052806040518060400160405280600f81526020017f6f662047756e646f67204775696c64000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f662043616e696e6520436c756200000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f6620486f756e642048616c6c0000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f6620507570707920506c61636500000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f6f66204d6f6e6772656c204d6f756e7461696e0000000000000000000000000081525081526020016040518060400160405280601481526020017f6f6620746865204d75747420417373656d626c7900000000000000000000000081525081526020016040518060400160405280601781526020017f6f6620746865204261636b796172642048756e7465727300000000000000000081525081526020016040518060400160405280601181526020017f4c617374206f662068697320427265656400000000000000000000000000000081525081526020016040518060400160405280601581526020017f6f66207468652053706179656420536f6369657479000000000000000000000081525081526020016040518060400160405280601a81526020017f6f6620746865204361742d467269656e646c7920436c6971756500000000000081525081526020016040518060400160405280601381526020017f6f662074686520437572696f757320437265770000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f662074686520446f672052756e00000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f66207468652046656e6365640000000000000000000000000000000000000081525081526020016040518060400160405280601d81526020017f6f662074686520466f75722d4c6567676564204672617465726e69747900000081525081526020016040518060400160405280601381526020017f6f6620486f75736562726f6b656e2048696c6c0000000000000000000000000081525081526020016040518060400160405280601681526020017f6f662074686520536c6f6262657220536f63696574790000000000000000000081525081526020016040518060400160405280601081526020017f666f6c6c6f776572206f6620436172730000000000000000000000000000000081525081526020016040518060400160405280601081526020017f666f6c6c6f776572206f6620436174730000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f6f662048756e746572204875620000000000000000000000000000000000000081525081525060189060136200b0379291906200b3e5565b503480156200b04557600080fd5b506040518060400160405280600a81526020017f426c6f6f7420446f6767000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f444f47470000000000000000000000000000000000000000000000000000000081525081600090805190602001906200b0ca9291906200b44c565b5080600190805190602001906200b0e39291906200b44c565b5050506001600a819055506200b10e6200b1026200b11460201b60201c565b6200b11c60201b60201c565b6200b5cf565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280548282559060005260206000209081019282156200b236579160200282015b828111156200b2355782518290805190602001906200b2249291906200b44c565b50916020019190600101906200b203565b5b5090506200b24591906200b4dd565b5090565b8280548282559060005260206000209081019282156200b29d579160200282015b828111156200b29c5782518290805190602001906200b28b9291906200b44c565b50916020019190600101906200b26a565b5b5090506200b2ac91906200b4dd565b5090565b8280548282559060005260206000209081019282156200b304579160200282015b828111156200b3035782518290805190602001906200b2f29291906200b44c565b50916020019190600101906200b2d1565b5b5090506200b31391906200b4dd565b5090565b8280548282559060005260206000209081019282156200b36b579160200282015b828111156200b36a5782518290805190602001906200b3599291906200b44c565b50916020019190600101906200b338565b5b5090506200b37a91906200b4dd565b5090565b8280548282559060005260206000209081019282156200b3d2579160200282015b828111156200b3d15782518290805190602001906200b3c09291906200b44c565b50916020019190600101906200b39f565b5b5090506200b3e191906200b4dd565b5090565b8280548282559060005260206000209081019282156200b439579160200282015b828111156200b4385782518290805190602001906200b4279291906200b44c565b50916020019190600101906200b406565b5b5090506200b44891906200b4dd565b5090565b8280546200b45a906200b56a565b90600052602060002090601f0160209004810192826200b47e57600085556200b4ca565b82601f106200b49957805160ff19168380011785556200b4ca565b828001600101855582156200b4ca579182015b828111156200b4c95782518255916020019190600101906200b4ac565b5b5090506200b4d991906200b505565b5090565b5b808211156200b50157600081816200b4f791906200b524565b506001016200b4de565b5090565b5b808211156200b5205760008160009055506001016200b506565b5090565b5080546200b532906200b56a565b6000825580601f106200b54657506200b567565b601f0160209004906000526020600020908101906200b56691906200b505565b5b50565b600060028204905060018216806200b58357607f821691505b602082108114156200b59a576200b5996200b5a0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615fab806200b5df6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063691bbb691161011a578063b40c25d2116100ad578063cff840f01161007c578063cff840f0146105fa578063e37bbc5e1461062a578063e985e9c51461065a578063eb22daa31461068a578063f2fde38b146106ba576101fb565b8063b40c25d214610562578063b88d4fde1461057e578063c75115451461059a578063c87b56dd146105ca576101fb565b806395d89b41116100e957806395d89b41146104f05780639a0e4ebb1461050e578063a0712d681461052a578063a22cb46514610546576101fb565b8063691bbb691461046857806370a0823114610498578063715018a6146104c85780638da5cb5b146104d2576101fb565b806335b48afd116101925780634f6ccce7116101615780634f6ccce7146103bc5780636352211e146103ec57806363812e9a1461041c5780636500aee014610438576101fb565b806335b48afd146103225780633fc70f2c1461034057806342842e0e146103705780634b93f7531461038c576101fb565b80630e439326116101ce5780630e4393261461029a57806318160ddd146102b857806323b872dd146102d65780632f745c59146102f2576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906146f4565b6106d6565b6040516102279190614e38565b60405180910390f35b610238610750565b6040516102459190614e6e565b60405180910390f35b61026860048036038101906102639190614746565b6107e2565b6040516102759190614dd1565b60405180910390f35b61029860048036038101906102939190614677565b610867565b005b6102a261097f565b6040516102af9190614dd1565b60405180910390f35b6102c06109a5565b6040516102cd9190615110565b60405180910390f35b6102f060048036038101906102eb9190614571565b6109b2565b005b61030c60048036038101906103079190614677565b610a12565b6040516103199190615110565b60405180910390f35b61032a610ab7565b6040516103379190614e53565b60405180910390f35b61035a60048036038101906103559190614746565b610add565b6040516103679190614e6e565b60405180910390f35b61038a60048036038101906103859190614571565b610bf7565b005b6103a660048036038101906103a19190614746565b610c17565b6040516103b39190614e6e565b60405180910390f35b6103d660048036038101906103d19190614746565b610d31565b6040516103e39190615110565b60405180910390f35b61040660048036038101906104019190614746565b610dc8565b6040516104139190614dd1565b60405180910390f35b610436600480360381019061043191906146b3565b610e7a565b005b610452600480360381019061044d9190614746565b61109c565b60405161045f9190614e6e565b60405180910390f35b610482600480360381019061047d9190614746565b6111b6565b60405161048f9190614e6e565b60405180910390f35b6104b260048036038101906104ad91906144e3565b6112d0565b6040516104bf9190615110565b60405180910390f35b6104d0611388565b005b6104da611410565b6040516104e79190614dd1565b60405180910390f35b6104f861143a565b6040516105059190614e6e565b60405180910390f35b610528600480360381019061052391906146b3565b6114cc565b005b610544600480360381019061053f9190614746565b611660565b005b610560600480360381019061055b919061463b565b61171c565b005b61057c60048036038101906105779190614746565b61189d565b005b610598600480360381019061059391906145c0565b611a70565b005b6105b460048036038101906105af9190614746565b611ad2565b6040516105c19190614e6e565b60405180910390f35b6105e460048036038101906105df9190614746565b611bec565b6040516105f19190614e6e565b60405180910390f35b610614600480360381019061060f9190614746565b61268e565b6040516106219190614e6e565b60405180910390f35b610644600480360381019061063f9190614746565b6127a8565b6040516106519190614e6e565b60405180910390f35b610674600480360381019061066f9190614535565b6128c2565b6040516106819190614e38565b60405180910390f35b6106a4600480360381019061069f9190614746565b612956565b6040516106b19190614e6e565b60405180910390f35b6106d460048036038101906106cf91906144e3565b612a70565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610749575061074882612b68565b5b9050919050565b60606000805461075f906153f4565b80601f016020809104026020016040519081016040528092919081815260200182805461078b906153f4565b80156107d85780601f106107ad576101008083540402835291602001916107d8565b820191906000526020600020905b8154815290600101906020018083116107bb57829003601f168201915b5050505050905090565b60006107ed82612c4a565b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082390615010565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087282610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90615090565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610902612cb6565b73ffffffffffffffffffffffffffffffffffffffff16148061093157506109308161092b612cb6565b6128c2565b5b610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790614f90565b60405180910390fd5b61097a8383612cbe565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b6109c36109bd612cb6565b82612d77565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906150b0565b60405180910390fd5b610a0d838383612e55565b505050565b6000610a1d836112d0565b8210610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590614e90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610bf0826040518060400160405280600681526020017f4845414c544800000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610be7578382906000526020600020018054610b5a906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906153f4565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081526020019060010190610b3b565b505050506130b1565b9050919050565b610c1283838360405180602001604052806000815250611a70565b505050565b6060610d2a826040518060400160405280600581526020017f53504545440000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610d21578382906000526020600020018054610c94906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc0906153f4565b8015610d0d5780601f10610ce257610100808354040283529160200191610d0d565b820191906000526020600020905b815481529060010190602001808311610cf057829003601f168201915b505050505081526020019060010190610c75565b505050506130b1565b9050919050565b6000610d3b6109a5565b8210610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906150d0565b60405180910390fd5b60088281548110610db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890614fd0565b60405180910390fd5b80915050919050565b6002600a541415610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb7906150f0565b60405180910390fd5b6002600a8190555060005b8151811015611090573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610f62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610f869190615110565b60206040518083038186803b158015610f9e57600080fd5b505afa158015610fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd6919061450c565b73ffffffffffffffffffffffffffffffffffffffff161461102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390614ed0565b60405180910390fd5b61107d611037612cb6565b838381518110611070577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161356c565b808061108890615457565b915050610ecb565b506001600a8190555050565b60606111af826040518060400160405280600881526020017f41434355524143590000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b828210156111a6578382906000526020600020018054611119906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611145906153f4565b80156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b5050505050815260200190600101906110fa565b505050506130b1565b9050919050565b60606112c9826040518060400160405280600381526020017f5441470000000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156112c0578382906000526020600020018054611233906153f4565b80601f016020809104026020016040519081016040528092919081815260200182805461125f906153f4565b80156112ac5780601f10611281576101008083540402835291602001916112ac565b820191906000526020600020905b81548152906001019060200180831161128f57829003601f168201915b505050505081526020019060010190611214565b505050506130b1565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890614fb0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611390612cb6565b73ffffffffffffffffffffffffffffffffffffffff166113ae611410565b73ffffffffffffffffffffffffffffffffffffffff1614611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90615030565b60405180910390fd5b61140e600061358a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611449906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611475906153f4565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b5050505050905090565b6002600a541415611512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611509906150f0565b60405180910390fd5b6002600a8190555060005b815181101561165457611f48828281518110611562577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511180156115b85750614e208282815181106115ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b6115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90615050565b60405180910390fd5b61164133838381518110611634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161356c565b808061164c90615457565b91505061151d565b506001600a8190555050565b6002600a5414156116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d906150f0565b60405180910390fd5b6002600a81905550611f48811180156116c15750614e208111155b611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790615050565b60405180910390fd5b61171161170b612cb6565b8261356c565b6001600a8190555050565b611724612cb6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990614f50565b60405180910390fd5b806005600061179f612cb6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184c612cb6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118919190614e38565b60405180910390a35050565b6002600a5414156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da906150f0565b60405180910390fd5b6002600a819055506000811180156118fd5750611f488111155b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390615050565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016119ae9190615110565b60206040518083038186803b1580156119c657600080fd5b505afa1580156119da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fe919061450c565b73ffffffffffffffffffffffffffffffffffffffff1614611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90614ed0565b60405180910390fd5b611a65611a5f612cb6565b8261356c565b6001600a8190555050565b611a81611a7b612cb6565b83612d77565b611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab7906150b0565b60405180910390fd5b611acc84848484613650565b50505050565b6060611be5826040518060400160405280600481526020017f4c55434b000000000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015611bdc578382906000526020600020018054611b4f906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7b906153f4565b8015611bc85780601f10611b9d57610100808354040283529160200191611bc8565b820191906000526020600020905b815481529060010190602001808311611bab57829003601f168201915b505050505081526020019060010190611b30565b505050506130b1565b9050919050565b6060611bf6614318565b60405180610120016040528060ff8152602001615de660ff913981600060118110611c4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c5b836111b6565b81600160118110611c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615f4e6028913981600260118110611cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611d01836127a8565b81600360118110611d3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615d1b6028913981600460118110611d96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611da783610add565b81600560118110611de1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615d956028913981600660118110611e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611e4d8361268e565b81600760118110611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615dbd6029913981600860118110611ee2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ef383612956565b81600960118110611f2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615d6c6029913981600a60118110611f88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611f9983610c17565b81600b60118110611fd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615ee56029913981600c6011811061202e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061203f8361109c565b81600d60118110612079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615d436029913981600e601181106120d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506120e583611ad2565b81600f6011811061211f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110612197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000601181106121db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260016011811061221a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360118110612298577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004601181106122d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110612316577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110612355577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110612394577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008601181106123d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016123f099989796959493929190614c75565b6040516020818303038152906040529050808260096011811061243c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a6011811061247b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b601181106124ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c601181106124f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110612538577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110612577577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f601181106125b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896010601181106125f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161261299989796959493929190614c75565b6040516020818303038152906040529050600061265f612631866136ac565b61263a84613859565b60405160200161264b929190614d6a565b604051602081830303815290604052613859565b9050806040516020016126729190614daf565b6040516020818303038152906040529150819350505050919050565b60606127a1826040518060400160405280600681526020017f41545441434b00000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561279857838290600052602060002001805461270b906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612737906153f4565b80156127845780601f1061275957610100808354040283529160200191612784565b820191906000526020600020905b81548152906001019060200180831161276757829003601f168201915b5050505050815260200190600101906126ec565b505050506130b1565b9050919050565b60606128bb826040518060400160405280600581526020017f4252454544000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156128b2578382906000526020600020018054612825906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612851906153f4565b801561289e5780601f106128735761010080835404028352916020019161289e565b820191906000526020600020905b81548152906001019060200180831161288157829003601f168201915b505050505081526020019060010190612806565b505050506130b1565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060612a69826040518060400160405280600781526020017f444546454e5345000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015612a605783829060005260206000200180546129d3906153f4565b80601f01602080910402602001604051908101604052809291908181526020018280546129ff906153f4565b8015612a4c5780601f10612a2157610100808354040283529160200191612a4c565b820191906000526020600020905b815481529060010190602001808311612a2f57829003601f168201915b5050505050815260200190600101906129b4565b505050506130b1565b9050919050565b612a78612cb6565b73ffffffffffffffffffffffffffffffffffffffff16612a96611410565b73ffffffffffffffffffffffffffffffffffffffff1614612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae390615030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5390614ef0565b60405180910390fd5b612b658161358a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c3357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c435750612c4282613a17565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3183610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8282612c4a565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890614f70565b60405180910390fd5b6000612dcc83610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3b57508373ffffffffffffffffffffffffffffffffffffffff16612e23846107e2565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4c5750612e4b81856128c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e7582610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290615070565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3290614f30565b60405180910390fd5b612f46838383613a81565b612f51600082612cbe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa191906152e6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ff89190615205565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006130e7846130c2876136ac565b6040516020016130d3929190614c51565b604051602081830303815290604052613b95565b90506000838451836130f991906154a0565b81518110613130577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600060158361314991906154a0565b90507f316dc6ad1984e1bf10eedde33411771ee0a22c266c8d5f3928ecde90d61100638660405160200161317d9190614c3a565b604051602081830303815290604052805190602001201480156131a05750600e81115b1561348d576131ad614340565b60178080549050856131bf91906154a0565b815481106131f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461320b906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613237906153f4565b80156132845780601f1061325957610100808354040283529160200191613284565b820191906000526020600020905b81548152906001019060200180831161326757829003601f168201915b5050505050816000600281106132c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060188080549050856132dd91906154a0565b81548110613314577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018054613329906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613355906153f4565b80156133a25780601f10613377576101008083540402835291602001916133a2565b820191906000526020600020905b81548152906001019060200180831161338557829003601f168201915b5050505050816001600281106133e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525080600060028110613423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518382600160028110613463577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161347a93929190614cf4565b6040516020818303038152906040529250505b7f39e0087e5231d8e38479c7553165d6c63e1689108485d905fe1951e49ea19d41866040516020016134bf9190614c3a565b604051602081830303815290604052805190602001201480156134e3575060138110155b1561355f578160168080549050856134fb91906154a0565b81548110613532577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160405160200161354d929190614d3b565b60405160208183030381529060405291505b8193505050509392505050565b613586828260405180602001604052806000815250613bc8565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61365b848484612e55565b61366784848484613c23565b6136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369d90614eb0565b60405180910390fd5b50505050565b606060008214156136f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613854565b600082905060005b6000821461372657808061370f90615457565b915050600a8261371f919061525b565b91506136fc565b60008167ffffffffffffffff811115613768577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561379a5781602001600182028036833780820191505090505b5090505b6000851461384d576001826137b391906152e6565b9150600a856137c291906154a0565b60306137ce9190615205565b60f81b81838151811061380a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613846919061525b565b945061379e565b8093505050505b919050565b606060008251905060008114156138825760405180602001604052806000815250915050613a12565b600060036002836138939190615205565b61389d919061525b565b60046138a9919061528c565b905060006020826138ba9190615205565b67ffffffffffffffff8111156138f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561392b5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615f0e604091399050600181016020830160005b868110156139cf5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613956565b5060038606600181146139e957600281146139f957613a04565b613d3d60f01b6002830352613a04565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613a8c838383613dba565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613acf57613aca81613dbf565b613b0e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b0d57613b0c8382613e08565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b5157613b4c81613f75565b613b90565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b8f57613b8e82826140b8565b5b5b505050565b600081604051602001613ba89190614c3a565b6040516020818303038152906040528051906020012060001c9050919050565b613bd28383614137565b613bdf6000848484613c23565b613c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1590614eb0565b60405180910390fd5b505050565b6000613c448473ffffffffffffffffffffffffffffffffffffffff16614305565b15613dad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c6d612cb6565b8786866040518563ffffffff1660e01b8152600401613c8f9493929190614dec565b602060405180830381600087803b158015613ca957600080fd5b505af1925050508015613cda57506040513d601f19601f82011682018060405250810190613cd7919061471d565b60015b613d5d573d8060008114613d0a576040519150601f19603f3d011682016040523d82523d6000602084013e613d0f565b606091505b50600081511415613d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4c90614eb0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613db2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e15846112d0565b613e1f91906152e6565b9050600060076000848152602001908152602001600020549050818114613f04576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613f8991906152e6565b9050600060096000848152602001908152602001600020549050600060088381548110613fdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110614027577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061409c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006140c3836112d0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419e90614ff0565b60405180910390fd5b6141b081612c4a565b156141f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141e790614f10565b60405180910390fd5b6141fc60008383613a81565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461424c9190615205565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816143285790505090565b60405180604001604052806002905b606081526020019060019003908161434f5790505090565b600061437a61437584615150565b61512b565b9050808382526020820190508285602086028201111561439957600080fd5b60005b858110156143c957816143af88826144ce565b84526020840193506020830192505060018101905061439c565b5050509392505050565b60006143e66143e18461517c565b61512b565b9050828152602081018484840111156143fe57600080fd5b6144098482856153b2565b509392505050565b60008135905061442081615cbe565b92915050565b60008151905061443581615cbe565b92915050565b600082601f83011261444c57600080fd5b813561445c848260208601614367565b91505092915050565b60008135905061447481615cd5565b92915050565b60008135905061448981615cec565b92915050565b60008151905061449e81615cec565b92915050565b600082601f8301126144b557600080fd5b81356144c58482602086016143d3565b91505092915050565b6000813590506144dd81615d03565b92915050565b6000602082840312156144f557600080fd5b600061450384828501614411565b91505092915050565b60006020828403121561451e57600080fd5b600061452c84828501614426565b91505092915050565b6000806040838503121561454857600080fd5b600061455685828601614411565b925050602061456785828601614411565b9150509250929050565b60008060006060848603121561458657600080fd5b600061459486828701614411565b93505060206145a586828701614411565b92505060406145b6868287016144ce565b9150509250925092565b600080600080608085870312156145d657600080fd5b60006145e487828801614411565b94505060206145f587828801614411565b9350506040614606878288016144ce565b925050606085013567ffffffffffffffff81111561462357600080fd5b61462f878288016144a4565b91505092959194509250565b6000806040838503121561464e57600080fd5b600061465c85828601614411565b925050602061466d85828601614465565b9150509250929050565b6000806040838503121561468a57600080fd5b600061469885828601614411565b92505060206146a9858286016144ce565b9150509250929050565b6000602082840312156146c557600080fd5b600082013567ffffffffffffffff8111156146df57600080fd5b6146eb8482850161443b565b91505092915050565b60006020828403121561470657600080fd5b60006147148482850161447a565b91505092915050565b60006020828403121561472f57600080fd5b600061473d8482850161448f565b91505092915050565b60006020828403121561475857600080fd5b6000614766848285016144ce565b91505092915050565b6147788161531a565b82525050565b6147878161532c565b82525050565b6000614798826151c2565b6147a281856151d8565b93506147b28185602086016153c1565b6147bb8161558d565b840191505092915050565b6147cf8161538e565b82525050565b60006147e0826151cd565b6147ea81856151e9565b93506147fa8185602086016153c1565b6148038161558d565b840191505092915050565b6000614819826151cd565b61482381856151fa565b93506148338185602086016153c1565b80840191505092915050565b6000815461484c816153f4565b61485681866151fa565b945060018216600081146148715760018114614882576148b5565b60ff198316865281860193506148b5565b61488b856151ad565b60005b838110156148ad5781548189015260018201915060208101905061488e565b838801955050505b50505092915050565b60006148cb6010836151fa565b91506148d68261559e565b601082019050919050565b60006148ee602b836151e9565b91506148f9826155c7565b604082019050919050565b60006149116032836151e9565b915061491c82615616565b604082019050919050565b6000614934601b836151e9565b915061493f82615665565b602082019050919050565b60006149576026836151e9565b91506149628261568e565b604082019050919050565b600061497a601c836151e9565b9150614985826156dd565b602082019050919050565b600061499d6024836151e9565b91506149a882615706565b604082019050919050565b60006149c06019836151e9565b91506149cb82615755565b602082019050919050565b60006149e3602c836151e9565b91506149ee8261577e565b604082019050919050565b6000614a066001836151fa565b9150614a11826157cd565b600182019050919050565b6000614a296038836151e9565b9150614a34826157f6565b604082019050919050565b6000614a4c602a836151e9565b9150614a5782615845565b604082019050919050565b6000614a6f6029836151e9565b9150614a7a82615894565b604082019050919050565b6000614a926002836151fa565b9150614a9d826158e3565b600282019050919050565b6000614ab56020836151e9565b9150614ac08261590c565b602082019050919050565b6000614ad8602c836151e9565b9150614ae382615935565b604082019050919050565b6000614afb6020836151e9565b9150614b0682615984565b602082019050919050565b6000614b1e6010836151e9565b9150614b29826159ad565b602082019050919050565b6000614b416029836151e9565b9150614b4c826159d6565b604082019050919050565b6000614b6561011f836151fa565b9150614b7082615a25565b61011f82019050919050565b6000614b896021836151e9565b9150614b9482615b7f565b604082019050919050565b6000614bac601d836151fa565b9150614bb782615bce565b601d82019050919050565b6000614bcf6031836151e9565b9150614bda82615bf7565b604082019050919050565b6000614bf2602c836151e9565b9150614bfd82615c46565b604082019050919050565b6000614c15601f836151e9565b9150614c2082615c95565b602082019050919050565b614c3481615384565b82525050565b6000614c46828461480e565b915081905092915050565b6000614c5d828561480e565b9150614c69828461480e565b91508190509392505050565b6000614c81828c61480e565b9150614c8d828b61480e565b9150614c99828a61480e565b9150614ca5828961480e565b9150614cb1828861480e565b9150614cbd828761480e565b9150614cc9828661480e565b9150614cd5828561480e565b9150614ce1828461480e565b91508190509a9950505050505050505050565b6000614d00828661480e565b9150614d0b826149f9565b9150614d17828561480e565b9150614d22826149f9565b9150614d2e828461480e565b9150819050949350505050565b6000614d47828561480e565b9150614d52826149f9565b9150614d5e828461483f565b91508190509392505050565b6000614d75826148be565b9150614d81828561480e565b9150614d8c82614b57565b9150614d98828461480e565b9150614da382614a85565b91508190509392505050565b6000614dba82614b9f565b9150614dc6828461480e565b915081905092915050565b6000602082019050614de6600083018461476f565b92915050565b6000608082019050614e01600083018761476f565b614e0e602083018661476f565b614e1b6040830185614c2b565b8181036060830152614e2d818461478d565b905095945050505050565b6000602082019050614e4d600083018461477e565b92915050565b6000602082019050614e6860008301846147c6565b92915050565b60006020820190508181036000830152614e8881846147d5565b905092915050565b60006020820190508181036000830152614ea9816148e1565b9050919050565b60006020820190508181036000830152614ec981614904565b9050919050565b60006020820190508181036000830152614ee981614927565b9050919050565b60006020820190508181036000830152614f098161494a565b9050919050565b60006020820190508181036000830152614f298161496d565b9050919050565b60006020820190508181036000830152614f4981614990565b9050919050565b60006020820190508181036000830152614f69816149b3565b9050919050565b60006020820190508181036000830152614f89816149d6565b9050919050565b60006020820190508181036000830152614fa981614a1c565b9050919050565b60006020820190508181036000830152614fc981614a3f565b9050919050565b60006020820190508181036000830152614fe981614a62565b9050919050565b6000602082019050818103600083015261500981614aa8565b9050919050565b6000602082019050818103600083015261502981614acb565b9050919050565b6000602082019050818103600083015261504981614aee565b9050919050565b6000602082019050818103600083015261506981614b11565b9050919050565b6000602082019050818103600083015261508981614b34565b9050919050565b600060208201905081810360008301526150a981614b7c565b9050919050565b600060208201905081810360008301526150c981614bc2565b9050919050565b600060208201905081810360008301526150e981614be5565b9050919050565b6000602082019050818103600083015261510981614c08565b9050919050565b60006020820190506151256000830184614c2b565b92915050565b6000615135615146565b90506151418282615426565b919050565b6000604051905090565b600067ffffffffffffffff82111561516b5761516a61555e565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151975761519661555e565b5b6151a08261558d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061521082615384565b915061521b83615384565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152505761524f6154d1565b5b828201905092915050565b600061526682615384565b915061527183615384565b92508261528157615280615500565b5b828204905092915050565b600061529782615384565b91506152a283615384565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152db576152da6154d1565b5b828202905092915050565b60006152f182615384565b91506152fc83615384565b92508282101561530f5761530e6154d1565b5b828203905092915050565b600061532582615364565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615399826153a0565b9050919050565b60006153ab82615364565b9050919050565b82818337600083830152505050565b60005b838110156153df5780820151818401526020810190506153c4565b838111156153ee576000848401525b50505050565b6000600282049050600182168061540c57607f821691505b602082108114156154205761541f61552f565b5b50919050565b61542f8261558d565b810181811067ffffffffffffffff8211171561544e5761544d61555e565b5b80604052505050565b600061546282615384565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615495576154946154d1565b5b600182019050919050565b60006154ab82615384565b91506154b683615384565b9250826154c6576154c5615500565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a2022446f6767202300000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f66207468697320426c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022426c6f6f7420446f676773206160008201527f72652072616e646f6d697a65642c2067656e65726174656420616e642073746f60208201527f726564206f6e20636861696e2e20496d6167657320616e64206f74686572206660408201527f756e6374696f6e616c6974792061726520696e74656e74696f6e616c6c79206f60608201527f6d697474656420666f72206f746865727320746f20696e746572707265742e2060808201527f4665656c206672656520746f2075736520426c6f6f7420446f67677320696e2060a08201527f616e792077617920796f752077616e742e20496e73706972656420627920616e60c08201527f6420636f6d70617469626c65207769746820426c6f6f742e222c2022696d616760e08201527f65223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0061010082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615cc78161531a565b8114615cd257600080fd5b50565b615cde8161532c565b8114615ce957600080fd5b50565b615cf581615338565b8114615d0057600080fd5b50565b615d0c81615384565b8114615d1757600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220b41f8174808965a7dedfe0d81c8acf52bf38078bd702fc9322806479a7430ba764736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063691bbb691161011a578063b40c25d2116100ad578063cff840f01161007c578063cff840f0146105fa578063e37bbc5e1461062a578063e985e9c51461065a578063eb22daa31461068a578063f2fde38b146106ba576101fb565b8063b40c25d214610562578063b88d4fde1461057e578063c75115451461059a578063c87b56dd146105ca576101fb565b806395d89b41116100e957806395d89b41146104f05780639a0e4ebb1461050e578063a0712d681461052a578063a22cb46514610546576101fb565b8063691bbb691461046857806370a0823114610498578063715018a6146104c85780638da5cb5b146104d2576101fb565b806335b48afd116101925780634f6ccce7116101615780634f6ccce7146103bc5780636352211e146103ec57806363812e9a1461041c5780636500aee014610438576101fb565b806335b48afd146103225780633fc70f2c1461034057806342842e0e146103705780634b93f7531461038c576101fb565b80630e439326116101ce5780630e4393261461029a57806318160ddd146102b857806323b872dd146102d65780632f745c59146102f2576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906146f4565b6106d6565b6040516102279190614e38565b60405180910390f35b610238610750565b6040516102459190614e6e565b60405180910390f35b61026860048036038101906102639190614746565b6107e2565b6040516102759190614dd1565b60405180910390f35b61029860048036038101906102939190614677565b610867565b005b6102a261097f565b6040516102af9190614dd1565b60405180910390f35b6102c06109a5565b6040516102cd9190615110565b60405180910390f35b6102f060048036038101906102eb9190614571565b6109b2565b005b61030c60048036038101906103079190614677565b610a12565b6040516103199190615110565b60405180910390f35b61032a610ab7565b6040516103379190614e53565b60405180910390f35b61035a60048036038101906103559190614746565b610add565b6040516103679190614e6e565b60405180910390f35b61038a60048036038101906103859190614571565b610bf7565b005b6103a660048036038101906103a19190614746565b610c17565b6040516103b39190614e6e565b60405180910390f35b6103d660048036038101906103d19190614746565b610d31565b6040516103e39190615110565b60405180910390f35b61040660048036038101906104019190614746565b610dc8565b6040516104139190614dd1565b60405180910390f35b610436600480360381019061043191906146b3565b610e7a565b005b610452600480360381019061044d9190614746565b61109c565b60405161045f9190614e6e565b60405180910390f35b610482600480360381019061047d9190614746565b6111b6565b60405161048f9190614e6e565b60405180910390f35b6104b260048036038101906104ad91906144e3565b6112d0565b6040516104bf9190615110565b60405180910390f35b6104d0611388565b005b6104da611410565b6040516104e79190614dd1565b60405180910390f35b6104f861143a565b6040516105059190614e6e565b60405180910390f35b610528600480360381019061052391906146b3565b6114cc565b005b610544600480360381019061053f9190614746565b611660565b005b610560600480360381019061055b919061463b565b61171c565b005b61057c60048036038101906105779190614746565b61189d565b005b610598600480360381019061059391906145c0565b611a70565b005b6105b460048036038101906105af9190614746565b611ad2565b6040516105c19190614e6e565b60405180910390f35b6105e460048036038101906105df9190614746565b611bec565b6040516105f19190614e6e565b60405180910390f35b610614600480360381019061060f9190614746565b61268e565b6040516106219190614e6e565b60405180910390f35b610644600480360381019061063f9190614746565b6127a8565b6040516106519190614e6e565b60405180910390f35b610674600480360381019061066f9190614535565b6128c2565b6040516106819190614e38565b60405180910390f35b6106a4600480360381019061069f9190614746565b612956565b6040516106b19190614e6e565b60405180910390f35b6106d460048036038101906106cf91906144e3565b612a70565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610749575061074882612b68565b5b9050919050565b60606000805461075f906153f4565b80601f016020809104026020016040519081016040528092919081815260200182805461078b906153f4565b80156107d85780601f106107ad576101008083540402835291602001916107d8565b820191906000526020600020905b8154815290600101906020018083116107bb57829003601f168201915b5050505050905090565b60006107ed82612c4a565b61082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082390615010565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061087282610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108da90615090565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610902612cb6565b73ffffffffffffffffffffffffffffffffffffffff16148061093157506109308161092b612cb6565b6128c2565b5b610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790614f90565b60405180910390fd5b61097a8383612cbe565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b6109c36109bd612cb6565b82612d77565b610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f9906150b0565b60405180910390fd5b610a0d838383612e55565b505050565b6000610a1d836112d0565b8210610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5590614e90565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610bf0826040518060400160405280600681526020017f4845414c544800000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610be7578382906000526020600020018054610b5a906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b86906153f4565b8015610bd35780601f10610ba857610100808354040283529160200191610bd3565b820191906000526020600020905b815481529060010190602001808311610bb657829003601f168201915b505050505081526020019060010190610b3b565b505050506130b1565b9050919050565b610c1283838360405180602001604052806000815250611a70565b505050565b6060610d2a826040518060400160405280600581526020017f53504545440000000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610d21578382906000526020600020018054610c94906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc0906153f4565b8015610d0d5780601f10610ce257610100808354040283529160200191610d0d565b820191906000526020600020905b815481529060010190602001808311610cf057829003601f168201915b505050505081526020019060010190610c75565b505050506130b1565b9050919050565b6000610d3b6109a5565b8210610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906150d0565b60405180910390fd5b60088281548110610db6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890614fd0565b60405180910390fd5b80915050919050565b6002600a541415610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb7906150f0565b60405180910390fd5b6002600a8190555060005b8151811015611090573373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110610f62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610f869190615110565b60206040518083038186803b158015610f9e57600080fd5b505afa158015610fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd6919061450c565b73ffffffffffffffffffffffffffffffffffffffff161461102c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102390614ed0565b60405180910390fd5b61107d611037612cb6565b838381518110611070577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161356c565b808061108890615457565b915050610ecb565b506001600a8190555050565b60606111af826040518060400160405280600881526020017f41434355524143590000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b828210156111a6578382906000526020600020018054611119906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611145906153f4565b80156111925780601f1061116757610100808354040283529160200191611192565b820191906000526020600020905b81548152906001019060200180831161117557829003601f168201915b5050505050815260200190600101906110fa565b505050506130b1565b9050919050565b60606112c9826040518060400160405280600381526020017f5441470000000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156112c0578382906000526020600020018054611233906153f4565b80601f016020809104026020016040519081016040528092919081815260200182805461125f906153f4565b80156112ac5780601f10611281576101008083540402835291602001916112ac565b820191906000526020600020905b81548152906001019060200180831161128f57829003601f168201915b505050505081526020019060010190611214565b505050506130b1565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133890614fb0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611390612cb6565b73ffffffffffffffffffffffffffffffffffffffff166113ae611410565b73ffffffffffffffffffffffffffffffffffffffff1614611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90615030565b60405180910390fd5b61140e600061358a565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611449906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611475906153f4565b80156114c25780601f10611497576101008083540402835291602001916114c2565b820191906000526020600020905b8154815290600101906020018083116114a557829003601f168201915b5050505050905090565b6002600a541415611512576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611509906150f0565b60405180910390fd5b6002600a8190555060005b815181101561165457611f48828281518110611562577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101511180156115b85750614e208282815181106115ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151105b6115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90615050565b60405180910390fd5b61164133838381518110611634577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161356c565b808061164c90615457565b91505061151d565b506001600a8190555050565b6002600a5414156116a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169d906150f0565b60405180910390fd5b6002600a81905550611f48811180156116c15750614e208111155b611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790615050565b60405180910390fd5b61171161170b612cb6565b8261356c565b6001600a8190555050565b611724612cb6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178990614f50565b60405180910390fd5b806005600061179f612cb6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661184c612cb6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118919190614e38565b60405180910390a35050565b6002600a5414156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da906150f0565b60405180910390fd5b6002600a819055506000811180156118fd5750611f488111155b61193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193390615050565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016119ae9190615110565b60206040518083038186803b1580156119c657600080fd5b505afa1580156119da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fe919061450c565b73ffffffffffffffffffffffffffffffffffffffff1614611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90614ed0565b60405180910390fd5b611a65611a5f612cb6565b8261356c565b6001600a8190555050565b611a81611a7b612cb6565b83612d77565b611ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab7906150b0565b60405180910390fd5b611acc84848484613650565b50505050565b6060611be5826040518060400160405280600481526020017f4c55434b000000000000000000000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015611bdc578382906000526020600020018054611b4f906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7b906153f4565b8015611bc85780601f10611b9d57610100808354040283529160200191611bc8565b820191906000526020600020905b815481529060010190602001808311611bab57829003601f168201915b505050505081526020019060010190611b30565b505050506130b1565b9050919050565b6060611bf6614318565b60405180610120016040528060ff8152602001615de660ff913981600060118110611c4a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c5b836111b6565b81600160118110611c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615f4e6028913981600260118110611cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611d01836127a8565b81600360118110611d3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615d1b6028913981600460118110611d96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611da783610add565b81600560118110611de1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615d956028913981600660118110611e3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611e4d8361268e565b81600760118110611e87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615dbd6029913981600860118110611ee2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611ef383612956565b81600960118110611f2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615d6c6029913981600a60118110611f88577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611f9983610c17565b81600b60118110611fd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615ee56029913981600c6011811061202e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061203f8361109c565b81600d60118110612079577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615d436029913981600e601181106120d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506120e583611ad2565b81600f6011811061211f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601060118110612197577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000601181106121db577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260016011811061221a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110612259577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360118110612298577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004601181106122d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110612316577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110612355577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110612394577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008601181106123d3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016123f099989796959493929190614c75565b6040516020818303038152906040529050808260096011811061243c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a6011811061247b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b601181106124ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c601181106124f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110612538577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110612577577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f601181106125b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896010601181106125f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161261299989796959493929190614c75565b6040516020818303038152906040529050600061265f612631866136ac565b61263a84613859565b60405160200161264b929190614d6a565b604051602081830303815290604052613859565b9050806040516020016126729190614daf565b6040516020818303038152906040529150819350505050919050565b60606127a1826040518060400160405280600681526020017f41545441434b00000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561279857838290600052602060002001805461270b906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612737906153f4565b80156127845780601f1061275957610100808354040283529160200191612784565b820191906000526020600020905b81548152906001019060200180831161276757829003601f168201915b5050505050815260200190600101906126ec565b505050506130b1565b9050919050565b60606128bb826040518060400160405280600581526020017f4252454544000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b828210156128b2578382906000526020600020018054612825906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054612851906153f4565b801561289e5780601f106128735761010080835404028352916020019161289e565b820191906000526020600020905b81548152906001019060200180831161288157829003601f168201915b505050505081526020019060010190612806565b505050506130b1565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060612a69826040518060400160405280600781526020017f444546454e5345000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015612a605783829060005260206000200180546129d3906153f4565b80601f01602080910402602001604051908101604052809291908181526020018280546129ff906153f4565b8015612a4c5780601f10612a2157610100808354040283529160200191612a4c565b820191906000526020600020905b815481529060010190602001808311612a2f57829003601f168201915b5050505050815260200190600101906129b4565b505050506130b1565b9050919050565b612a78612cb6565b73ffffffffffffffffffffffffffffffffffffffff16612a96611410565b73ffffffffffffffffffffffffffffffffffffffff1614612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae390615030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5390614ef0565b60405180910390fd5b612b658161358a565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c3357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c435750612c4282613a17565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3183610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8282612c4a565b612dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db890614f70565b60405180910390fd5b6000612dcc83610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3b57508373ffffffffffffffffffffffffffffffffffffffff16612e23846107e2565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4c5750612e4b81856128c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e7582610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290615070565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3290614f30565b60405180910390fd5b612f46838383613a81565b612f51600082612cbe565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa191906152e6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ff89190615205565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006130e7846130c2876136ac565b6040516020016130d3929190614c51565b604051602081830303815290604052613b95565b90506000838451836130f991906154a0565b81518110613130577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600060158361314991906154a0565b90507f316dc6ad1984e1bf10eedde33411771ee0a22c266c8d5f3928ecde90d61100638660405160200161317d9190614c3a565b604051602081830303815290604052805190602001201480156131a05750600e81115b1561348d576131ad614340565b60178080549050856131bf91906154a0565b815481106131f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001805461320b906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613237906153f4565b80156132845780601f1061325957610100808354040283529160200191613284565b820191906000526020600020905b81548152906001019060200180831161326757829003601f168201915b5050505050816000600281106132c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060188080549050856132dd91906154a0565b81548110613314577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018054613329906153f4565b80601f0160208091040260200160405190810160405280929190818152602001828054613355906153f4565b80156133a25780601f10613377576101008083540402835291602001916133a2565b820191906000526020600020905b81548152906001019060200180831161338557829003601f168201915b5050505050816001600281106133e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525080600060028110613423577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518382600160028110613463577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161347a93929190614cf4565b6040516020818303038152906040529250505b7f39e0087e5231d8e38479c7553165d6c63e1689108485d905fe1951e49ea19d41866040516020016134bf9190614c3a565b604051602081830303815290604052805190602001201480156134e3575060138110155b1561355f578160168080549050856134fb91906154a0565b81548110613532577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160405160200161354d929190614d3b565b60405160208183030381529060405291505b8193505050509392505050565b613586828260405180602001604052806000815250613bc8565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61365b848484612e55565b61366784848484613c23565b6136a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161369d90614eb0565b60405180910390fd5b50505050565b606060008214156136f4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613854565b600082905060005b6000821461372657808061370f90615457565b915050600a8261371f919061525b565b91506136fc565b60008167ffffffffffffffff811115613768577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561379a5781602001600182028036833780820191505090505b5090505b6000851461384d576001826137b391906152e6565b9150600a856137c291906154a0565b60306137ce9190615205565b60f81b81838151811061380a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613846919061525b565b945061379e565b8093505050505b919050565b606060008251905060008114156138825760405180602001604052806000815250915050613a12565b600060036002836138939190615205565b61389d919061525b565b60046138a9919061528c565b905060006020826138ba9190615205565b67ffffffffffffffff8111156138f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561392b5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615f0e604091399050600181016020830160005b868110156139cf5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613956565b5060038606600181146139e957600281146139f957613a04565b613d3d60f01b6002830352613a04565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613a8c838383613dba565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613acf57613aca81613dbf565b613b0e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b0d57613b0c8382613e08565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b5157613b4c81613f75565b613b90565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b8f57613b8e82826140b8565b5b5b505050565b600081604051602001613ba89190614c3a565b6040516020818303038152906040528051906020012060001c9050919050565b613bd28383614137565b613bdf6000848484613c23565b613c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1590614eb0565b60405180910390fd5b505050565b6000613c448473ffffffffffffffffffffffffffffffffffffffff16614305565b15613dad578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c6d612cb6565b8786866040518563ffffffff1660e01b8152600401613c8f9493929190614dec565b602060405180830381600087803b158015613ca957600080fd5b505af1925050508015613cda57506040513d601f19601f82011682018060405250810190613cd7919061471d565b60015b613d5d573d8060008114613d0a576040519150601f19603f3d011682016040523d82523d6000602084013e613d0f565b606091505b50600081511415613d55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4c90614eb0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613db2565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e15846112d0565b613e1f91906152e6565b9050600060076000848152602001908152602001600020549050818114613f04576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613f8991906152e6565b9050600060096000848152602001908152602001600020549050600060088381548110613fdf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110614027577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061409c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006140c3836112d0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419e90614ff0565b60405180910390fd5b6141b081612c4a565b156141f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141e790614f10565b60405180910390fd5b6141fc60008383613a81565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461424c9190615205565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061022001604052806011905b60608152602001906001900390816143285790505090565b60405180604001604052806002905b606081526020019060019003908161434f5790505090565b600061437a61437584615150565b61512b565b9050808382526020820190508285602086028201111561439957600080fd5b60005b858110156143c957816143af88826144ce565b84526020840193506020830192505060018101905061439c565b5050509392505050565b60006143e66143e18461517c565b61512b565b9050828152602081018484840111156143fe57600080fd5b6144098482856153b2565b509392505050565b60008135905061442081615cbe565b92915050565b60008151905061443581615cbe565b92915050565b600082601f83011261444c57600080fd5b813561445c848260208601614367565b91505092915050565b60008135905061447481615cd5565b92915050565b60008135905061448981615cec565b92915050565b60008151905061449e81615cec565b92915050565b600082601f8301126144b557600080fd5b81356144c58482602086016143d3565b91505092915050565b6000813590506144dd81615d03565b92915050565b6000602082840312156144f557600080fd5b600061450384828501614411565b91505092915050565b60006020828403121561451e57600080fd5b600061452c84828501614426565b91505092915050565b6000806040838503121561454857600080fd5b600061455685828601614411565b925050602061456785828601614411565b9150509250929050565b60008060006060848603121561458657600080fd5b600061459486828701614411565b93505060206145a586828701614411565b92505060406145b6868287016144ce565b9150509250925092565b600080600080608085870312156145d657600080fd5b60006145e487828801614411565b94505060206145f587828801614411565b9350506040614606878288016144ce565b925050606085013567ffffffffffffffff81111561462357600080fd5b61462f878288016144a4565b91505092959194509250565b6000806040838503121561464e57600080fd5b600061465c85828601614411565b925050602061466d85828601614465565b9150509250929050565b6000806040838503121561468a57600080fd5b600061469885828601614411565b92505060206146a9858286016144ce565b9150509250929050565b6000602082840312156146c557600080fd5b600082013567ffffffffffffffff8111156146df57600080fd5b6146eb8482850161443b565b91505092915050565b60006020828403121561470657600080fd5b60006147148482850161447a565b91505092915050565b60006020828403121561472f57600080fd5b600061473d8482850161448f565b91505092915050565b60006020828403121561475857600080fd5b6000614766848285016144ce565b91505092915050565b6147788161531a565b82525050565b6147878161532c565b82525050565b6000614798826151c2565b6147a281856151d8565b93506147b28185602086016153c1565b6147bb8161558d565b840191505092915050565b6147cf8161538e565b82525050565b60006147e0826151cd565b6147ea81856151e9565b93506147fa8185602086016153c1565b6148038161558d565b840191505092915050565b6000614819826151cd565b61482381856151fa565b93506148338185602086016153c1565b80840191505092915050565b6000815461484c816153f4565b61485681866151fa565b945060018216600081146148715760018114614882576148b5565b60ff198316865281860193506148b5565b61488b856151ad565b60005b838110156148ad5781548189015260018201915060208101905061488e565b838801955050505b50505092915050565b60006148cb6010836151fa565b91506148d68261559e565b601082019050919050565b60006148ee602b836151e9565b91506148f9826155c7565b604082019050919050565b60006149116032836151e9565b915061491c82615616565b604082019050919050565b6000614934601b836151e9565b915061493f82615665565b602082019050919050565b60006149576026836151e9565b91506149628261568e565b604082019050919050565b600061497a601c836151e9565b9150614985826156dd565b602082019050919050565b600061499d6024836151e9565b91506149a882615706565b604082019050919050565b60006149c06019836151e9565b91506149cb82615755565b602082019050919050565b60006149e3602c836151e9565b91506149ee8261577e565b604082019050919050565b6000614a066001836151fa565b9150614a11826157cd565b600182019050919050565b6000614a296038836151e9565b9150614a34826157f6565b604082019050919050565b6000614a4c602a836151e9565b9150614a5782615845565b604082019050919050565b6000614a6f6029836151e9565b9150614a7a82615894565b604082019050919050565b6000614a926002836151fa565b9150614a9d826158e3565b600282019050919050565b6000614ab56020836151e9565b9150614ac08261590c565b602082019050919050565b6000614ad8602c836151e9565b9150614ae382615935565b604082019050919050565b6000614afb6020836151e9565b9150614b0682615984565b602082019050919050565b6000614b1e6010836151e9565b9150614b29826159ad565b602082019050919050565b6000614b416029836151e9565b9150614b4c826159d6565b604082019050919050565b6000614b6561011f836151fa565b9150614b7082615a25565b61011f82019050919050565b6000614b896021836151e9565b9150614b9482615b7f565b604082019050919050565b6000614bac601d836151fa565b9150614bb782615bce565b601d82019050919050565b6000614bcf6031836151e9565b9150614bda82615bf7565b604082019050919050565b6000614bf2602c836151e9565b9150614bfd82615c46565b604082019050919050565b6000614c15601f836151e9565b9150614c2082615c95565b602082019050919050565b614c3481615384565b82525050565b6000614c46828461480e565b915081905092915050565b6000614c5d828561480e565b9150614c69828461480e565b91508190509392505050565b6000614c81828c61480e565b9150614c8d828b61480e565b9150614c99828a61480e565b9150614ca5828961480e565b9150614cb1828861480e565b9150614cbd828761480e565b9150614cc9828661480e565b9150614cd5828561480e565b9150614ce1828461480e565b91508190509a9950505050505050505050565b6000614d00828661480e565b9150614d0b826149f9565b9150614d17828561480e565b9150614d22826149f9565b9150614d2e828461480e565b9150819050949350505050565b6000614d47828561480e565b9150614d52826149f9565b9150614d5e828461483f565b91508190509392505050565b6000614d75826148be565b9150614d81828561480e565b9150614d8c82614b57565b9150614d98828461480e565b9150614da382614a85565b91508190509392505050565b6000614dba82614b9f565b9150614dc6828461480e565b915081905092915050565b6000602082019050614de6600083018461476f565b92915050565b6000608082019050614e01600083018761476f565b614e0e602083018661476f565b614e1b6040830185614c2b565b8181036060830152614e2d818461478d565b905095945050505050565b6000602082019050614e4d600083018461477e565b92915050565b6000602082019050614e6860008301846147c6565b92915050565b60006020820190508181036000830152614e8881846147d5565b905092915050565b60006020820190508181036000830152614ea9816148e1565b9050919050565b60006020820190508181036000830152614ec981614904565b9050919050565b60006020820190508181036000830152614ee981614927565b9050919050565b60006020820190508181036000830152614f098161494a565b9050919050565b60006020820190508181036000830152614f298161496d565b9050919050565b60006020820190508181036000830152614f4981614990565b9050919050565b60006020820190508181036000830152614f69816149b3565b9050919050565b60006020820190508181036000830152614f89816149d6565b9050919050565b60006020820190508181036000830152614fa981614a1c565b9050919050565b60006020820190508181036000830152614fc981614a3f565b9050919050565b60006020820190508181036000830152614fe981614a62565b9050919050565b6000602082019050818103600083015261500981614aa8565b9050919050565b6000602082019050818103600083015261502981614acb565b9050919050565b6000602082019050818103600083015261504981614aee565b9050919050565b6000602082019050818103600083015261506981614b11565b9050919050565b6000602082019050818103600083015261508981614b34565b9050919050565b600060208201905081810360008301526150a981614b7c565b9050919050565b600060208201905081810360008301526150c981614bc2565b9050919050565b600060208201905081810360008301526150e981614be5565b9050919050565b6000602082019050818103600083015261510981614c08565b9050919050565b60006020820190506151256000830184614c2b565b92915050565b6000615135615146565b90506151418282615426565b919050565b6000604051905090565b600067ffffffffffffffff82111561516b5761516a61555e565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151975761519661555e565b5b6151a08261558d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061521082615384565b915061521b83615384565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152505761524f6154d1565b5b828201905092915050565b600061526682615384565b915061527183615384565b92508261528157615280615500565b5b828204905092915050565b600061529782615384565b91506152a283615384565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152db576152da6154d1565b5b828202905092915050565b60006152f182615384565b91506152fc83615384565b92508282101561530f5761530e6154d1565b5b828203905092915050565b600061532582615364565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000615399826153a0565b9050919050565b60006153ab82615364565b9050919050565b82818337600083830152505050565b60005b838110156153df5780820151818401526020810190506153c4565b838111156153ee576000848401525b50505050565b6000600282049050600182168061540c57607f821691505b602082108114156154205761541f61552f565b5b50919050565b61542f8261558d565b810181811067ffffffffffffffff8211171561544e5761544d61555e565b5b80604052505050565b600061546282615384565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615495576154946154d1565b5b600182019050919050565b60006154ab82615384565b91506154b683615384565b9250826154c6576154c5615500565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f7b226e616d65223a2022446f6767202300000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f66207468697320426c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022426c6f6f7420446f676773206160008201527f72652072616e646f6d697a65642c2067656e65726174656420616e642073746f60208201527f726564206f6e20636861696e2e20496d6167657320616e64206f74686572206660408201527f756e6374696f6e616c6974792061726520696e74656e74696f6e616c6c79206f60608201527f6d697474656420666f72206f746865727320746f20696e746572707265742e2060808201527f4665656c206672656520746f2075736520426c6f6f7420446f67677320696e2060a08201527f616e792077617920796f752077616e742e20496e73706972656420627920616e60c08201527f6420636f6d70617469626c65207769746820426c6f6f742e222c2022696d616760e08201527f65223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c0061010082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615cc78161531a565b8114615cd257600080fd5b50565b615cde8161532c565b8114615ce957600080fd5b50565b615cf581615338565b8114615d0057600080fd5b50565b615d0c81615384565b8114615d1757600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220b41f8174808965a7dedfe0d81c8acf52bf38078bd702fc9322806479a7430ba764736f6c63430008040033

Deployed Bytecode Sourcemap

44556:15006:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38298:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25426:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26985:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26508:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44650:71;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38938:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27875:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38606:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44728:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53352:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28285:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53769:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39128:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25120:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58465:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53904:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53088:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24850:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9890:94;;;:::i;:::-;;9239:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25595:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57903:276;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57719:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27278:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58187:270;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28541:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54048:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55138:2573;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53490:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53217:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27644:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53628:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10139:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38298:224;38400:4;38439:35;38424:50;;;:11;:50;;;;:90;;;;38478:36;38502:11;38478:23;:36::i;:::-;38424:90;38417:97;;38298:224;;;:::o;25426:100::-;25480:13;25513:5;25506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25426:100;:::o;26985:221::-;27061:7;27089:16;27097:7;27089;:16::i;:::-;27081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27174:15;:24;27190:7;27174:24;;;;;;;;;;;;;;;;;;;;;27167:31;;26985:221;;;:::o;26508:411::-;26589:13;26605:23;26620:7;26605:14;:23::i;:::-;26589:39;;26653:5;26647:11;;:2;:11;;;;26639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26747:5;26731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26756:37;26773:5;26780:12;:10;:12::i;:::-;26756:16;:37::i;:::-;26731:62;26709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26890:21;26899:2;26903:7;26890:8;:21::i;:::-;26508:411;;;:::o;44650:71::-;;;;;;;;;;;;;:::o;38938:113::-;38999:7;39026:10;:17;;;;39019:24;;38938:113;:::o;27875:339::-;28070:41;28089:12;:10;:12::i;:::-;28103:7;28070:18;:41::i;:::-;28062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28178:28;28188:4;28194:2;28198:7;28178:9;:28::i;:::-;27875:339;;;:::o;38606:256::-;38703:7;38739:23;38756:5;38739:16;:23::i;:::-;38731:5;:31;38723:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38828:12;:19;38841:5;38828:19;;;;;;;;;;;;;;;:26;38848:5;38828:26;;;;;;;;;;;;38821:33;;38606:256;;;;:::o;44728:62::-;;;;;;;;;;;;;:::o;53352:130::-;53409:13;53442:32;53448:7;53442:32;;;;;;;;;;;;;;;;;53467:6;53442:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;53435:39;;53352:130;;;:::o;28285:185::-;28423:39;28440:4;28446:2;28450:7;28423:39;;;;;;;;;;;;:16;:39::i;:::-;28285:185;;;:::o;53769:127::-;53825:13;53858:30;53864:7;53858:30;;;;;;;;;;;;;;;;;53882:5;53858:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;53851:37;;53769:127;;;:::o;39128:233::-;39203:7;39239:30;:28;:30::i;:::-;39231:5;:38;39223:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39336:10;39347:5;39336:17;;;;;;;;;;;;;;;;;;;;;;;;39329:24;;39128:233;;;:::o;25120:239::-;25192:7;25212:13;25228:7;:16;25236:7;25228:16;;;;;;;;;;;;;;;;;;;;;25212:32;;25280:1;25263:19;;:5;:19;;;;25255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25346:5;25339:12;;;25120:239;;;:::o;58465:300::-;12170:1;12766:7;;:19;;12758:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12170:1;12899:7;:18;;;;58555:9:::1;58550:208;58574:7;:14;58570:1;:18;58550:208;;;58654:10;58618:46;;:12;;;;;;;;;;;:20;;;58639:7;58647:1;58639:10;;;;;;;;;;;;;;;;;;;;;;58618:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:46;;;58610:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;58711:35;58721:12;:10;:12::i;:::-;58735:7;58743:1;58735:10;;;;;;;;;;;;;;;;;;;;;;58711:9;:35::i;:::-;58590:3;;;;;:::i;:::-;;;;58550:208;;;;12126:1:::0;13078:7;:22;;;;58465:300;:::o;53904:136::-;53963:13;53996:36;54002:7;53996:36;;;;;;;;;;;;;;;;;54023:8;53996:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;:::-;53989:43;;53904:136;;;:::o;53088:121::-;53142:13;53175:26;53181:7;53175:26;;;;;;;;;;;;;;;;;53197:3;53175:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:26::i;:::-;53168:33;;53088:121;;;:::o;24850:208::-;24922:7;24967:1;24950:19;;:5;:19;;;;24942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25034:9;:16;25044:5;25034:16;;;;;;;;;;;;;;;;25027:23;;24850:208;;;:::o;9890:94::-;9470:12;:10;:12::i;:::-;9459:23;;:7;:5;:7::i;:::-;:23;;;9451:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9955:21:::1;9973:1;9955:9;:21::i;:::-;9890:94::o:0;9239:87::-;9285:7;9312:6;;;;;;;;;;;9305:13;;9239:87;:::o;25595:104::-;25651:13;25684:7;25677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25595:104;:::o;57903:276::-;12170:1;12766:7;;:19;;12758:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12170:1;12899:7;:18;;;;57985:9:::1;57980:192;58004:8;:15;58000:1;:19;57980:192;;;58063:4;58049:8;58058:1;58049:11;;;;;;;;;;;;;;;;;;;;;;:18;:41;;;;;58085:5;58071:8;58080:1;58071:11;;;;;;;;;;;;;;;;;;;;;;:19;58049:41;58041:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58126:34;58136:10;58148:8;58157:1;58148:11;;;;;;;;;;;;;;;;;;;;;;58126:9;:34::i;:::-;58021:3;;;;;:::i;:::-;;;;57980:192;;;;12126:1:::0;13078:7;:22;;;;57903:276;:::o;57719:176::-;12170:1;12766:7;;:19;;12758:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12170:1;12899:7;:18;;;;57799:4:::1;57789:7;:14;:34;;;;;57818:5;57807:7;:16;;57789:34;57781:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57855:32;57865:12;:10;:12::i;:::-;57879:7;57855:9;:32::i;:::-;12126:1:::0;13078:7;:22;;;;57719:176;:::o;27278:295::-;27393:12;:10;:12::i;:::-;27381:24;;:8;:24;;;;27373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27493:8;27448:18;:32;27467:12;:10;:12::i;:::-;27448:32;;;;;;;;;;;;;;;:42;27481:8;27448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27546:8;27517:48;;27532:12;:10;:12::i;:::-;27517:48;;;27556:8;27517:48;;;;;;:::i;:::-;;;;;;;;27278:295;;:::o;58187:270::-;12170:1;12766:7;;:19;;12758:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12170:1;12899:7;:18;;;;58274:1:::1;58265:6;:10;:28;;;;;58289:4;58279:6;:14;;58265:28;58257:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58365:10;58333:42;;:12;;;;;;;;;;;:20;;;58354:6;58333:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;58325:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58418:31;58428:12;:10;:12::i;:::-;58442:6;58418:9;:31::i;:::-;12126:1:::0;13078:7;:22;;;;58187:270;:::o;28541:328::-;28716:41;28735:12;:10;:12::i;:::-;28749:7;28716:18;:41::i;:::-;28708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28822:39;28836:4;28842:2;28846:7;28855:5;28822:13;:39::i;:::-;28541:328;;;;:::o;54048:124::-;54103:13;54136:28;54142:7;54136:28;;;;;;;;;;;;;;;;;54159:4;54136:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:28::i;:::-;54129:35;;54048:124;;;:::o;55138:2573::-;55203:13;55229:23;;:::i;:::-;55263:292;;;;;;;;;;;;;;;;;:5;55283:1;55263:32;;;;;;;;;;;;;;;;;;:292;;;;55579:15;55586:7;55579:6;:15::i;:::-;55568:5;55574:1;55568:8;;;;;;;;;;;;;;;;;;:26;;;;55607:53;;;;;;;;;;;;;;;;;:5;55613:1;55607:8;;;;;;;;;;;;;;;;;;:53;;;;55684:17;55693:7;55684:8;:17::i;:::-;55673:5;55679:1;55673:8;;;;;;;;;;;;;;;;;;:28;;;;55714:53;;;;;;;;;;;;;;;;;:5;55720:1;55714:8;;;;;;;;;;;;;;;;;;:53;;;;55791:18;55801:7;55791:9;:18::i;:::-;55780:5;55786:1;55780:8;;;;;;;;;;;;;;;;;;:29;;;;55822:53;;;;;;;;;;;;;;;;;:5;55828:1;55822:8;;;;;;;;;;;;;;;;;;:53;;;;55899:18;55909:7;55899:9;:18::i;:::-;55888:5;55894:1;55888:8;;;;;;;;;;;;;;;;;;:29;;;;55930:54;;;;;;;;;;;;;;;;;:5;55936:1;55930:8;;;;;;;;;;;;;;;;;;:54;;;;56008:19;56019:7;56008:10;:19::i;:::-;55997:5;56003:1;55997:8;;;;;;;;;;;;;;;;;;:30;;;;56040:55;;;;;;;;;;;;;;;;;:5;56046:2;56040:9;;;;;;;;;;;;;;;;;;:55;;;;56120:17;56129:7;56120:8;:17::i;:::-;56108:5;56114:2;56108:9;;;;;;;;;;;;;;;;;;:29;;;;56150:55;;;;;;;;;;;;;;;;;:5;56156:2;56150:9;;;;;;;;;;;;;;;;;;:55;;;;56230:20;56242:7;56230:11;:20::i;:::-;56218:5;56224:2;56218:9;;;;;;;;;;;;;;;;;;:32;;;;56263:55;;;;;;;;;;;;;;;;;:5;56269:2;56263:9;;;;;;;;;;;;;;;;;;:55;;;;56343:16;56351:7;56343;:16::i;:::-;56331:5;56337:2;56331:9;;;;;;;;;;;;;;;;;;:28;;;;56372:27;;;;;;;;;;;;;;;;;:5;56378:2;56372:9;;;;;;;;;;;;;;;;;;:27;;;;56412:20;56473:5;56479:1;56473:8;;;;;;;;;;;;;;;;;;;56483:5;56489:1;56483:8;;;;;;;;;;;;;;;;;;;56493:5;56499:1;56493:8;;;;;;;;;;;;;;;;;;;56503:5;56509:1;56503:8;;;;;;;;;;;;;;;;;;;56513:5;56519:1;56513:8;;;;;;;;;;;;;;;;;;;56523:5;56529:1;56523:8;;;;;;;;;;;;;;;;;;;56533:5;56539:1;56533:8;;;;;;;;;;;;;;;;;;;56543:5;56549:1;56543:8;;;;;;;;;;;;;;;;;;;56553:5;56559:1;56553:8;;;;;;;;;;;;;;;;;;;56456:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56412:161;;56649:6;56674:5;56680:1;56674:8;;;;;;;;;;;;;;;;;;;56701:5;56707:2;56701:9;;;;;;;;;;;;;;;;;;;56729:5;56735:2;56729:9;;;;;;;;;;;;;;;;;;;56757:5;56763:2;56757:9;;;;;;;;;;;;;;;;;;;56785:5;56791:2;56785:9;;;;;;;;;;;;;;;;;;;56813:5;56819:2;56813:9;;;;;;;;;;;;;;;;;;;56841:5;56847:2;56841:9;;;;;;;;;;;;;;;;;;;56869:5;56875:2;56869:9;;;;;;;;;;;;;;;;;;;56614:279;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56584:320;;56917:18;56938:656;57107:17;57116:7;57107:8;:17::i;:::-;57467:28;57487:6;57467:13;:28::i;:::-;57019:530;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56938:13;:656::i;:::-;56917:677;;57671:4;57621:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;57605:72;;57697:6;57690:13;;;;;55138:2573;;;:::o;53490:130::-;53547:13;53580:32;53586:7;53580:32;;;;;;;;;;;;;;;;;53605:6;53580:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;53573:39;;53490:130;;;:::o;53217:127::-;53273:13;53306:30;53312:7;53306:30;;;;;;;;;;;;;;;;;53330:5;53306:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;53299:37;;53217:127;;;:::o;27644:164::-;27741:4;27765:18;:25;27784:5;27765:25;;;;;;;;;;;;;;;:35;27791:8;27765:35;;;;;;;;;;;;;;;;;;;;;;;;;27758:42;;27644:164;;;;:::o;53628:133::-;53686:13;53719:34;53725:7;53719:34;;;;;;;;;;;;;;;;;53745:7;53719:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:34::i;:::-;53712:41;;53628:133;;;:::o;10139:192::-;9470:12;:10;:12::i;:::-;9459:23;;:7;:5;:7::i;:::-;:23;;;9451:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10248:1:::1;10228:22;;:8;:22;;;;10220:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:19;10314:8;10304:9;:19::i;:::-;10139:192:::0;:::o;24481:305::-;24583:4;24635:25;24620:40;;;:11;:40;;;;:105;;;;24692:33;24677:48;;;:11;:48;;;;24620:105;:158;;;;24742:36;24766:11;24742:23;:36::i;:::-;24620:158;24600:178;;24481:305;;;:::o;30379:127::-;30444:4;30496:1;30468:30;;:7;:16;30476:7;30468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30461:37;;30379:127;;;:::o;8115:98::-;8168:7;8195:10;8188:17;;8115:98;:::o;34361:174::-;34463:2;34436:15;:24;34452:7;34436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34519:7;34515:2;34481:46;;34490:23;34505:7;34490:14;:23::i;:::-;34481:46;;;;;;;;;;;;34361:174;;:::o;30673:348::-;30766:4;30791:16;30799:7;30791;:16::i;:::-;30783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30867:13;30883:23;30898:7;30883:14;:23::i;:::-;30867:39;;30936:5;30925:16;;:7;:16;;;:51;;;;30969:7;30945:31;;:20;30957:7;30945:11;:20::i;:::-;:31;;;30925:51;:87;;;;30980:32;30997:5;31004:7;30980:16;:32::i;:::-;30925:87;30917:96;;;30673:348;;;;:::o;33665:578::-;33824:4;33797:31;;:23;33812:7;33797:14;:23::i;:::-;:31;;;33789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33907:1;33893:16;;:2;:16;;;;33885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33963:39;33984:4;33990:2;33994:7;33963:20;:39::i;:::-;34067:29;34084:1;34088:7;34067:8;:29::i;:::-;34128:1;34109:9;:15;34119:4;34109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34157:1;34140:9;:13;34150:2;34140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34188:2;34169:7;:16;34177:7;34169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34227:7;34223:2;34208:27;;34217:4;34208:27;;;;;;;;;;;;33665:578;;;:::o;54180:950::-;54323:13;54349:12;54364:62;54395:9;54406:17;54415:7;54406:8;:17::i;:::-;54378:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54364:6;:62::i;:::-;54349:77;;54437:20;54460:11;54479;:18;54472:4;:25;;;;:::i;:::-;54460:38;;;;;;;;;;;;;;;;;;;;;;54437:61;;54509:17;54536:2;54529:4;:9;;;;:::i;:::-;54509:29;;54597:16;54582:9;54565:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;54555:38;;;;;;:58;:76;;;;;54629:2;54617:9;:14;54555:76;54551:346;;;54648:21;;:::i;:::-;54694:12;54714;:19;;;;54707:4;:26;;;;:::i;:::-;54694:40;;;;;;;;;;;;;;;;;;;;;;;54684:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;54689:1;54684:7;;;;;;;;;;;;;;;;;;:50;;;;54759:12;54779;:19;;;;54772:4;:26;;;;:::i;:::-;54759:40;;;;;;;;;;;;;;;;;;;;;;;54749:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;54754:1;54749:7;;;;;;;;;;;;;;;;;;:50;;;;54847:4;54852:1;54847:7;;;;;;;;;;;;;;;;;;;54861:6;54874:4;54879:1;54874:7;;;;;;;;;;;;;;;;;;;54830:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54814:69;;54551:346;;54953:18;54938:9;54921:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;54911:38;;;;;;:60;:79;;;;;54988:2;54975:9;:15;;54911:79;54907:192;;;55040:6;55053:8;55069;:15;;;;55062:4;:22;;;;:::i;:::-;55053:32;;;;;;;;;;;;;;;;;;;;;;;55023:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55007:80;;54907:192;55116:6;55109:13;;;;;54180:950;;;;;:::o;31363:110::-;31439:26;31449:2;31453:7;31439:26;;;;;;;;;;;;:9;:26::i;:::-;31363:110;;:::o;10339:173::-;10395:16;10414:6;;;;;;;;;;;10395:25;;10440:8;10431:6;;:17;;;;;;;;;;;;;;;;;;10495:8;10464:40;;10485:8;10464:40;;;;;;;;;;;;10339:173;;:::o;29751:315::-;29908:28;29918:4;29924:2;29928:7;29908:9;:28::i;:::-;29955:48;29978:4;29984:2;29988:7;29997:5;29955:22;:48::i;:::-;29947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29751:315;;;;:::o;58773:723::-;58829:13;59059:1;59050:5;:10;59046:53;;;59077:10;;;;;;;;;;;;;;;;;;;;;59046:53;59109:12;59124:5;59109:20;;59140:14;59165:78;59180:1;59172:4;:9;59165:78;;59198:8;;;;;:::i;:::-;;;;59229:2;59221:10;;;;;:::i;:::-;;;59165:78;;;59253:19;59285:6;59275:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59253:39;;59303:154;59319:1;59310:5;:10;59303:154;;59347:1;59337:11;;;;;:::i;:::-;;;59414:2;59406:5;:10;;;;:::i;:::-;59393:2;:24;;;;:::i;:::-;59380:39;;59363:6;59370;59363:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;59443:2;59434:11;;;;;:::i;:::-;;;59303:154;;;59481:6;59467:21;;;;;58773:723;;;;:::o;59913:1607::-;59971:13;59997:11;60011:4;:11;59997:25;;60044:1;60037:3;:8;60033:23;;;60047:9;;;;;;;;;;;;;;;;;60033:23;60108:18;60146:1;60141;60135:3;:7;;;;:::i;:::-;60134:13;;;;:::i;:::-;60129:1;:19;;;;:::i;:::-;60108:40;;60206:19;60251:2;60238:10;:15;;;;:::i;:::-;60228:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60206:48;;60267:18;60288:5;;;;;;;;;;;;;;;;;60267:26;;60357:1;60350:5;60346:13;60402:2;60394:6;60390:15;60453:1;60421:777;60476:3;60473:1;60470:10;60421:777;;;60531:1;60528;60524:9;60519:14;;60589:8;60584:1;60578:4;60574:12;60568:19;60564:34;60669:4;60661:5;60657:2;60653:14;60649:25;60639:8;60635:40;60629:47;60708:3;60705:1;60701:11;60694:18;;60799:4;60790;60782:5;60778:2;60774:14;60770:25;60760:8;60756:40;60750:47;60746:58;60741:3;60737:68;60730:75;;60837:3;60834:1;60830:11;60823:18;;60927:4;60918;60910:5;60907:1;60903:13;60899:24;60889:8;60885:39;60879:46;60875:57;60870:3;60866:67;60859:74;;60965:3;60962:1;60958:11;60951:18;;61047:4;61038;61031:5;61027:16;61017:8;61013:31;61007:38;61003:49;60998:3;60994:59;60987:66;;61087:3;61082;61078:13;61071:20;;61129:3;61118:9;61111:22;61181:1;61170:9;61166:17;61153:30;;60500:698;;60421:777;;;60425:44;61230:1;61225:3;61221:11;61251:1;61246:84;;;;61349:1;61344:82;;;;61214:212;;61246:84;61307:6;61302:3;61298:16;61294:1;61283:9;61279:17;61272:43;61246:84;;61344:82;61405:4;61400:3;61396:14;61392:1;61381:9;61377:17;61370:41;61214:212;;61457:10;61449:6;61442:26;60315:1164;;61505:6;61491:21;;;;;;59913:1607;;;;:::o;23090:157::-;23175:4;23214:25;23199:40;;;:11;:40;;;;23192:47;;23090:157;;;:::o;39974:589::-;40118:45;40145:4;40151:2;40155:7;40118:26;:45::i;:::-;40196:1;40180:18;;:4;:18;;;40176:187;;;40215:40;40247:7;40215:31;:40::i;:::-;40176:187;;;40285:2;40277:10;;:4;:10;;;40273:90;;40304:47;40337:4;40343:7;40304:32;:47::i;:::-;40273:90;40176:187;40391:1;40377:16;;:2;:16;;;40373:183;;;40410:45;40447:7;40410:36;:45::i;:::-;40373:183;;;40483:4;40477:10;;:2;:10;;;40473:83;;40504:40;40532:2;40536:7;40504:27;:40::i;:::-;40473:83;40373:183;39974:589;;;:::o;52942:138::-;53002:7;53064:5;53047:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;53037:34;;;;;;53029:43;;53022:50;;52942:138;;;:::o;31700:321::-;31830:18;31836:2;31840:7;31830:5;:18::i;:::-;31881:54;31912:1;31916:2;31920:7;31929:5;31881:22;:54::i;:::-;31859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31700:321;;;:::o;35100:803::-;35255:4;35276:15;:2;:13;;;:15::i;:::-;35272:624;;;35328:2;35312:36;;;35349:12;:10;:12::i;:::-;35363:4;35369:7;35378:5;35312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35575:1;35558:6;:13;:18;35554:272;;;35601:60;;;;;;;;;;:::i;:::-;;;;;;;;35554:272;35776:6;35770:13;35761:6;35757:2;35753:15;35746:38;35308:533;35445:45;;;35435:55;;;:6;:55;;;;35428:62;;;;;35272:624;35880:4;35873:11;;35100:803;;;;;;;:::o;36475:126::-;;;;:::o;41286:164::-;41390:10;:17;;;;41363:15;:24;41379:7;41363:24;;;;;;;;;;;:44;;;;41418:10;41434:7;41418:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41286:164;:::o;42077:988::-;42343:22;42393:1;42368:22;42385:4;42368:16;:22::i;:::-;:26;;;;:::i;:::-;42343:51;;42405:18;42426:17;:26;42444:7;42426:26;;;;;;;;;;;;42405:47;;42573:14;42559:10;:28;42555:328;;42604:19;42626:12;:18;42639:4;42626:18;;;;;;;;;;;;;;;:34;42645:14;42626:34;;;;;;;;;;;;42604:56;;42710:11;42677:12;:18;42690:4;42677:18;;;;;;;;;;;;;;;:30;42696:10;42677:30;;;;;;;;;;;:44;;;;42827:10;42794:17;:30;42812:11;42794:30;;;;;;;;;;;:43;;;;42555:328;;42979:17;:26;42997:7;42979:26;;;;;;;;;;;42972:33;;;43023:12;:18;43036:4;43023:18;;;;;;;;;;;;;;;:34;43042:14;43023:34;;;;;;;;;;;43016:41;;;42077:988;;;;:::o;43360:1079::-;43613:22;43658:1;43638:10;:17;;;;:21;;;;:::i;:::-;43613:46;;43670:18;43691:15;:24;43707:7;43691:24;;;;;;;;;;;;43670:45;;44042:19;44064:10;44075:14;44064:26;;;;;;;;;;;;;;;;;;;;;;;;44042:48;;44128:11;44103:10;44114;44103:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44239:10;44208:15;:28;44224:11;44208:28;;;;;;;;;;;:41;;;;44380:15;:24;44396:7;44380:24;;;;;;;;;;;44373:31;;;44415:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43360:1079;;;;:::o;40864:221::-;40949:14;40966:20;40983:2;40966:16;:20::i;:::-;40949:37;;41024:7;40997:12;:16;41010:2;40997:16;;;;;;;;;;;;;;;:24;41014:6;40997:24;;;;;;;;;;;:34;;;;41071:6;41042:17;:26;41060:7;41042:26;;;;;;;;;;;:35;;;;40864:221;;;:::o;32357:382::-;32451:1;32437:16;;:2;:16;;;;32429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32510:16;32518:7;32510;:16::i;:::-;32509:17;32501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32572:45;32601:1;32605:2;32609:7;32572:20;:45::i;:::-;32647:1;32630:9;:13;32640:2;32630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32678:2;32659:7;:16;32667:7;32659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32723:7;32719:2;32698:33;;32715:1;32698:33;;;;;;;;;;;;32357:382;;:::o;15278:387::-;15338:4;15546:12;15613:7;15601:20;15593:28;;15656:1;15649:4;:8;15642:15;;;15278:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1179:143::-;1236:5;1267:6;1261:13;1252:22;;1283:33;1310:5;1283:33;:::i;:::-;1242:80;;;;:::o;1345:303::-;1416:5;1465:3;1458:4;1450:6;1446:17;1442:27;1432:2;;1483:1;1480;1473:12;1432:2;1523:6;1510:20;1548:94;1638:3;1630:6;1623:4;1615:6;1611:17;1548:94;:::i;:::-;1539:103;;1422:226;;;;;:::o;1654:133::-;1697:5;1735:6;1722:20;1713:29;;1751:30;1775:5;1751:30;:::i;:::-;1703:84;;;;:::o;1793:137::-;1838:5;1876:6;1863:20;1854:29;;1892:32;1918:5;1892:32;:::i;:::-;1844:86;;;;:::o;1936:141::-;1992:5;2023:6;2017:13;2008:22;;2039:32;2065:5;2039:32;:::i;:::-;1998:79;;;;:::o;2096:271::-;2151:5;2200:3;2193:4;2185:6;2181:17;2177:27;2167:2;;2218:1;2215;2208:12;2167:2;2258:6;2245:20;2283:78;2357:3;2349:6;2342:4;2334:6;2330:17;2283:78;:::i;:::-;2274:87;;2157:210;;;;;:::o;2373:139::-;2419:5;2457:6;2444:20;2435:29;;2473:33;2500:5;2473:33;:::i;:::-;2425:87;;;;:::o;2518:262::-;2577:6;2626:2;2614:9;2605:7;2601:23;2597:32;2594:2;;;2642:1;2639;2632:12;2594:2;2685:1;2710:53;2755:7;2746:6;2735:9;2731:22;2710:53;:::i;:::-;2700:63;;2656:117;2584:196;;;;:::o;2786:284::-;2856:6;2905:2;2893:9;2884:7;2880:23;2876:32;2873:2;;;2921:1;2918;2911:12;2873:2;2964:1;2989:64;3045:7;3036:6;3025:9;3021:22;2989:64;:::i;:::-;2979:74;;2935:128;2863:207;;;;:::o;3076:407::-;3144:6;3152;3201:2;3189:9;3180:7;3176:23;3172:32;3169:2;;;3217:1;3214;3207:12;3169:2;3260:1;3285:53;3330:7;3321:6;3310:9;3306:22;3285:53;:::i;:::-;3275:63;;3231:117;3387:2;3413:53;3458:7;3449:6;3438:9;3434:22;3413:53;:::i;:::-;3403:63;;3358:118;3159:324;;;;;:::o;3489:552::-;3566:6;3574;3582;3631:2;3619:9;3610:7;3606:23;3602:32;3599:2;;;3647:1;3644;3637:12;3599:2;3690:1;3715:53;3760:7;3751:6;3740:9;3736:22;3715:53;:::i;:::-;3705:63;;3661:117;3817:2;3843:53;3888:7;3879:6;3868:9;3864:22;3843:53;:::i;:::-;3833:63;;3788:118;3945:2;3971:53;4016:7;4007:6;3996:9;3992:22;3971:53;:::i;:::-;3961:63;;3916:118;3589:452;;;;;:::o;4047:809::-;4142:6;4150;4158;4166;4215:3;4203:9;4194:7;4190:23;4186:33;4183:2;;;4232:1;4229;4222:12;4183:2;4275:1;4300:53;4345:7;4336:6;4325:9;4321:22;4300:53;:::i;:::-;4290:63;;4246:117;4402:2;4428:53;4473:7;4464:6;4453:9;4449:22;4428:53;:::i;:::-;4418:63;;4373:118;4530:2;4556:53;4601:7;4592:6;4581:9;4577:22;4556:53;:::i;:::-;4546:63;;4501:118;4686:2;4675:9;4671:18;4658:32;4717:18;4709:6;4706:30;4703:2;;;4749:1;4746;4739:12;4703:2;4777:62;4831:7;4822:6;4811:9;4807:22;4777:62;:::i;:::-;4767:72;;4629:220;4173:683;;;;;;;:::o;4862:401::-;4927:6;4935;4984:2;4972:9;4963:7;4959:23;4955:32;4952:2;;;5000:1;4997;4990:12;4952:2;5043:1;5068:53;5113:7;5104:6;5093:9;5089:22;5068:53;:::i;:::-;5058:63;;5014:117;5170:2;5196:50;5238:7;5229:6;5218:9;5214:22;5196:50;:::i;:::-;5186:60;;5141:115;4942:321;;;;;:::o;5269:407::-;5337:6;5345;5394:2;5382:9;5373:7;5369:23;5365:32;5362:2;;;5410:1;5407;5400:12;5362:2;5453:1;5478:53;5523:7;5514:6;5503:9;5499:22;5478:53;:::i;:::-;5468:63;;5424:117;5580:2;5606:53;5651:7;5642:6;5631:9;5627:22;5606:53;:::i;:::-;5596:63;;5551:118;5352:324;;;;;:::o;5682:405::-;5766:6;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:78;6062:7;6053:6;6042:9;6038:22;5992:78;:::i;:::-;5982:88;;5845:235;5773:314;;;;:::o;6093:260::-;6151:6;6200:2;6188:9;6179:7;6175:23;6171:32;6168:2;;;6216:1;6213;6206:12;6168:2;6259:1;6284:52;6328:7;6319:6;6308:9;6304:22;6284:52;:::i;:::-;6274:62;;6230:116;6158:195;;;;:::o;6359:282::-;6428:6;6477:2;6465:9;6456:7;6452:23;6448:32;6445:2;;;6493:1;6490;6483:12;6445:2;6536:1;6561:63;6616:7;6607:6;6596:9;6592:22;6561:63;:::i;:::-;6551:73;;6507:127;6435:206;;;;:::o;6647:262::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:2;;;6771:1;6768;6761:12;6723:2;6814:1;6839:53;6884:7;6875:6;6864:9;6860:22;6839:53;:::i;:::-;6829:63;;6785:117;6713:196;;;;:::o;6915:118::-;7002:24;7020:5;7002:24;:::i;:::-;6997:3;6990:37;6980:53;;:::o;7039:109::-;7120:21;7135:5;7120:21;:::i;:::-;7115:3;7108:34;7098:50;;:::o;7154:360::-;7240:3;7268:38;7300:5;7268:38;:::i;:::-;7322:70;7385:6;7380:3;7322:70;:::i;:::-;7315:77;;7401:52;7446:6;7441:3;7434:4;7427:5;7423:16;7401:52;:::i;:::-;7478:29;7500:6;7478:29;:::i;:::-;7473:3;7469:39;7462:46;;7244:270;;;;;:::o;7520:175::-;7629:59;7682:5;7629:59;:::i;:::-;7624:3;7617:72;7607:88;;:::o;7701:364::-;7789:3;7817:39;7850:5;7817:39;:::i;:::-;7872:71;7936:6;7931:3;7872:71;:::i;:::-;7865:78;;7952:52;7997:6;7992:3;7985:4;7978:5;7974:16;7952:52;:::i;:::-;8029:29;8051:6;8029:29;:::i;:::-;8024:3;8020:39;8013:46;;7793:272;;;;;:::o;8071:377::-;8177:3;8205:39;8238:5;8205:39;:::i;:::-;8260:89;8342:6;8337:3;8260:89;:::i;:::-;8253:96;;8358:52;8403:6;8398:3;8391:4;8384:5;8380:16;8358:52;:::i;:::-;8435:6;8430:3;8426:16;8419:23;;8181:267;;;;;:::o;8478:845::-;8581:3;8618:5;8612:12;8647:36;8673:9;8647:36;:::i;:::-;8699:89;8781:6;8776:3;8699:89;:::i;:::-;8692:96;;8819:1;8808:9;8804:17;8835:1;8830:137;;;;8981:1;8976:341;;;;8797:520;;8830:137;8914:4;8910:9;8899;8895:25;8890:3;8883:38;8950:6;8945:3;8941:16;8934:23;;8830:137;;8976:341;9043:38;9075:5;9043:38;:::i;:::-;9103:1;9117:154;9131:6;9128:1;9125:13;9117:154;;;9205:7;9199:14;9195:1;9190:3;9186:11;9179:35;9255:1;9246:7;9242:15;9231:26;;9153:4;9150:1;9146:12;9141:17;;9117:154;;;9300:6;9295:3;9291:16;9284:23;;8983:334;;8797:520;;8585:738;;;;;;:::o;9329:402::-;9489:3;9510:85;9592:2;9587:3;9510:85;:::i;:::-;9503:92;;9604:93;9693:3;9604:93;:::i;:::-;9722:2;9717:3;9713:12;9706:19;;9493:238;;;:::o;9737:366::-;9879:3;9900:67;9964:2;9959:3;9900:67;:::i;:::-;9893:74;;9976:93;10065:3;9976:93;:::i;:::-;10094:2;10089:3;10085:12;10078:19;;9883:220;;;:::o;10109:366::-;10251:3;10272:67;10336:2;10331:3;10272:67;:::i;:::-;10265:74;;10348:93;10437:3;10348:93;:::i;:::-;10466:2;10461:3;10457:12;10450:19;;10255:220;;;:::o;10481:366::-;10623:3;10644:67;10708:2;10703:3;10644:67;:::i;:::-;10637:74;;10720:93;10809:3;10720:93;:::i;:::-;10838:2;10833:3;10829:12;10822:19;;10627:220;;;:::o;10853:366::-;10995:3;11016:67;11080:2;11075:3;11016:67;:::i;:::-;11009:74;;11092:93;11181:3;11092:93;:::i;:::-;11210:2;11205:3;11201:12;11194:19;;10999:220;;;:::o;11225:366::-;11367:3;11388:67;11452:2;11447:3;11388:67;:::i;:::-;11381:74;;11464:93;11553:3;11464:93;:::i;:::-;11582:2;11577:3;11573:12;11566:19;;11371:220;;;:::o;11597:366::-;11739:3;11760:67;11824:2;11819:3;11760:67;:::i;:::-;11753:74;;11836:93;11925:3;11836:93;:::i;:::-;11954:2;11949:3;11945:12;11938:19;;11743:220;;;:::o;11969:366::-;12111:3;12132:67;12196:2;12191:3;12132:67;:::i;:::-;12125:74;;12208:93;12297:3;12208:93;:::i;:::-;12326:2;12321:3;12317:12;12310:19;;12115:220;;;:::o;12341:366::-;12483:3;12504:67;12568:2;12563:3;12504:67;:::i;:::-;12497:74;;12580:93;12669:3;12580:93;:::i;:::-;12698:2;12693:3;12689:12;12682:19;;12487:220;;;:::o;12713:400::-;12873:3;12894:84;12976:1;12971:3;12894:84;:::i;:::-;12887:91;;12987:93;13076:3;12987:93;:::i;:::-;13105:1;13100:3;13096:11;13089:18;;12877:236;;;:::o;13119:366::-;13261:3;13282:67;13346:2;13341:3;13282:67;:::i;:::-;13275:74;;13358:93;13447:3;13358:93;:::i;:::-;13476:2;13471:3;13467:12;13460:19;;13265:220;;;:::o;13491:366::-;13633:3;13654:67;13718:2;13713:3;13654:67;:::i;:::-;13647:74;;13730:93;13819:3;13730:93;:::i;:::-;13848:2;13843:3;13839:12;13832:19;;13637:220;;;:::o;13863:366::-;14005:3;14026:67;14090:2;14085:3;14026:67;:::i;:::-;14019:74;;14102:93;14191:3;14102:93;:::i;:::-;14220:2;14215:3;14211:12;14204:19;;14009:220;;;:::o;14235:400::-;14395:3;14416:84;14498:1;14493:3;14416:84;:::i;:::-;14409:91;;14509:93;14598:3;14509:93;:::i;:::-;14627:1;14622:3;14618:11;14611:18;;14399:236;;;:::o;14641:366::-;14783:3;14804:67;14868:2;14863:3;14804:67;:::i;:::-;14797:74;;14880:93;14969:3;14880:93;:::i;:::-;14998:2;14993:3;14989:12;14982:19;;14787:220;;;:::o;15013:366::-;15155:3;15176:67;15240:2;15235:3;15176:67;:::i;:::-;15169:74;;15252:93;15341:3;15252:93;:::i;:::-;15370:2;15365:3;15361:12;15354:19;;15159:220;;;:::o;15385:366::-;15527:3;15548:67;15612:2;15607:3;15548:67;:::i;:::-;15541:74;;15624:93;15713:3;15624:93;:::i;:::-;15742:2;15737:3;15733:12;15726:19;;15531:220;;;:::o;15757:366::-;15899:3;15920:67;15984:2;15979:3;15920:67;:::i;:::-;15913:74;;15996:93;16085:3;15996:93;:::i;:::-;16114:2;16109:3;16105:12;16098:19;;15903:220;;;:::o;16129:366::-;16271:3;16292:67;16356:2;16351:3;16292:67;:::i;:::-;16285:74;;16368:93;16457:3;16368:93;:::i;:::-;16486:2;16481:3;16477:12;16470:19;;16275:220;;;:::o;16501:404::-;16661:3;16682:86;16764:3;16759;16682:86;:::i;:::-;16675:93;;16777;16866:3;16777:93;:::i;:::-;16895:3;16890;16886:13;16879:20;;16665:240;;;:::o;16911:366::-;17053:3;17074:67;17138:2;17133:3;17074:67;:::i;:::-;17067:74;;17150:93;17239:3;17150:93;:::i;:::-;17268:2;17263:3;17259:12;17252:19;;17057:220;;;:::o;17283:402::-;17443:3;17464:85;17546:2;17541:3;17464:85;:::i;:::-;17457:92;;17558:93;17647:3;17558:93;:::i;:::-;17676:2;17671:3;17667:12;17660:19;;17447:238;;;:::o;17691:366::-;17833:3;17854:67;17918:2;17913:3;17854:67;:::i;:::-;17847:74;;17930:93;18019:3;17930:93;:::i;:::-;18048:2;18043:3;18039:12;18032:19;;17837:220;;;:::o;18063:366::-;18205:3;18226:67;18290:2;18285:3;18226:67;:::i;:::-;18219:74;;18302:93;18391:3;18302:93;:::i;:::-;18420:2;18415:3;18411:12;18404:19;;18209:220;;;:::o;18435:366::-;18577:3;18598:67;18662:2;18657:3;18598:67;:::i;:::-;18591:74;;18674:93;18763:3;18674:93;:::i;:::-;18792:2;18787:3;18783:12;18776:19;;18581:220;;;:::o;18807:118::-;18894:24;18912:5;18894:24;:::i;:::-;18889:3;18882:37;18872:53;;:::o;18931:275::-;19063:3;19085:95;19176:3;19167:6;19085:95;:::i;:::-;19078:102;;19197:3;19190:10;;19067:139;;;;:::o;19212:435::-;19392:3;19414:95;19505:3;19496:6;19414:95;:::i;:::-;19407:102;;19526:95;19617:3;19608:6;19526:95;:::i;:::-;19519:102;;19638:3;19631:10;;19396:251;;;;;:::o;19653:1555::-;20169:3;20191:95;20282:3;20273:6;20191:95;:::i;:::-;20184:102;;20303:95;20394:3;20385:6;20303:95;:::i;:::-;20296:102;;20415:95;20506:3;20497:6;20415:95;:::i;:::-;20408:102;;20527:95;20618:3;20609:6;20527:95;:::i;:::-;20520:102;;20639:95;20730:3;20721:6;20639:95;:::i;:::-;20632:102;;20751:95;20842:3;20833:6;20751:95;:::i;:::-;20744:102;;20863:95;20954:3;20945:6;20863:95;:::i;:::-;20856:102;;20975:95;21066:3;21057:6;20975:95;:::i;:::-;20968:102;;21087:95;21178:3;21169:6;21087:95;:::i;:::-;21080:102;;21199:3;21192:10;;20173:1035;;;;;;;;;;;;:::o;21214:1127::-;21644:3;21666:95;21757:3;21748:6;21666:95;:::i;:::-;21659:102;;21778:148;21922:3;21778:148;:::i;:::-;21771:155;;21943:95;22034:3;22025:6;21943:95;:::i;:::-;21936:102;;22055:148;22199:3;22055:148;:::i;:::-;22048:155;;22220:95;22311:3;22302:6;22220:95;:::i;:::-;22213:102;;22332:3;22325:10;;21648:693;;;;;;:::o;22347:695::-;22625:3;22647:95;22738:3;22729:6;22647:95;:::i;:::-;22640:102;;22759:148;22903:3;22759:148;:::i;:::-;22752:155;;22924:92;23012:3;23003:6;22924:92;:::i;:::-;22917:99;;23033:3;23026:10;;22629:413;;;;;:::o;23048:1233::-;23531:3;23553:148;23697:3;23553:148;:::i;:::-;23546:155;;23718:95;23809:3;23800:6;23718:95;:::i;:::-;23711:102;;23830:148;23974:3;23830:148;:::i;:::-;23823:155;;23995:95;24086:3;24077:6;23995:95;:::i;:::-;23988:102;;24107:148;24251:3;24107:148;:::i;:::-;24100:155;;24272:3;24265:10;;23535:746;;;;;:::o;24287:541::-;24520:3;24542:148;24686:3;24542:148;:::i;:::-;24535:155;;24707:95;24798:3;24789:6;24707:95;:::i;:::-;24700:102;;24819:3;24812:10;;24524:304;;;;:::o;24834:222::-;24927:4;24965:2;24954:9;24950:18;24942:26;;24978:71;25046:1;25035:9;25031:17;25022:6;24978:71;:::i;:::-;24932:124;;;;:::o;25062:640::-;25257:4;25295:3;25284:9;25280:19;25272:27;;25309:71;25377:1;25366:9;25362:17;25353:6;25309:71;:::i;:::-;25390:72;25458:2;25447:9;25443:18;25434:6;25390:72;:::i;:::-;25472;25540:2;25529:9;25525:18;25516:6;25472:72;:::i;:::-;25591:9;25585:4;25581:20;25576:2;25565:9;25561:18;25554:48;25619:76;25690:4;25681:6;25619:76;:::i;:::-;25611:84;;25262:440;;;;;;;:::o;25708:210::-;25795:4;25833:2;25822:9;25818:18;25810:26;;25846:65;25908:1;25897:9;25893:17;25884:6;25846:65;:::i;:::-;25800:118;;;;:::o;25924:266::-;26039:4;26077:2;26066:9;26062:18;26054:26;;26090:93;26180:1;26169:9;26165:17;26156:6;26090:93;:::i;:::-;26044:146;;;;:::o;26196:313::-;26309:4;26347:2;26336:9;26332:18;26324:26;;26396:9;26390:4;26386:20;26382:1;26371:9;26367:17;26360:47;26424:78;26497:4;26488:6;26424:78;:::i;:::-;26416:86;;26314:195;;;;:::o;26515:419::-;26681:4;26719:2;26708:9;26704:18;26696:26;;26768:9;26762:4;26758:20;26754:1;26743:9;26739:17;26732:47;26796:131;26922:4;26796:131;:::i;:::-;26788:139;;26686:248;;;:::o;26940:419::-;27106:4;27144:2;27133:9;27129:18;27121:26;;27193:9;27187:4;27183:20;27179:1;27168:9;27164:17;27157:47;27221:131;27347:4;27221:131;:::i;:::-;27213:139;;27111:248;;;:::o;27365:419::-;27531:4;27569:2;27558:9;27554:18;27546:26;;27618:9;27612:4;27608:20;27604:1;27593:9;27589:17;27582:47;27646:131;27772:4;27646:131;:::i;:::-;27638:139;;27536:248;;;:::o;27790:419::-;27956:4;27994:2;27983:9;27979:18;27971:26;;28043:9;28037:4;28033:20;28029:1;28018:9;28014:17;28007:47;28071:131;28197:4;28071:131;:::i;:::-;28063:139;;27961:248;;;:::o;28215:419::-;28381:4;28419:2;28408:9;28404:18;28396:26;;28468:9;28462:4;28458:20;28454:1;28443:9;28439:17;28432:47;28496:131;28622:4;28496:131;:::i;:::-;28488:139;;28386:248;;;:::o;28640:419::-;28806:4;28844:2;28833:9;28829:18;28821:26;;28893:9;28887:4;28883:20;28879:1;28868:9;28864:17;28857:47;28921:131;29047:4;28921:131;:::i;:::-;28913:139;;28811:248;;;:::o;29065:419::-;29231:4;29269:2;29258:9;29254:18;29246:26;;29318:9;29312:4;29308:20;29304:1;29293:9;29289:17;29282:47;29346:131;29472:4;29346:131;:::i;:::-;29338:139;;29236:248;;;:::o;29490:419::-;29656:4;29694:2;29683:9;29679:18;29671:26;;29743:9;29737:4;29733:20;29729:1;29718:9;29714:17;29707:47;29771:131;29897:4;29771:131;:::i;:::-;29763:139;;29661:248;;;:::o;29915:419::-;30081:4;30119:2;30108:9;30104:18;30096:26;;30168:9;30162:4;30158:20;30154:1;30143:9;30139:17;30132:47;30196:131;30322:4;30196:131;:::i;:::-;30188:139;;30086:248;;;:::o;30340:419::-;30506:4;30544:2;30533:9;30529:18;30521:26;;30593:9;30587:4;30583:20;30579:1;30568:9;30564:17;30557:47;30621:131;30747:4;30621:131;:::i;:::-;30613:139;;30511:248;;;:::o;30765:419::-;30931:4;30969:2;30958:9;30954:18;30946:26;;31018:9;31012:4;31008:20;31004:1;30993:9;30989:17;30982:47;31046:131;31172:4;31046:131;:::i;:::-;31038:139;;30936:248;;;:::o;31190:419::-;31356:4;31394:2;31383:9;31379:18;31371:26;;31443:9;31437:4;31433:20;31429:1;31418:9;31414:17;31407:47;31471:131;31597:4;31471:131;:::i;:::-;31463:139;;31361:248;;;:::o;31615:419::-;31781:4;31819:2;31808:9;31804:18;31796:26;;31868:9;31862:4;31858:20;31854:1;31843:9;31839:17;31832:47;31896:131;32022:4;31896:131;:::i;:::-;31888:139;;31786:248;;;:::o;32040:419::-;32206:4;32244:2;32233:9;32229:18;32221:26;;32293:9;32287:4;32283:20;32279:1;32268:9;32264:17;32257:47;32321:131;32447:4;32321:131;:::i;:::-;32313:139;;32211:248;;;:::o;32465:419::-;32631:4;32669:2;32658:9;32654:18;32646:26;;32718:9;32712:4;32708:20;32704:1;32693:9;32689:17;32682:47;32746:131;32872:4;32746:131;:::i;:::-;32738:139;;32636:248;;;:::o;32890:419::-;33056:4;33094:2;33083:9;33079:18;33071:26;;33143:9;33137:4;33133:20;33129:1;33118:9;33114:17;33107:47;33171:131;33297:4;33171:131;:::i;:::-;33163:139;;33061:248;;;:::o;33315:419::-;33481:4;33519:2;33508:9;33504:18;33496:26;;33568:9;33562:4;33558:20;33554:1;33543:9;33539:17;33532:47;33596:131;33722:4;33596:131;:::i;:::-;33588:139;;33486:248;;;:::o;33740:419::-;33906:4;33944:2;33933:9;33929:18;33921:26;;33993:9;33987:4;33983:20;33979:1;33968:9;33964:17;33957:47;34021:131;34147:4;34021:131;:::i;:::-;34013:139;;33911:248;;;:::o;34165:419::-;34331:4;34369:2;34358:9;34354:18;34346:26;;34418:9;34412:4;34408:20;34404:1;34393:9;34389:17;34382:47;34446:131;34572:4;34446:131;:::i;:::-;34438:139;;34336:248;;;:::o;34590:419::-;34756:4;34794:2;34783:9;34779:18;34771:26;;34843:9;34837:4;34833:20;34829:1;34818:9;34814:17;34807:47;34871:131;34997:4;34871:131;:::i;:::-;34863:139;;34761:248;;;:::o;35015:222::-;35108:4;35146:2;35135:9;35131:18;35123:26;;35159:71;35227:1;35216:9;35212:17;35203:6;35159:71;:::i;:::-;35113:124;;;;:::o;35243:129::-;35277:6;35304:20;;:::i;:::-;35294:30;;35333:33;35361:4;35353:6;35333:33;:::i;:::-;35284:88;;;:::o;35378:75::-;35411:6;35444:2;35438:9;35428:19;;35418:35;:::o;35459:311::-;35536:4;35626:18;35618:6;35615:30;35612:2;;;35648:18;;:::i;:::-;35612:2;35698:4;35690:6;35686:17;35678:25;;35758:4;35752;35748:15;35740:23;;35541:229;;;:::o;35776:307::-;35837:4;35927:18;35919:6;35916:30;35913:2;;;35949:18;;:::i;:::-;35913:2;35987:29;36009:6;35987:29;:::i;:::-;35979:37;;36071:4;36065;36061:15;36053:23;;35842:241;;;:::o;36089:141::-;36138:4;36161:3;36153:11;;36184:3;36181:1;36174:14;36218:4;36215:1;36205:18;36197:26;;36143:87;;;:::o;36236:98::-;36287:6;36321:5;36315:12;36305:22;;36294:40;;;:::o;36340:99::-;36392:6;36426:5;36420:12;36410:22;;36399:40;;;:::o;36445:168::-;36528:11;36562:6;36557:3;36550:19;36602:4;36597:3;36593:14;36578:29;;36540:73;;;;:::o;36619:169::-;36703:11;36737:6;36732:3;36725:19;36777:4;36772:3;36768:14;36753:29;;36715:73;;;;:::o;36794:148::-;36896:11;36933:3;36918:18;;36908:34;;;;:::o;36948:305::-;36988:3;37007:20;37025:1;37007:20;:::i;:::-;37002:25;;37041:20;37059:1;37041:20;:::i;:::-;37036:25;;37195:1;37127:66;37123:74;37120:1;37117:81;37114:2;;;37201:18;;:::i;:::-;37114:2;37245:1;37242;37238:9;37231:16;;36992:261;;;;:::o;37259:185::-;37299:1;37316:20;37334:1;37316:20;:::i;:::-;37311:25;;37350:20;37368:1;37350:20;:::i;:::-;37345:25;;37389:1;37379:2;;37394:18;;:::i;:::-;37379:2;37436:1;37433;37429:9;37424:14;;37301:143;;;;:::o;37450:348::-;37490:7;37513:20;37531:1;37513:20;:::i;:::-;37508:25;;37547:20;37565:1;37547:20;:::i;:::-;37542:25;;37735:1;37667:66;37663:74;37660:1;37657:81;37652:1;37645:9;37638:17;37634:105;37631:2;;;37742:18;;:::i;:::-;37631:2;37790:1;37787;37783:9;37772:20;;37498:300;;;;:::o;37804:191::-;37844:4;37864:20;37882:1;37864:20;:::i;:::-;37859:25;;37898:20;37916:1;37898:20;:::i;:::-;37893:25;;37937:1;37934;37931:8;37928:2;;;37942:18;;:::i;:::-;37928:2;37987:1;37984;37980:9;37972:17;;37849:146;;;;:::o;38001:96::-;38038:7;38067:24;38085:5;38067:24;:::i;:::-;38056:35;;38046:51;;;:::o;38103:90::-;38137:7;38180:5;38173:13;38166:21;38155:32;;38145:48;;;:::o;38199:149::-;38235:7;38275:66;38268:5;38264:78;38253:89;;38243:105;;;:::o;38354:126::-;38391:7;38431:42;38424:5;38420:54;38409:65;;38399:81;;;:::o;38486:77::-;38523:7;38552:5;38541:16;;38531:32;;;:::o;38569:170::-;38641:9;38674:59;38727:5;38674:59;:::i;:::-;38661:72;;38651:88;;;:::o;38745:135::-;38817:9;38850:24;38868:5;38850:24;:::i;:::-;38837:37;;38827:53;;;:::o;38886:154::-;38970:6;38965:3;38960;38947:30;39032:1;39023:6;39018:3;39014:16;39007:27;38937:103;;;:::o;39046:307::-;39114:1;39124:113;39138:6;39135:1;39132:13;39124:113;;;39223:1;39218:3;39214:11;39208:18;39204:1;39199:3;39195:11;39188:39;39160:2;39157:1;39153:10;39148:15;;39124:113;;;39255:6;39252:1;39249:13;39246:2;;;39335:1;39326:6;39321:3;39317:16;39310:27;39246:2;39095:258;;;;:::o;39359:320::-;39403:6;39440:1;39434:4;39430:12;39420:22;;39487:1;39481:4;39477:12;39508:18;39498:2;;39564:4;39556:6;39552:17;39542:27;;39498:2;39626;39618:6;39615:14;39595:18;39592:38;39589:2;;;39645:18;;:::i;:::-;39589:2;39410:269;;;;:::o;39685:281::-;39768:27;39790:4;39768:27;:::i;:::-;39760:6;39756:40;39898:6;39886:10;39883:22;39862:18;39850:10;39847:34;39844:62;39841:2;;;39909:18;;:::i;:::-;39841:2;39949:10;39945:2;39938:22;39728:238;;;:::o;39972:233::-;40011:3;40034:24;40052:5;40034:24;:::i;:::-;40025:33;;40080:66;40073:5;40070:77;40067:2;;;40150:18;;:::i;:::-;40067:2;40197:1;40190:5;40186:13;40179:20;;40015:190;;;:::o;40211:176::-;40243:1;40260:20;40278:1;40260:20;:::i;:::-;40255:25;;40294:20;40312:1;40294:20;:::i;:::-;40289:25;;40333:1;40323:2;;40338:18;;:::i;:::-;40323:2;40379:1;40376;40372:9;40367:14;;40245:142;;;;:::o;40393:180::-;40441:77;40438:1;40431:88;40538:4;40535:1;40528:15;40562:4;40559:1;40552:15;40579:180;40627:77;40624:1;40617:88;40724:4;40721:1;40714:15;40748:4;40745:1;40738:15;40765:180;40813:77;40810:1;40803:88;40910:4;40907:1;40900:15;40934:4;40931:1;40924:15;40951:180;40999:77;40996:1;40989:88;41096:4;41093:1;41086:15;41120:4;41117:1;41110:15;41137:102;41178:6;41229:2;41225:7;41220:2;41213:5;41209:14;41205:28;41195:38;;41185:54;;;:::o;41245:214::-;41385:66;41381:1;41373:6;41369:14;41362:90;41351:108;:::o;41465:230::-;41605:34;41601:1;41593:6;41589:14;41582:58;41674:13;41669:2;41661:6;41657:15;41650:38;41571:124;:::o;41701:237::-;41841:34;41837:1;41829:6;41825:14;41818:58;41910:20;41905:2;41897:6;41893:15;41886:45;41807:131;:::o;41944:177::-;42084:29;42080:1;42072:6;42068:14;42061:53;42050:71;:::o;42127:225::-;42267:34;42263:1;42255:6;42251:14;42244:58;42336:8;42331:2;42323:6;42319:15;42312:33;42233:119;:::o;42358:178::-;42498:30;42494:1;42486:6;42482:14;42475:54;42464:72;:::o;42542:223::-;42682:34;42678:1;42670:6;42666:14;42659:58;42751:6;42746:2;42738:6;42734:15;42727:31;42648:117;:::o;42771:175::-;42911:27;42907:1;42899:6;42895:14;42888:51;42877:69;:::o;42952:231::-;43092:34;43088:1;43080:6;43076:14;43069:58;43161:14;43156:2;43148:6;43144:15;43137:39;43058:125;:::o;43189:151::-;43329:3;43325:1;43317:6;43313:14;43306:27;43295:45;:::o;43346:243::-;43486:34;43482:1;43474:6;43470:14;43463:58;43555:26;43550:2;43542:6;43538:15;43531:51;43452:137;:::o;43595:229::-;43735:34;43731:1;43723:6;43719:14;43712:58;43804:12;43799:2;43791:6;43787:15;43780:37;43701:123;:::o;43830:228::-;43970:34;43966:1;43958:6;43954:14;43947:58;44039:11;44034:2;44026:6;44022:15;44015:36;43936:122;:::o;44064:214::-;44204:66;44200:1;44192:6;44188:14;44181:90;44170:108;:::o;44284:182::-;44424:34;44420:1;44412:6;44408:14;44401:58;44390:76;:::o;44472:231::-;44612:34;44608:1;44600:6;44596:14;44589:58;44681:14;44676:2;44668:6;44664:15;44657:39;44578:125;:::o;44709:182::-;44849:34;44845:1;44837:6;44833:14;44826:58;44815:76;:::o;44897:166::-;45037:18;45033:1;45025:6;45021:14;45014:42;45003:60;:::o;45069:228::-;45209:34;45205:1;45197:6;45193:14;45186:58;45278:11;45273:2;45265:6;45261:15;45254:36;45175:122;:::o;45303:835::-;45443:66;45439:1;45431:6;45427:14;45420:90;45544:34;45539:2;45531:6;45527:15;45520:59;45613:34;45608:2;45600:6;45596:15;45589:59;45682:34;45677:2;45669:6;45665:15;45658:59;45752:34;45746:3;45738:6;45734:16;45727:60;45822:34;45816:3;45808:6;45804:16;45797:60;45892:34;45886:3;45878:6;45874:16;45867:60;45962:66;45956:3;45948:6;45944:16;45937:92;46064:66;46058:3;46050:6;46046:16;46039:92;45409:729;:::o;46144:220::-;46284:34;46280:1;46272:6;46268:14;46261:58;46353:3;46348:2;46340:6;46336:15;46329:28;46250:114;:::o;46370:179::-;46510:31;46506:1;46498:6;46494:14;46487:55;46476:73;:::o;46555:236::-;46695:34;46691:1;46683:6;46679:14;46672:58;46764:19;46759:2;46751:6;46747:15;46740:44;46661:130;:::o;46797:231::-;46937:34;46933:1;46925:6;46921:14;46914:58;47006:14;47001:2;46993:6;46989:15;46982:39;46903:125;:::o;47034:181::-;47174:33;47170:1;47162:6;47158:14;47151:57;47140:75;:::o;47221:122::-;47294:24;47312:5;47294:24;:::i;:::-;47287:5;47284:35;47274:2;;47333:1;47330;47323:12;47274:2;47264:79;:::o;47349:116::-;47419:21;47434:5;47419:21;:::i;:::-;47412:5;47409:32;47399:2;;47455:1;47452;47445:12;47399:2;47389:76;:::o;47471:120::-;47543:23;47560:5;47543:23;:::i;:::-;47536:5;47533:34;47523:2;;47581:1;47578;47571:12;47523:2;47513:78;:::o;47597:122::-;47670:24;47688:5;47670:24;:::i;:::-;47663:5;47660:35;47650:2;;47709:1;47706;47699:12;47650:2;47640:79;:::o

Swarm Source

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