ETH Price: $3,417.02 (-0.13%)

Token

BlootRealEstate (BlootRE)
 

Overview

Max Total Supply

855 BlootRE

Holders

609

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BlootRE
0x73417ed3f9bf82666b097bd2b438ca5bb836002d
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:
BlootRealEstate

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

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

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


contract BlootRealEstate is ERC721Enumerable, ReentrancyGuard, Ownable {

    ERC721 bloot = ERC721(0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613);
    
    // mirror a n-sided dice roll
    function randomN(uint256 tokenId, string memory keyPrefix, uint8 n) internal pure returns (uint256) {
        string memory input = string(abi.encodePacked(keyPrefix, toString(tokenId), "1"));
        uint256 roll = (uint256(keccak256(abi.encodePacked(input))) % n) + 1;
        return roll;
    }

    function random3(uint256 tokenId, string memory keyPrefix) internal pure returns (uint256) {
        string memory input1 = string(abi.encodePacked(keyPrefix, toString(tokenId), "1"));
        string memory input2 = string(abi.encodePacked(keyPrefix, toString(tokenId), "2"));
        string memory input3 = string(abi.encodePacked(keyPrefix, toString(tokenId), "3"));

        uint256 roll1 = (uint256(keccak256(abi.encodePacked(input1))) % 6) + 1;
        uint256 roll2 = (uint256(keccak256(abi.encodePacked(input2))) % 6) + 1;
        uint256 roll3 = (uint256(keccak256(abi.encodePacked(input3))) % 6) + 1;

        uint256 sum = roll1 + roll2 + roll3;
        return sum;
    }
    
    function getLocation(uint256 tokenId) public pure returns (string memory) {
        return pluckLocation(tokenId, "Location");
    }
    
    function getType(uint256 tokenId) public pure returns (string memory) {
        return pluckType(tokenId, "Type");
    }
    
    function getPartOfTown(uint256 tokenId) public pure returns (string memory) {
        return pluckPartOfTown(tokenId, "Part of Town");
    }
    
    function getBedrooms(uint256 tokenId) public pure returns (string memory) {
        return pluckRooms(tokenId, "Bedrooms");
    }

    function getBathrooms(uint256 tokenId) public pure returns (string memory) {
        return pluckRooms(tokenId, "Bathrooms");
    }
    
    function getAttribute1(uint256 tokenId) public pure returns (string memory) {
        return pluckAttribute(tokenId, "Attribute 1");
    }

    function getAttribute2(uint256 tokenId) public pure returns (string memory) {
        return pluckAttribute(tokenId, "Attribute 2");
    }

    function getAttribute3(uint256 tokenId) public pure returns (string memory) {
        return pluckAttribute(tokenId, "Attribute 3");
    }
    
    /*
        3: 1/216 = 0.5%, 1
        4: 3/216 = 1.4%, 4
        5: 6/216 = 2.8%, 10
        6: 10/216 = 4.6%, 20
        7: 15/216 = 7.0%, 35
        8: 21/216 = 9.7%, 56
        9: 25/216 = 11.6%, 81
        10: 27/216 = 12.5%, 108
        11: 27/216 = 12.5%, 135
        12: 25/216 = 11.6%, 160
        13: 21/216 = 9.7%, 181
        14: 15/216 = 7.0%, 196
        15: 10/216 = 4.6%, 206
        16: 6/216 = 2.8%, 212
        17: 3/216 = 1.4%, 215
        18: 1/216 = 0.5%, 216
    */
    function pluckLocation(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll = randomN(tokenId, keyPrefix, 13);
        string memory location = "";
        if (roll == 1) {
            location = "Shithole, Nowhere";
        }
        else if (roll == 2) {
            location = "New York, NY";
        }
        else if (roll == 3) {
            location = "Paris, France";
        }
        else if (roll == 4) {
            location = "London, UK";
        }
        else if (roll == 5) {
            location = "Tokyo, Japan";
        }
        else if (roll == 6) {
            location = "Beijing, China";
        }
        else if (roll == 7) {
            location = "Vancouver, Canada";
        }
        else if (roll == 8) {
            location = "Tel Aviv, Israel";
        }
        else if (roll == 9) {
            location = "Amsterdam, Netherlands";
        }
        else if (roll == 10) {
            location = "San Francisco, California";
        }
        else if (roll == 11) {
            location = "Los Angeles, California";
        }
        else if (roll == 12) {
            location = "Miami, Florida";
        }
        else {
            location = "Gary, Indiana";
        }

        string memory output = string(abi.encodePacked(keyPrefix, ": ", location));
        return output;
    }

    function pluckType(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll = random3(tokenId, keyPrefix);
        string memory homeType = "";
        if (roll < 6) {
            homeType = "Mansion";
        }
        else if (roll < 9) {
            homeType = "Single Family Home";
        }
        else if (roll < 11) {
            homeType = "Condo";
        }
        else if (roll == 13) {
            homeType = "Townhouse";
        }
        else if (roll == 14) {
            homeType = "Ranch";
        }
        else {
            homeType = "Shack";
        }

        string memory output = string(abi.encodePacked(keyPrefix, ": ", homeType));
        return output;
    }

    function pluckPartOfTown(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll = randomN(tokenId, keyPrefix, 3);
        string memory part = "";
        if (roll == 1) {
            part = "Downtown";
        }
        else if (roll == 2) {
            part = "Suburbs";
        }
        else{
            part = 'Wilderness';
        }

        string memory output = string(abi.encodePacked(keyPrefix, ": ", part));
        return output;
    }

    function pluckRooms(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll = random3(tokenId, keyPrefix);
        uint8 rooms = 1;

        if (roll == 10 || roll == 11) {
            rooms = 1;
        }
        else if (roll == 9 || roll == 12) {
            rooms = 2;
        }
        else if (roll == 8 || roll == 13) {
            rooms = 3;
        }
        else if (roll == 7 || roll == 14) {
            rooms = 4;
        }
        else if (roll == 6 || roll == 15) {
            rooms = 5;
        }
        else if (roll == 5 || roll == 16) {
            rooms = 6;
        }
        else if (roll == 4 || roll == 17) {
            rooms = 7;
        }
        else if (roll == 3 || roll == 18) {
            rooms = 8;
        }

        string memory output = string(abi.encodePacked(keyPrefix, ": ", toString(rooms)));
        return output;
    }

    function pluckAttribute(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll = random3(tokenId, keyPrefix);
        string memory attribute = "";
        if (roll == 3) {
            attribute = "Beanie's Rainbow Cap";
        }
        else if (roll == 18) {
            attribute = "1,000,000 BGLD Wallet";
        }
        else if (roll == 4) {
            attribute = "Lamborghini Aventador";
        }
        else if (roll == 17) {
            attribute = "Stripper Pole";
        }
        else if (roll == 5) {
            attribute = "Cock Ring Holder";
        }
        else if (roll == 16) {
            attribute = "Infinity Pool";
        }
        else if (roll == 6) {
            attribute = "8Sleep Mattress";
        }
        else if (roll == 15) {
            attribute = "Private Gym";
        }
        else if (roll == 7) {
            attribute = "Broken Toilet";
        }
        else if (roll == 14) {
            attribute = "Inflatable Pool";
        }
        else if (roll == 8) {
            attribute = "Mercedes Benz C300";
        }
        else if (roll == 13) {
            attribute = "Toyota Corolla";
        }
        else if (roll == 9) {
            attribute = "Honda Sienna";
        }
        else if (roll == 12) { 
            attribute = "Expired Milk";
        }
        else if (roll == 11) {
            attribute = "Creaky Furniture";
        }
        else if (roll == 10) {
            attribute = "17 inch TV";
        }
        else {
            attribute = "None";
        }

        string memory output = string(abi.encodePacked(keyPrefix, ": ", attribute));
        return output;
    }


    function tokenURI(uint256 tokenId) override public pure 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] = getLocation(tokenId);

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

        parts[3] = getType(tokenId);

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

        parts[5] = getPartOfTown(tokenId);

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

        parts[7] = getBedrooms(tokenId);

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

        parts[9] = getBathrooms(tokenId);

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

        parts[11] = getAttribute1(tokenId);

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

        parts[13] = getAttribute2(tokenId);

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

        parts[15] = getAttribute3(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": "Bloot Home #', toString(tokenId), '", "description": "Bloot Real Estate Market (not for Weaks) is a collection of non-fungible tokens stored on the Ethereum Blockchain, to be used in the Bloot metaverse.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }
    
    function claimForBlootOwner(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8009, "Token ID invalid");
        require(bloot.ownerOf(tokenId) == msg.sender, "Not Bloot owner");
        _safeMint(_msgSender(), tokenId);
    }
    
    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("BlootRealEstate", "BlootRE") 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":"claimForBlootOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttribute1","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttribute2","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttribute3","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBathrooms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBedrooms","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLocation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPartOfTown","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"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":"pure","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"}]

6080604052734f8730e0b32b04beaa5757e5aea3aef970e5b613600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600f81526020017f426c6f6f745265616c45737461746500000000000000000000000000000000008152506040518060400160405280600781526020017f426c6f6f745245000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb92919062000203565b5080600190805190602001906200010492919062000203565b5050506001600a819055506200012f620001236200013560201b60201c565b6200013d60201b60201c565b62000318565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021190620002b3565b90600052602060002090601f01602090048101928262000235576000855562000281565b82601f106200025057805160ff191683800117855562000281565b8280016001018555821562000281579182015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b5b80821115620002af57600081600090555060010162000295565b5090565b60006002820490506001821680620002cc57607f821691505b60208210811415620002e357620002e2620002e9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615b1680620003286000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806342842e0e116100f95780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde14610577578063c87b56dd14610593578063e985e9c5146105c3578063f2fde38b146105f3576101c4565b80638da5cb5b1461051f57806395d89b411461053d578063a22cb4651461055b576101c4565b806370a08231116100d357806370a0823114610485578063715018a6146104b55780637f7b1393146104bf5780638a42f474146104ef576101c4565b806342842e0e146104095780634f6ccce7146104255780636352211e14610455576101c4565b8063234ebc89116101665780632b69caa7116101405780632b69caa7146103495780632be1855b146103795780632f745c59146103a95780634036ab78146103d9576101c4565b8063234ebc89146102cd57806323b872dd146102fd5780632b1f5c2214610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806310d3b4ee1461026357806317a30fc11461027f57806318160ddd146102af576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061442c565b61060f565b6040516101f09190615169565b60405180910390f35b610201610689565b60405161020e9190615184565b60405180910390f35b610231600480360381019061022c919061447e565b61071b565b60405161023e9190615102565b60405180910390f35b610261600480360381019061025c91906143f0565b6107a0565b005b61027d6004803603810190610278919061447e565b6108b8565b005b6102996004803603810190610294919061447e565b610a8a565b6040516102a69190615184565b60405180910390f35b6102b7610ad2565b6040516102c49190615426565b60405180910390f35b6102e760048036038101906102e2919061447e565b610adf565b6040516102f49190615184565b60405180910390f35b610317600480360381019061031291906142ea565b610b27565b005b610333600480360381019061032e919061447e565b610b87565b6040516103409190615184565b60405180910390f35b610363600480360381019061035e919061447e565b610bcf565b6040516103709190615184565b60405180910390f35b610393600480360381019061038e919061447e565b610c17565b6040516103a09190615184565b60405180910390f35b6103c360048036038101906103be91906143f0565b610c5f565b6040516103d09190615426565b60405180910390f35b6103f360048036038101906103ee919061447e565b610d04565b6040516104009190615184565b60405180910390f35b610423600480360381019061041e91906142ea565b610d4c565b005b61043f600480360381019061043a919061447e565b610d6c565b60405161044c9190615426565b60405180910390f35b61046f600480360381019061046a919061447e565b610e03565b60405161047c9190615102565b60405180910390f35b61049f600480360381019061049a919061425c565b610eb5565b6040516104ac9190615426565b60405180910390f35b6104bd610f6d565b005b6104d960048036038101906104d4919061447e565b610ff5565b6040516104e69190615184565b60405180910390f35b6105096004803603810190610504919061447e565b61103d565b6040516105169190615184565b60405180910390f35b610527611085565b6040516105349190615102565b60405180910390f35b6105456110af565b6040516105529190615184565b60405180910390f35b610575600480360381019061057091906143b4565b611141565b005b610591600480360381019061058c9190614339565b6112c2565b005b6105ad60048036038101906105a8919061447e565b611324565b6040516105ba9190615184565b60405180910390f35b6105dd60048036038101906105d891906142ae565b611dc6565b6040516105ea9190615169565b60405180910390f35b61060d6004803603810190610608919061425c565b611e5a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610682575061068182611f52565b5b9050919050565b606060008054610698906156b0565b80601f01602080910402602001604051908101604052809291908181526020018280546106c4906156b0565b80156107115780601f106106e657610100808354040283529160200191610711565b820191906000526020600020905b8154815290600101906020018083116106f457829003601f168201915b5050505050905090565b600061072682612034565b610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90615306565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ab82610e03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081390615386565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083b6120a0565b73ffffffffffffffffffffffffffffffffffffffff16148061086a5750610869816108646120a0565b611dc6565b5b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090615286565b60405180910390fd5b6108b383836120a8565b505050565b6002600a5414156108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f5906153e6565b60405180910390fd5b6002600a819055506000811180156109175750611f4981105b610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90615346565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109c89190615426565b60206040518083038186803b1580156109e057600080fd5b505afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190614285565b73ffffffffffffffffffffffffffffffffffffffff1614610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590615406565b60405180910390fd5b610a7f610a796120a0565b82612161565b6001600a8190555050565b6060610acb826040518060400160405280600c81526020017f50617274206f6620546f776e000000000000000000000000000000000000000081525061217f565b9050919050565b6000600880549050905090565b6060610b20826040518060400160405280600b81526020017f417474726962757465203300000000000000000000000000000000000000000081525061229d565b9050919050565b610b38610b326120a0565b8261279b565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e906153a6565b60405180910390fd5b610b82838383612879565b505050565b6060610bc8826040518060400160405280600981526020017f42617468726f6f6d730000000000000000000000000000000000000000000000815250612ad5565b9050919050565b6060610c10826040518060400160405280600b81526020017f417474726962757465203100000000000000000000000000000000000000000081525061229d565b9050919050565b6060610c58826040518060400160405280600b81526020017f417474726962757465203200000000000000000000000000000000000000000081525061229d565b9050919050565b6000610c6a83610eb5565b8210610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906151a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d45826040518060400160405280600481526020017f5479706500000000000000000000000000000000000000000000000000000000815250612c13565b9050919050565b610d67838383604051806020016040528060008152506112c2565b505050565b6000610d76610ad2565b8210610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906153c6565b60405180910390fd5b60088281548110610df1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906152c6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906152a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f756120a0565b73ffffffffffffffffffffffffffffffffffffffff16610f93611085565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090615326565b60405180910390fd5b610ff36000612e04565b565b6060611036826040518060400160405280600881526020017f4c6f636174696f6e000000000000000000000000000000000000000000000000815250612eca565b9050919050565b606061107e826040518060400160405280600881526020017f426564726f6f6d73000000000000000000000000000000000000000000000000815250612ad5565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110be906156b0565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea906156b0565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b5050505050905090565b6111496120a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90615246565b60405180910390fd5b80600560006111c46120a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112716120a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b69190615169565b60405180910390a35050565b6112d36112cd6120a0565b8361279b565b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906153a6565b60405180910390fd5b61131e848484846132ae565b50505050565b606061132e61414e565b60405180610120016040528060ff815260200161595160ff913981600060118110611382577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061139383610ff5565b816001601181106113cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615ab96028913981600260118110611428577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061143983610d04565b81600360118110611473577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161588660289139816004601181106114ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506114df83610a8a565b81600560118110611519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016159006028913981600660118110611574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115858361103d565b816007601181106115bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615928602991398160086011811061161a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061162b83610b87565b81600960118110611665577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016158d76029913981600a601181106116c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116d183610bcf565b81600b6011811061170b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615a506029913981600c60118110611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061177783610c17565b81600d601181106117b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016158ae6029913981600e6011811061180c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061181d83610adf565b81600f60118110611857577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106118cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060118110611913577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160118110611952577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110611991577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003601181106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460118110611a0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110611a4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110611a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110611acc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189600860118110611b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611b2899989796959493929190614f60565b60405160208183030381529060405290508082600960118110611b74577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60118110611bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60118110611bf2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c60118110611c31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110611c70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110611caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60118110611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189601060118110611d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611d4a99989796959493929190614f60565b60405160208183030381529060405290506000611d97611d698661330a565b611d72846134b7565b604051602001611d839291906150bd565b6040516020818303038152906040526134b7565b905080604051602001611daa919061509b565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e626120a0565b73ffffffffffffffffffffffffffffffffffffffff16611e80611085565b73ffffffffffffffffffffffffffffffffffffffff1614611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90615326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d906151e6565b60405180910390fd5b611f4f81612e04565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061202d575061202c82613675565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661211b83610e03565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61217b8282604051806020016040528060008152506136df565b5050565b6060600061218f8484600361373a565b9050600060405180602001604052806000815250905060018214156121eb576040518060400160405280600881526020017f446f776e746f776e000000000000000000000000000000000000000000000000815250905061226b565b6002821415612231576040518060400160405280600781526020017f5375627572627300000000000000000000000000000000000000000000000000815250905061226a565b6040518060400160405280600a81526020017f57696c6465726e6573730000000000000000000000000000000000000000000081525090505b5b6000848260405160200161228092919061506c565b604051602081830303815290604052905080935050505092915050565b606060006122ab84846137bd565b905060006040518060200160405280600081525090506003821415612307576040518060400160405280601481526020017f4265616e69652773205261696e626f77204361700000000000000000000000008152509050612769565b601282141561234d576040518060400160405280601581526020017f312c3030302c3030302042474c442057616c6c657400000000000000000000008152509050612768565b6004821415612393576040518060400160405280601581526020017f4c616d626f726768696e69204176656e7461646f7200000000000000000000008152509050612767565b60118214156123d9576040518060400160405280600d81526020017f537472697070657220506f6c65000000000000000000000000000000000000008152509050612766565b600582141561241f576040518060400160405280601081526020017f436f636b2052696e6720486f6c646572000000000000000000000000000000008152509050612765565b6010821415612465576040518060400160405280600d81526020017f496e66696e69747920506f6f6c000000000000000000000000000000000000008152509050612764565b60068214156124ab576040518060400160405280600f81526020017f38536c656570204d6174747265737300000000000000000000000000000000008152509050612763565b600f8214156124f1576040518060400160405280600b81526020017f507269766174652047796d0000000000000000000000000000000000000000008152509050612762565b6007821415612537576040518060400160405280600d81526020017f42726f6b656e20546f696c6574000000000000000000000000000000000000008152509050612761565b600e82141561257d576040518060400160405280600f81526020017f496e666c617461626c6520506f6f6c00000000000000000000000000000000008152509050612760565b60088214156125c3576040518060400160405280601281526020017f4d657263656465732042656e7a20433330300000000000000000000000000000815250905061275f565b600d821415612609576040518060400160405280600e81526020017f546f796f746120436f726f6c6c61000000000000000000000000000000000000815250905061275e565b600982141561264f576040518060400160405280600c81526020017f486f6e6461205369656e6e610000000000000000000000000000000000000000815250905061275d565b600c821415612695576040518060400160405280600c81526020017f45787069726564204d696c6b0000000000000000000000000000000000000000815250905061275c565b600b8214156126db576040518060400160405280601081526020017f437265616b79204675726e697475726500000000000000000000000000000000815250905061275b565b600a821415612721576040518060400160405280600a81526020017f313720696e636820545600000000000000000000000000000000000000000000815250905061275a565b6040518060400160405280600481526020017f4e6f6e650000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b6000848260405160200161277e92919061506c565b604051602081830303815290604052905080935050505092915050565b60006127a682612034565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90615266565b60405180910390fd5b60006127f083610e03565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061285f57508373ffffffffffffffffffffffffffffffffffffffff166128478461071b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612870575061286f8185611dc6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661289982610e03565b73ffffffffffffffffffffffffffffffffffffffff16146128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690615366565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690615226565b60405180910390fd5b61296a838383613945565b6129756000826120a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c591906155c6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1c91906154e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000612ae384846137bd565b9050600060019050600a821480612afa5750600b82145b15612b085760019050612bd6565b6009821480612b175750600c82145b15612b255760029050612bd5565b6008821480612b345750600d82145b15612b425760039050612bd4565b6007821480612b515750600e82145b15612b5f5760049050612bd3565b6006821480612b6e5750600f82145b15612b7c5760059050612bd2565b6005821480612b8b5750601082145b15612b995760069050612bd1565b6004821480612ba85750601182145b15612bb65760079050612bd0565b6003821480612bc55750601282145b15612bcf57600890505b5b5b5b5b5b5b5b600084612be58360ff1661330a565b604051602001612bf692919061506c565b604051602081830303815290604052905080935050505092915050565b60606000612c2184846137bd565b905060006040518060200160405280600081525090506006821015612c7d576040518060400160405280600781526020017f4d616e73696f6e000000000000000000000000000000000000000000000000008152509050612dd2565b6009821015612cc3576040518060400160405280601281526020017f53696e676c652046616d696c7920486f6d6500000000000000000000000000008152509050612dd1565b600b821015612d09576040518060400160405280600581526020017f436f6e646f0000000000000000000000000000000000000000000000000000008152509050612dd0565b600d821415612d4f576040518060400160405280600981526020017f546f776e686f75736500000000000000000000000000000000000000000000008152509050612dcf565b600e821415612d95576040518060400160405280600581526020017f52616e63680000000000000000000000000000000000000000000000000000008152509050612dce565b6040518060400160405280600581526020017f536861636b00000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b60008482604051602001612de792919061506c565b604051602081830303815290604052905080935050505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612eda8484600d61373a565b905060006040518060200160405280600081525090506001821415612f36576040518060400160405280601181526020017f53686974686f6c652c204e6f7768657265000000000000000000000000000000815250905061327c565b6002821415612f7c576040518060400160405280600c81526020017f4e657720596f726b2c204e590000000000000000000000000000000000000000815250905061327b565b6003821415612fc2576040518060400160405280600d81526020017f50617269732c204672616e636500000000000000000000000000000000000000815250905061327a565b6004821415613008576040518060400160405280600a81526020017f4c6f6e646f6e2c20554b000000000000000000000000000000000000000000008152509050613279565b600582141561304e576040518060400160405280600c81526020017f546f6b796f2c204a6170616e00000000000000000000000000000000000000008152509050613278565b6006821415613094576040518060400160405280600e81526020017f4265696a696e672c204368696e610000000000000000000000000000000000008152509050613277565b60078214156130da576040518060400160405280601181526020017f56616e636f757665722c2043616e6164610000000000000000000000000000008152509050613276565b6008821415613120576040518060400160405280601081526020017f54656c20417669762c2049737261656c000000000000000000000000000000008152509050613275565b6009821415613166576040518060400160405280601681526020017f416d7374657264616d2c204e65746865726c616e6473000000000000000000008152509050613274565b600a8214156131ac576040518060400160405280601981526020017f53616e204672616e636973636f2c2043616c69666f726e6961000000000000008152509050613273565b600b8214156131f2576040518060400160405280601781526020017f4c6f7320416e67656c65732c2043616c69666f726e69610000000000000000008152509050613272565b600c821415613238576040518060400160405280600e81526020017f4d69616d692c20466c6f726964610000000000000000000000000000000000008152509050613271565b6040518060400160405280600d81526020017f476172792c20496e6469616e610000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b5b5b5b6000848260405160200161329192919061506c565b604051602081830303815290604052905080935050505092915050565b6132b9848484612879565b6132c584848484613a59565b613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fb906151c6565b60405180910390fd5b50505050565b60606000821415613352576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134b2565b600082905060005b6000821461338457808061336d906156e2565b915050600a8261337d919061553b565b915061335a565b60008167ffffffffffffffff8111156133c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133f85781602001600182028036833780820191505090505b5090505b600085146134ab5760018261341191906155c6565b9150600a85613420919061572b565b603061342c91906154e5565b60f81b818381518110613468577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134a4919061553b565b94506133fc565b8093505050505b919050565b606060008251905060008114156134e05760405180602001604052806000815250915050613670565b600060036002836134f191906154e5565b6134fb919061553b565b6004613507919061556c565b9050600060208261351891906154e5565b67ffffffffffffffff811115613557577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135895781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615a79604091399050600181016020830160005b8681101561362d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506135b4565b506003860660018114613647576002811461365757613662565b613d3d60f01b6002830352613662565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136e98383613bf0565b6136f66000848484613a59565b613735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372c906151c6565b60405180910390fd5b505050565b600080836137478661330a565b60405160200161375892919061503d565b6040516020818303038152906040529050600060018460ff16836040516020016137829190614f49565b6040516020818303038152906040528051906020012060001c6137a5919061572b565b6137af91906154e5565b905080925050509392505050565b600080826137ca8561330a565b6040516020016137db92919061503d565b60405160208183030381529060405290506000836137f88661330a565b60405160200161380992919061500e565b60405160208183030381529060405290506000846138268761330a565b604051602001613837929190614fdf565b60405160208183030381529060405290506000600160068560405160200161385f9190614f49565b6040516020818303038152906040528051906020012060001c613882919061572b565b61388c91906154e5565b9050600060016006856040516020016138a59190614f49565b6040516020818303038152906040528051906020012060001c6138c8919061572b565b6138d291906154e5565b9050600060016006856040516020016138eb9190614f49565b6040516020818303038152906040528051906020012060001c61390e919061572b565b61391891906154e5565b9050600081838561392991906154e5565b61393391906154e5565b90508097505050505050505092915050565b613950838383613dbe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139935761398e81613dc3565b6139d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139d1576139d08382613e0c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a1557613a1081613f79565b613a54565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613a5357613a5282826140bc565b5b5b505050565b6000613a7a8473ffffffffffffffffffffffffffffffffffffffff1661413b565b15613be3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613aa36120a0565b8786866040518563ffffffff1660e01b8152600401613ac5949392919061511d565b602060405180830381600087803b158015613adf57600080fd5b505af1925050508015613b1057506040513d601f19601f82011682018060405250810190613b0d9190614455565b60015b613b93573d8060008114613b40576040519150601f19603f3d011682016040523d82523d6000602084013e613b45565b606091505b50600081511415613b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b82906151c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613be8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c57906152e6565b60405180910390fd5b613c6981612034565b15613ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca090615206565b60405180910390fd5b613cb560008383613945565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d0591906154e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e1984610eb5565b613e2391906155c6565b9050600060076000848152602001908152602001600020549050818114613f08576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613f8d91906155c6565b9050600060096000848152602001908152602001600020549050600060088381548110613fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061402b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806140a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006140c783610eb5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061022001604052806011905b606081526020019060019003908161415e5790505090565b600061418961418484615472565b615441565b9050828152602081018484840111156141a157600080fd5b6141ac84828561566e565b509392505050565b6000813590506141c381615829565b92915050565b6000815190506141d881615829565b92915050565b6000813590506141ed81615840565b92915050565b60008135905061420281615857565b92915050565b60008151905061421781615857565b92915050565b600082601f83011261422e57600080fd5b813561423e848260208601614176565b91505092915050565b6000813590506142568161586e565b92915050565b60006020828403121561426e57600080fd5b600061427c848285016141b4565b91505092915050565b60006020828403121561429757600080fd5b60006142a5848285016141c9565b91505092915050565b600080604083850312156142c157600080fd5b60006142cf858286016141b4565b92505060206142e0858286016141b4565b9150509250929050565b6000806000606084860312156142ff57600080fd5b600061430d868287016141b4565b935050602061431e868287016141b4565b925050604061432f86828701614247565b9150509250925092565b6000806000806080858703121561434f57600080fd5b600061435d878288016141b4565b945050602061436e878288016141b4565b935050604061437f87828801614247565b925050606085013567ffffffffffffffff81111561439c57600080fd5b6143a88782880161421d565b91505092959194509250565b600080604083850312156143c757600080fd5b60006143d5858286016141b4565b92505060206143e6858286016141de565b9150509250929050565b6000806040838503121561440357600080fd5b6000614411858286016141b4565b925050602061442285828601614247565b9150509250929050565b60006020828403121561443e57600080fd5b600061444c848285016141f3565b91505092915050565b60006020828403121561446757600080fd5b600061447584828501614208565b91505092915050565b60006020828403121561449057600080fd5b600061449e84828501614247565b91505092915050565b6144b0816155fa565b82525050565b6144bf8161560c565b82525050565b60006144d0826154a2565b6144da81856154b8565b93506144ea81856020860161567d565b6144f381615818565b840191505092915050565b6000614509826154ad565b61451381856154c9565b935061452381856020860161567d565b61452c81615818565b840191505092915050565b6000614542826154ad565b61454c81856154da565b935061455c81856020860161567d565b80840191505092915050565b6000614575602b836154c9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006145db6032836154c9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146416026836154c9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a7601c836154c9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146e76001836154da565b91507f33000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006147276024836154c9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061478d6019836154c9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006147cd602c836154c9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006148336038836154c9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614899602a836154c9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148ff6029836154c9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149656002836154da565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006149a56020836154c9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149e5602c836154c9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a4b6020836154c9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a8b6010836154c9565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614acb6029836154c9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b316001836154da565b91507f32000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614b716021836154c9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bd7601d836154da565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614c176031836154c9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c7d6001836154da565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614cbd60cf836154da565b91507f222c20226465736372697074696f6e223a2022426c6f6f74205265616c20457360008301527f74617465204d61726b657420286e6f7420666f72205765616b7329206973206160208301527f20636f6c6c656374696f6e206f66206e6f6e2d66756e6769626c6520746f6b6560408301527f6e732073746f726564206f6e2074686520457468657265756d20426c6f636b6360608301527f6861696e2c20746f206265207573656420696e2074686520426c6f6f74206d6560808301527f746176657273652e222c2022696d616765223a2022646174613a696d6167652f60a08301527f7376672b786d6c3b6261736536342c000000000000000000000000000000000060c083015260cf82019050919050565b6000614de1602c836154c9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614e476002836154da565b91507f3a200000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614e876016836154da565b91507f7b226e616d65223a2022426c6f6f7420486f6d652023000000000000000000006000830152601682019050919050565b6000614ec7601f836154c9565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614f07600f836154c9565b91507f4e6f7420426c6f6f74206f776e657200000000000000000000000000000000006000830152602082019050919050565b614f4381615664565b82525050565b6000614f558284614537565b915081905092915050565b6000614f6c828c614537565b9150614f78828b614537565b9150614f84828a614537565b9150614f908289614537565b9150614f9c8288614537565b9150614fa88287614537565b9150614fb48286614537565b9150614fc08285614537565b9150614fcc8284614537565b91508190509a9950505050505050505050565b6000614feb8285614537565b9150614ff78284614537565b9150615002826146da565b91508190509392505050565b600061501a8285614537565b91506150268284614537565b915061503182614b24565b91508190509392505050565b60006150498285614537565b91506150558284614537565b915061506082614c70565b91508190509392505050565b60006150788285614537565b915061508382614e3a565b915061508f8284614537565b91508190509392505050565b60006150a682614bca565b91506150b28284614537565b915081905092915050565b60006150c882614e7a565b91506150d48285614537565b91506150df82614cb0565b91506150eb8284614537565b91506150f682614958565b91508190509392505050565b600060208201905061511760008301846144a7565b92915050565b600060808201905061513260008301876144a7565b61513f60208301866144a7565b61514c6040830185614f3a565b818103606083015261515e81846144c5565b905095945050505050565b600060208201905061517e60008301846144b6565b92915050565b6000602082019050818103600083015261519e81846144fe565b905092915050565b600060208201905081810360008301526151bf81614568565b9050919050565b600060208201905081810360008301526151df816145ce565b9050919050565b600060208201905081810360008301526151ff81614634565b9050919050565b6000602082019050818103600083015261521f8161469a565b9050919050565b6000602082019050818103600083015261523f8161471a565b9050919050565b6000602082019050818103600083015261525f81614780565b9050919050565b6000602082019050818103600083015261527f816147c0565b9050919050565b6000602082019050818103600083015261529f81614826565b9050919050565b600060208201905081810360008301526152bf8161488c565b9050919050565b600060208201905081810360008301526152df816148f2565b9050919050565b600060208201905081810360008301526152ff81614998565b9050919050565b6000602082019050818103600083015261531f816149d8565b9050919050565b6000602082019050818103600083015261533f81614a3e565b9050919050565b6000602082019050818103600083015261535f81614a7e565b9050919050565b6000602082019050818103600083015261537f81614abe565b9050919050565b6000602082019050818103600083015261539f81614b64565b9050919050565b600060208201905081810360008301526153bf81614c0a565b9050919050565b600060208201905081810360008301526153df81614dd4565b9050919050565b600060208201905081810360008301526153ff81614eba565b9050919050565b6000602082019050818103600083015261541f81614efa565b9050919050565b600060208201905061543b6000830184614f3a565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615468576154676157e9565b5b8060405250919050565b600067ffffffffffffffff82111561548d5761548c6157e9565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006154f082615664565b91506154fb83615664565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155305761552f61575c565b5b828201905092915050565b600061554682615664565b915061555183615664565b9250826155615761556061578b565b5b828204905092915050565b600061557782615664565b915061558283615664565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155bb576155ba61575c565b5b828202905092915050565b60006155d182615664565b91506155dc83615664565b9250828210156155ef576155ee61575c565b5b828203905092915050565b600061560582615644565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561569b578082015181840152602081019050615680565b838111156156aa576000848401525b50505050565b600060028204905060018216806156c857607f821691505b602082108114156156dc576156db6157ba565b5b50919050565b60006156ed82615664565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157205761571f61575c565b5b600182019050919050565b600061573682615664565b915061574183615664565b9250826157515761575061578b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615832816155fa565b811461583d57600080fd5b50565b6158498161560c565b811461585457600080fd5b50565b61586081615618565b811461586b57600080fd5b50565b61587781615664565b811461588257600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220209900025d64b295f7f6d61fe8ff39159136f595c3d651801c332a4a4f72fc2564736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806342842e0e116100f95780638da5cb5b11610097578063b88d4fde11610071578063b88d4fde14610577578063c87b56dd14610593578063e985e9c5146105c3578063f2fde38b146105f3576101c4565b80638da5cb5b1461051f57806395d89b411461053d578063a22cb4651461055b576101c4565b806370a08231116100d357806370a0823114610485578063715018a6146104b55780637f7b1393146104bf5780638a42f474146104ef576101c4565b806342842e0e146104095780634f6ccce7146104255780636352211e14610455576101c4565b8063234ebc89116101665780632b69caa7116101405780632b69caa7146103495780632be1855b146103795780632f745c59146103a95780634036ab78146103d9576101c4565b8063234ebc89146102cd57806323b872dd146102fd5780632b1f5c2214610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806310d3b4ee1461026357806317a30fc11461027f57806318160ddd146102af576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de919061442c565b61060f565b6040516101f09190615169565b60405180910390f35b610201610689565b60405161020e9190615184565b60405180910390f35b610231600480360381019061022c919061447e565b61071b565b60405161023e9190615102565b60405180910390f35b610261600480360381019061025c91906143f0565b6107a0565b005b61027d6004803603810190610278919061447e565b6108b8565b005b6102996004803603810190610294919061447e565b610a8a565b6040516102a69190615184565b60405180910390f35b6102b7610ad2565b6040516102c49190615426565b60405180910390f35b6102e760048036038101906102e2919061447e565b610adf565b6040516102f49190615184565b60405180910390f35b610317600480360381019061031291906142ea565b610b27565b005b610333600480360381019061032e919061447e565b610b87565b6040516103409190615184565b60405180910390f35b610363600480360381019061035e919061447e565b610bcf565b6040516103709190615184565b60405180910390f35b610393600480360381019061038e919061447e565b610c17565b6040516103a09190615184565b60405180910390f35b6103c360048036038101906103be91906143f0565b610c5f565b6040516103d09190615426565b60405180910390f35b6103f360048036038101906103ee919061447e565b610d04565b6040516104009190615184565b60405180910390f35b610423600480360381019061041e91906142ea565b610d4c565b005b61043f600480360381019061043a919061447e565b610d6c565b60405161044c9190615426565b60405180910390f35b61046f600480360381019061046a919061447e565b610e03565b60405161047c9190615102565b60405180910390f35b61049f600480360381019061049a919061425c565b610eb5565b6040516104ac9190615426565b60405180910390f35b6104bd610f6d565b005b6104d960048036038101906104d4919061447e565b610ff5565b6040516104e69190615184565b60405180910390f35b6105096004803603810190610504919061447e565b61103d565b6040516105169190615184565b60405180910390f35b610527611085565b6040516105349190615102565b60405180910390f35b6105456110af565b6040516105529190615184565b60405180910390f35b610575600480360381019061057091906143b4565b611141565b005b610591600480360381019061058c9190614339565b6112c2565b005b6105ad60048036038101906105a8919061447e565b611324565b6040516105ba9190615184565b60405180910390f35b6105dd60048036038101906105d891906142ae565b611dc6565b6040516105ea9190615169565b60405180910390f35b61060d6004803603810190610608919061425c565b611e5a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610682575061068182611f52565b5b9050919050565b606060008054610698906156b0565b80601f01602080910402602001604051908101604052809291908181526020018280546106c4906156b0565b80156107115780601f106106e657610100808354040283529160200191610711565b820191906000526020600020905b8154815290600101906020018083116106f457829003601f168201915b5050505050905090565b600061072682612034565b610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90615306565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ab82610e03565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561081c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081390615386565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661083b6120a0565b73ffffffffffffffffffffffffffffffffffffffff16148061086a5750610869816108646120a0565b611dc6565b5b6108a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a090615286565b60405180910390fd5b6108b383836120a8565b505050565b6002600a5414156108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f5906153e6565b60405180910390fd5b6002600a819055506000811180156109175750611f4981105b610956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094d90615346565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109c89190615426565b60206040518083038186803b1580156109e057600080fd5b505afa1580156109f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a189190614285565b73ffffffffffffffffffffffffffffffffffffffff1614610a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6590615406565b60405180910390fd5b610a7f610a796120a0565b82612161565b6001600a8190555050565b6060610acb826040518060400160405280600c81526020017f50617274206f6620546f776e000000000000000000000000000000000000000081525061217f565b9050919050565b6000600880549050905090565b6060610b20826040518060400160405280600b81526020017f417474726962757465203300000000000000000000000000000000000000000081525061229d565b9050919050565b610b38610b326120a0565b8261279b565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e906153a6565b60405180910390fd5b610b82838383612879565b505050565b6060610bc8826040518060400160405280600981526020017f42617468726f6f6d730000000000000000000000000000000000000000000000815250612ad5565b9050919050565b6060610c10826040518060400160405280600b81526020017f417474726962757465203100000000000000000000000000000000000000000081525061229d565b9050919050565b6060610c58826040518060400160405280600b81526020017f417474726962757465203200000000000000000000000000000000000000000081525061229d565b9050919050565b6000610c6a83610eb5565b8210610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca2906151a6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d45826040518060400160405280600481526020017f5479706500000000000000000000000000000000000000000000000000000000815250612c13565b9050919050565b610d67838383604051806020016040528060008152506112c2565b505050565b6000610d76610ad2565b8210610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906153c6565b60405180910390fd5b60088281548110610df1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea3906152c6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d906152a6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f756120a0565b73ffffffffffffffffffffffffffffffffffffffff16610f93611085565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090615326565b60405180910390fd5b610ff36000612e04565b565b6060611036826040518060400160405280600881526020017f4c6f636174696f6e000000000000000000000000000000000000000000000000815250612eca565b9050919050565b606061107e826040518060400160405280600881526020017f426564726f6f6d73000000000000000000000000000000000000000000000000815250612ad5565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110be906156b0565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea906156b0565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b5050505050905090565b6111496120a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90615246565b60405180910390fd5b80600560006111c46120a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112716120a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112b69190615169565b60405180910390a35050565b6112d36112cd6120a0565b8361279b565b611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906153a6565b60405180910390fd5b61131e848484846132ae565b50505050565b606061132e61414e565b60405180610120016040528060ff815260200161595160ff913981600060118110611382577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061139383610ff5565b816001601181106113cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001615ab96028913981600260118110611428577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061143983610d04565b81600360118110611473577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161588660289139816004601181106114ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506114df83610a8a565b81600560118110611519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016159006028913981600660118110611574577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115858361103d565b816007601181106115bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615928602991398160086011811061161a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061162b83610b87565b81600960118110611665577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016158d76029913981600a601181106116c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116d183610bcf565b81600b6011811061170b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001615a506029913981600c60118110611766577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061177783610c17565b81600d601181106117b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016158ae6029913981600e6011811061180c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061181d83610adf565b81600f60118110611857577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816010601181106118cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060118110611913577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160118110611952577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260118110611991577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003601181106119d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460118110611a0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560118110611a4e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660118110611a8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600760118110611acc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189600860118110611b0b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611b2899989796959493929190614f60565b60405160208183030381529060405290508082600960118110611b74577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60118110611bb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60118110611bf2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c60118110611c31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d60118110611c70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60118110611caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60118110611cee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015189601060118110611d2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611d4a99989796959493929190614f60565b60405160208183030381529060405290506000611d97611d698661330a565b611d72846134b7565b604051602001611d839291906150bd565b6040516020818303038152906040526134b7565b905080604051602001611daa919061509b565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e626120a0565b73ffffffffffffffffffffffffffffffffffffffff16611e80611085565b73ffffffffffffffffffffffffffffffffffffffff1614611ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecd90615326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d906151e6565b60405180910390fd5b611f4f81612e04565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061201d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061202d575061202c82613675565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661211b83610e03565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61217b8282604051806020016040528060008152506136df565b5050565b6060600061218f8484600361373a565b9050600060405180602001604052806000815250905060018214156121eb576040518060400160405280600881526020017f446f776e746f776e000000000000000000000000000000000000000000000000815250905061226b565b6002821415612231576040518060400160405280600781526020017f5375627572627300000000000000000000000000000000000000000000000000815250905061226a565b6040518060400160405280600a81526020017f57696c6465726e6573730000000000000000000000000000000000000000000081525090505b5b6000848260405160200161228092919061506c565b604051602081830303815290604052905080935050505092915050565b606060006122ab84846137bd565b905060006040518060200160405280600081525090506003821415612307576040518060400160405280601481526020017f4265616e69652773205261696e626f77204361700000000000000000000000008152509050612769565b601282141561234d576040518060400160405280601581526020017f312c3030302c3030302042474c442057616c6c657400000000000000000000008152509050612768565b6004821415612393576040518060400160405280601581526020017f4c616d626f726768696e69204176656e7461646f7200000000000000000000008152509050612767565b60118214156123d9576040518060400160405280600d81526020017f537472697070657220506f6c65000000000000000000000000000000000000008152509050612766565b600582141561241f576040518060400160405280601081526020017f436f636b2052696e6720486f6c646572000000000000000000000000000000008152509050612765565b6010821415612465576040518060400160405280600d81526020017f496e66696e69747920506f6f6c000000000000000000000000000000000000008152509050612764565b60068214156124ab576040518060400160405280600f81526020017f38536c656570204d6174747265737300000000000000000000000000000000008152509050612763565b600f8214156124f1576040518060400160405280600b81526020017f507269766174652047796d0000000000000000000000000000000000000000008152509050612762565b6007821415612537576040518060400160405280600d81526020017f42726f6b656e20546f696c6574000000000000000000000000000000000000008152509050612761565b600e82141561257d576040518060400160405280600f81526020017f496e666c617461626c6520506f6f6c00000000000000000000000000000000008152509050612760565b60088214156125c3576040518060400160405280601281526020017f4d657263656465732042656e7a20433330300000000000000000000000000000815250905061275f565b600d821415612609576040518060400160405280600e81526020017f546f796f746120436f726f6c6c61000000000000000000000000000000000000815250905061275e565b600982141561264f576040518060400160405280600c81526020017f486f6e6461205369656e6e610000000000000000000000000000000000000000815250905061275d565b600c821415612695576040518060400160405280600c81526020017f45787069726564204d696c6b0000000000000000000000000000000000000000815250905061275c565b600b8214156126db576040518060400160405280601081526020017f437265616b79204675726e697475726500000000000000000000000000000000815250905061275b565b600a821415612721576040518060400160405280600a81526020017f313720696e636820545600000000000000000000000000000000000000000000815250905061275a565b6040518060400160405280600481526020017f4e6f6e650000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b6000848260405160200161277e92919061506c565b604051602081830303815290604052905080935050505092915050565b60006127a682612034565b6127e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127dc90615266565b60405180910390fd5b60006127f083610e03565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061285f57508373ffffffffffffffffffffffffffffffffffffffff166128478461071b565b73ffffffffffffffffffffffffffffffffffffffff16145b80612870575061286f8185611dc6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661289982610e03565b73ffffffffffffffffffffffffffffffffffffffff16146128ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e690615366565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690615226565b60405180910390fd5b61296a838383613945565b6129756000826120a8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129c591906155c6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a1c91906154e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000612ae384846137bd565b9050600060019050600a821480612afa5750600b82145b15612b085760019050612bd6565b6009821480612b175750600c82145b15612b255760029050612bd5565b6008821480612b345750600d82145b15612b425760039050612bd4565b6007821480612b515750600e82145b15612b5f5760049050612bd3565b6006821480612b6e5750600f82145b15612b7c5760059050612bd2565b6005821480612b8b5750601082145b15612b995760069050612bd1565b6004821480612ba85750601182145b15612bb65760079050612bd0565b6003821480612bc55750601282145b15612bcf57600890505b5b5b5b5b5b5b5b600084612be58360ff1661330a565b604051602001612bf692919061506c565b604051602081830303815290604052905080935050505092915050565b60606000612c2184846137bd565b905060006040518060200160405280600081525090506006821015612c7d576040518060400160405280600781526020017f4d616e73696f6e000000000000000000000000000000000000000000000000008152509050612dd2565b6009821015612cc3576040518060400160405280601281526020017f53696e676c652046616d696c7920486f6d6500000000000000000000000000008152509050612dd1565b600b821015612d09576040518060400160405280600581526020017f436f6e646f0000000000000000000000000000000000000000000000000000008152509050612dd0565b600d821415612d4f576040518060400160405280600981526020017f546f776e686f75736500000000000000000000000000000000000000000000008152509050612dcf565b600e821415612d95576040518060400160405280600581526020017f52616e63680000000000000000000000000000000000000000000000000000008152509050612dce565b6040518060400160405280600581526020017f536861636b00000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b60008482604051602001612de792919061506c565b604051602081830303815290604052905080935050505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000612eda8484600d61373a565b905060006040518060200160405280600081525090506001821415612f36576040518060400160405280601181526020017f53686974686f6c652c204e6f7768657265000000000000000000000000000000815250905061327c565b6002821415612f7c576040518060400160405280600c81526020017f4e657720596f726b2c204e590000000000000000000000000000000000000000815250905061327b565b6003821415612fc2576040518060400160405280600d81526020017f50617269732c204672616e636500000000000000000000000000000000000000815250905061327a565b6004821415613008576040518060400160405280600a81526020017f4c6f6e646f6e2c20554b000000000000000000000000000000000000000000008152509050613279565b600582141561304e576040518060400160405280600c81526020017f546f6b796f2c204a6170616e00000000000000000000000000000000000000008152509050613278565b6006821415613094576040518060400160405280600e81526020017f4265696a696e672c204368696e610000000000000000000000000000000000008152509050613277565b60078214156130da576040518060400160405280601181526020017f56616e636f757665722c2043616e6164610000000000000000000000000000008152509050613276565b6008821415613120576040518060400160405280601081526020017f54656c20417669762c2049737261656c000000000000000000000000000000008152509050613275565b6009821415613166576040518060400160405280601681526020017f416d7374657264616d2c204e65746865726c616e6473000000000000000000008152509050613274565b600a8214156131ac576040518060400160405280601981526020017f53616e204672616e636973636f2c2043616c69666f726e6961000000000000008152509050613273565b600b8214156131f2576040518060400160405280601781526020017f4c6f7320416e67656c65732c2043616c69666f726e69610000000000000000008152509050613272565b600c821415613238576040518060400160405280600e81526020017f4d69616d692c20466c6f726964610000000000000000000000000000000000008152509050613271565b6040518060400160405280600d81526020017f476172792c20496e6469616e610000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b5b5b5b6000848260405160200161329192919061506c565b604051602081830303815290604052905080935050505092915050565b6132b9848484612879565b6132c584848484613a59565b613304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fb906151c6565b60405180910390fd5b50505050565b60606000821415613352576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506134b2565b600082905060005b6000821461338457808061336d906156e2565b915050600a8261337d919061553b565b915061335a565b60008167ffffffffffffffff8111156133c6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133f85781602001600182028036833780820191505090505b5090505b600085146134ab5760018261341191906155c6565b9150600a85613420919061572b565b603061342c91906154e5565b60f81b818381518110613468577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134a4919061553b565b94506133fc565b8093505050505b919050565b606060008251905060008114156134e05760405180602001604052806000815250915050613670565b600060036002836134f191906154e5565b6134fb919061553b565b6004613507919061556c565b9050600060208261351891906154e5565b67ffffffffffffffff811115613557577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135895781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615a79604091399050600181016020830160005b8681101561362d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506135b4565b506003860660018114613647576002811461365757613662565b613d3d60f01b6002830352613662565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136e98383613bf0565b6136f66000848484613a59565b613735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372c906151c6565b60405180910390fd5b505050565b600080836137478661330a565b60405160200161375892919061503d565b6040516020818303038152906040529050600060018460ff16836040516020016137829190614f49565b6040516020818303038152906040528051906020012060001c6137a5919061572b565b6137af91906154e5565b905080925050509392505050565b600080826137ca8561330a565b6040516020016137db92919061503d565b60405160208183030381529060405290506000836137f88661330a565b60405160200161380992919061500e565b60405160208183030381529060405290506000846138268761330a565b604051602001613837929190614fdf565b60405160208183030381529060405290506000600160068560405160200161385f9190614f49565b6040516020818303038152906040528051906020012060001c613882919061572b565b61388c91906154e5565b9050600060016006856040516020016138a59190614f49565b6040516020818303038152906040528051906020012060001c6138c8919061572b565b6138d291906154e5565b9050600060016006856040516020016138eb9190614f49565b6040516020818303038152906040528051906020012060001c61390e919061572b565b61391891906154e5565b9050600081838561392991906154e5565b61393391906154e5565b90508097505050505050505092915050565b613950838383613dbe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139935761398e81613dc3565b6139d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146139d1576139d08382613e0c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a1557613a1081613f79565b613a54565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613a5357613a5282826140bc565b5b5b505050565b6000613a7a8473ffffffffffffffffffffffffffffffffffffffff1661413b565b15613be3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613aa36120a0565b8786866040518563ffffffff1660e01b8152600401613ac5949392919061511d565b602060405180830381600087803b158015613adf57600080fd5b505af1925050508015613b1057506040513d601f19601f82011682018060405250810190613b0d9190614455565b60015b613b93573d8060008114613b40576040519150601f19603f3d011682016040523d82523d6000602084013e613b45565b606091505b50600081511415613b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b82906151c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613be8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c57906152e6565b60405180910390fd5b613c6981612034565b15613ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ca090615206565b60405180910390fd5b613cb560008383613945565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d0591906154e5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e1984610eb5565b613e2391906155c6565b9050600060076000848152602001908152602001600020549050818114613f08576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613f8d91906155c6565b9050600060096000848152602001908152602001600020549050600060088381548110613fe3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061402b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806140a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006140c783610eb5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b6040518061022001604052806011905b606081526020019060019003908161415e5790505090565b600061418961418484615472565b615441565b9050828152602081018484840111156141a157600080fd5b6141ac84828561566e565b509392505050565b6000813590506141c381615829565b92915050565b6000815190506141d881615829565b92915050565b6000813590506141ed81615840565b92915050565b60008135905061420281615857565b92915050565b60008151905061421781615857565b92915050565b600082601f83011261422e57600080fd5b813561423e848260208601614176565b91505092915050565b6000813590506142568161586e565b92915050565b60006020828403121561426e57600080fd5b600061427c848285016141b4565b91505092915050565b60006020828403121561429757600080fd5b60006142a5848285016141c9565b91505092915050565b600080604083850312156142c157600080fd5b60006142cf858286016141b4565b92505060206142e0858286016141b4565b9150509250929050565b6000806000606084860312156142ff57600080fd5b600061430d868287016141b4565b935050602061431e868287016141b4565b925050604061432f86828701614247565b9150509250925092565b6000806000806080858703121561434f57600080fd5b600061435d878288016141b4565b945050602061436e878288016141b4565b935050604061437f87828801614247565b925050606085013567ffffffffffffffff81111561439c57600080fd5b6143a88782880161421d565b91505092959194509250565b600080604083850312156143c757600080fd5b60006143d5858286016141b4565b92505060206143e6858286016141de565b9150509250929050565b6000806040838503121561440357600080fd5b6000614411858286016141b4565b925050602061442285828601614247565b9150509250929050565b60006020828403121561443e57600080fd5b600061444c848285016141f3565b91505092915050565b60006020828403121561446757600080fd5b600061447584828501614208565b91505092915050565b60006020828403121561449057600080fd5b600061449e84828501614247565b91505092915050565b6144b0816155fa565b82525050565b6144bf8161560c565b82525050565b60006144d0826154a2565b6144da81856154b8565b93506144ea81856020860161567d565b6144f381615818565b840191505092915050565b6000614509826154ad565b61451381856154c9565b935061452381856020860161567d565b61452c81615818565b840191505092915050565b6000614542826154ad565b61454c81856154da565b935061455c81856020860161567d565b80840191505092915050565b6000614575602b836154c9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006145db6032836154c9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006146416026836154c9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a7601c836154c9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006146e76001836154da565b91507f33000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006147276024836154c9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061478d6019836154c9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006147cd602c836154c9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006148336038836154c9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614899602a836154c9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006148ff6029836154c9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006149656002836154da565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006149a56020836154c9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006149e5602c836154c9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a4b6020836154c9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a8b6010836154c9565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b6000614acb6029836154c9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b316001836154da565b91507f32000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614b716021836154c9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614bd7601d836154da565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614c176031836154c9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614c7d6001836154da565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614cbd60cf836154da565b91507f222c20226465736372697074696f6e223a2022426c6f6f74205265616c20457360008301527f74617465204d61726b657420286e6f7420666f72205765616b7329206973206160208301527f20636f6c6c656374696f6e206f66206e6f6e2d66756e6769626c6520746f6b6560408301527f6e732073746f726564206f6e2074686520457468657265756d20426c6f636b6360608301527f6861696e2c20746f206265207573656420696e2074686520426c6f6f74206d6560808301527f746176657273652e222c2022696d616765223a2022646174613a696d6167652f60a08301527f7376672b786d6c3b6261736536342c000000000000000000000000000000000060c083015260cf82019050919050565b6000614de1602c836154c9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614e476002836154da565b91507f3a200000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614e876016836154da565b91507f7b226e616d65223a2022426c6f6f7420486f6d652023000000000000000000006000830152601682019050919050565b6000614ec7601f836154c9565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000614f07600f836154c9565b91507f4e6f7420426c6f6f74206f776e657200000000000000000000000000000000006000830152602082019050919050565b614f4381615664565b82525050565b6000614f558284614537565b915081905092915050565b6000614f6c828c614537565b9150614f78828b614537565b9150614f84828a614537565b9150614f908289614537565b9150614f9c8288614537565b9150614fa88287614537565b9150614fb48286614537565b9150614fc08285614537565b9150614fcc8284614537565b91508190509a9950505050505050505050565b6000614feb8285614537565b9150614ff78284614537565b9150615002826146da565b91508190509392505050565b600061501a8285614537565b91506150268284614537565b915061503182614b24565b91508190509392505050565b60006150498285614537565b91506150558284614537565b915061506082614c70565b91508190509392505050565b60006150788285614537565b915061508382614e3a565b915061508f8284614537565b91508190509392505050565b60006150a682614bca565b91506150b28284614537565b915081905092915050565b60006150c882614e7a565b91506150d48285614537565b91506150df82614cb0565b91506150eb8284614537565b91506150f682614958565b91508190509392505050565b600060208201905061511760008301846144a7565b92915050565b600060808201905061513260008301876144a7565b61513f60208301866144a7565b61514c6040830185614f3a565b818103606083015261515e81846144c5565b905095945050505050565b600060208201905061517e60008301846144b6565b92915050565b6000602082019050818103600083015261519e81846144fe565b905092915050565b600060208201905081810360008301526151bf81614568565b9050919050565b600060208201905081810360008301526151df816145ce565b9050919050565b600060208201905081810360008301526151ff81614634565b9050919050565b6000602082019050818103600083015261521f8161469a565b9050919050565b6000602082019050818103600083015261523f8161471a565b9050919050565b6000602082019050818103600083015261525f81614780565b9050919050565b6000602082019050818103600083015261527f816147c0565b9050919050565b6000602082019050818103600083015261529f81614826565b9050919050565b600060208201905081810360008301526152bf8161488c565b9050919050565b600060208201905081810360008301526152df816148f2565b9050919050565b600060208201905081810360008301526152ff81614998565b9050919050565b6000602082019050818103600083015261531f816149d8565b9050919050565b6000602082019050818103600083015261533f81614a3e565b9050919050565b6000602082019050818103600083015261535f81614a7e565b9050919050565b6000602082019050818103600083015261537f81614abe565b9050919050565b6000602082019050818103600083015261539f81614b64565b9050919050565b600060208201905081810360008301526153bf81614c0a565b9050919050565b600060208201905081810360008301526153df81614dd4565b9050919050565b600060208201905081810360008301526153ff81614eba565b9050919050565b6000602082019050818103600083015261541f81614efa565b9050919050565b600060208201905061543b6000830184614f3a565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615468576154676157e9565b5b8060405250919050565b600067ffffffffffffffff82111561548d5761548c6157e9565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006154f082615664565b91506154fb83615664565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156155305761552f61575c565b5b828201905092915050565b600061554682615664565b915061555183615664565b9250826155615761556061578b565b5b828204905092915050565b600061557782615664565b915061558283615664565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156155bb576155ba61575c565b5b828202905092915050565b60006155d182615664565b91506155dc83615664565b9250828210156155ef576155ee61575c565b5b828203905092915050565b600061560582615644565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561569b578082015181840152602081019050615680565b838111156156aa576000848401525b50505050565b600060028204905060018216806156c857607f821691505b602082108114156156dc576156db6157ba565b5b50919050565b60006156ed82615664565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156157205761571f61575c565b5b600182019050919050565b600061573682615664565b915061574183615664565b9250826157515761575061578b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615832816155fa565b811461583d57600080fd5b50565b6158498161560c565b811461585457600080fd5b50565b61586081615618565b811461586b57600080fd5b50565b61587781615664565b811461588257600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220209900025d64b295f7f6d61fe8ff39159136f595c3d651801c332a4a4f72fc2564736f6c63430008000033

Deployed Bytecode Sourcemap

44632:11437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38482:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25596:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27155:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26678:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55004:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46118:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39122:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46852:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28045:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46411:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46556:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46704;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38790:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45984:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28455:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39312:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25290:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25020:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9988:94;;;:::i;:::-;;45838:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46272:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9337:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25765:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27448:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28711:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52944:2048;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27814:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10237:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38482:224;38584:4;38623:35;38608:50;;;:11;:50;;;;:90;;;;38662:36;38686:11;38662:23;:36::i;:::-;38608:90;38601:97;;38482:224;;;:::o;25596:100::-;25650:13;25683:5;25676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25596:100;:::o;27155:221::-;27231:7;27259:16;27267:7;27259;:16::i;:::-;27251:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27344:15;:24;27360:7;27344:24;;;;;;;;;;;;;;;;;;;;;27337:31;;27155:221;;;:::o;26678:411::-;26759:13;26775:23;26790:7;26775:14;:23::i;:::-;26759:39;;26823:5;26817:11;;:2;:11;;;;26809:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26917:5;26901:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26926:37;26943:5;26950:12;:10;:12::i;:::-;26926:16;:37::i;:::-;26901:62;26879:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27060:21;27069:2;27073:7;27060:8;:21::i;:::-;26678:411;;;:::o;55004:260::-;12276:1;12872:7;;:19;;12864:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12276:1;13005:7;:18;;;;55098:1:::1;55088:7;:11;:29;;;;;55113:4;55103:7;:14;55088:29;55080:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55183:10;55157:36;;:5;;;;;;;;;;;:13;;;55171:7;55157:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;;55149:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55224:32;55234:12;:10;:12::i;:::-;55248:7;55224:9;:32::i;:::-;12232:1:::0;13184:7;:22;;;;55004:260;:::o;46118:142::-;46179:13;46212:40;46228:7;46212:40;;;;;;;;;;;;;;;;;:15;:40::i;:::-;46205:47;;46118:142;;;:::o;39122:113::-;39183:7;39210:10;:17;;;;39203:24;;39122:113;:::o;46852:140::-;46913:13;46946:38;46961:7;46946:38;;;;;;;;;;;;;;;;;:14;:38::i;:::-;46939:45;;46852:140;;;:::o;28045:339::-;28240:41;28259:12;:10;:12::i;:::-;28273:7;28240:18;:41::i;:::-;28232:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28348:28;28358:4;28364:2;28368:7;28348:9;:28::i;:::-;28045:339;;;:::o;46411:133::-;46471:13;46504:32;46515:7;46504:32;;;;;;;;;;;;;;;;;:10;:32::i;:::-;46497:39;;46411:133;;;:::o;46556:140::-;46617:13;46650:38;46665:7;46650:38;;;;;;;;;;;;;;;;;:14;:38::i;:::-;46643:45;;46556:140;;;:::o;46704:::-;46765:13;46798:38;46813:7;46798:38;;;;;;;;;;;;;;;;;:14;:38::i;:::-;46791:45;;46704:140;;;:::o;38790:256::-;38887:7;38923:23;38940:5;38923:16;:23::i;:::-;38915:5;:31;38907:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39012:12;:19;39025:5;39012:19;;;;;;;;;;;;;;;:26;39032:5;39012:26;;;;;;;;;;;;39005:33;;38790:256;;;;:::o;45984:122::-;46039:13;46072:26;46082:7;46072:26;;;;;;;;;;;;;;;;;:9;:26::i;:::-;46065:33;;45984:122;;;:::o;28455:185::-;28593:39;28610:4;28616:2;28620:7;28593:39;;;;;;;;;;;;:16;:39::i;:::-;28455:185;;;:::o;39312:233::-;39387:7;39423:30;:28;:30::i;:::-;39415:5;:38;39407:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39520:10;39531:5;39520:17;;;;;;;;;;;;;;;;;;;;;;;;39513:24;;39312:233;;;:::o;25290:239::-;25362:7;25382:13;25398:7;:16;25406:7;25398:16;;;;;;;;;;;;;;;;;;;;;25382:32;;25450:1;25433:19;;:5;:19;;;;25425:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25516:5;25509:12;;;25290:239;;;:::o;25020:208::-;25092:7;25137:1;25120:19;;:5;:19;;;;25112:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25204:9;:16;25214:5;25204:16;;;;;;;;;;;;;;;;25197:23;;25020:208;;;:::o;9988:94::-;9568:12;:10;:12::i;:::-;9557:23;;:7;:5;:7::i;:::-;:23;;;9549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10053:21:::1;10071:1;10053:9;:21::i;:::-;9988:94::o:0;45838:134::-;45897:13;45930:34;45944:7;45930:34;;;;;;;;;;;;;;;;;:13;:34::i;:::-;45923:41;;45838:134;;;:::o;46272:131::-;46331:13;46364:31;46375:7;46364:31;;;;;;;;;;;;;;;;;:10;:31::i;:::-;46357:38;;46272:131;;;:::o;9337:87::-;9383:7;9410:6;;;;;;;;;;;9403:13;;9337:87;:::o;25765:104::-;25821:13;25854:7;25847:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25765:104;:::o;27448:295::-;27563:12;:10;:12::i;:::-;27551:24;;:8;:24;;;;27543:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27663:8;27618:18;:32;27637:12;:10;:12::i;:::-;27618:32;;;;;;;;;;;;;;;:42;27651:8;27618:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27716:8;27687:48;;27702:12;:10;:12::i;:::-;27687:48;;;27726:8;27687:48;;;;;;:::i;:::-;;;;;;;;27448:295;;:::o;28711:328::-;28886:41;28905:12;:10;:12::i;:::-;28919:7;28886:18;:41::i;:::-;28878:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28992:39;29006:4;29012:2;29016:7;29025:5;28992:13;:39::i;:::-;28711:328;;;;:::o;52944:2048::-;53009:13;53035:23;;:::i;:::-;53069:268;;;;;;;;;;;;;;;;;:5;53075:1;53069:8;;;;;;;;;;;;;;;;;;:268;;;;53361:20;53373:7;53361:11;:20::i;:::-;53350:5;53356:1;53350:8;;;;;;;;;;;;;;;;;;:31;;;;53394:53;;;;;;;;;;;;;;;;;:5;53400:1;53394:8;;;;;;;;;;;;;;;;;;:53;;;;53471:16;53479:7;53471;:16::i;:::-;53460:5;53466:1;53460:8;;;;;;;;;;;;;;;;;;:27;;;;53500:53;;;;;;;;;;;;;;;;;:5;53506:1;53500:8;;;;;;;;;;;;;;;;;;:53;;;;53577:22;53591:7;53577:13;:22::i;:::-;53566:5;53572:1;53566:8;;;;;;;;;;;;;;;;;;:33;;;;53612:53;;;;;;;;;;;;;;;;;:5;53618:1;53612:8;;;;;;;;;;;;;;;;;;:53;;;;53689:20;53701:7;53689:11;:20::i;:::-;53678:5;53684:1;53678:8;;;;;;;;;;;;;;;;;;:31;;;;53722:54;;;;;;;;;;;;;;;;;:5;53728:1;53722:8;;;;;;;;;;;;;;;;;;:54;;;;53800:21;53813:7;53800:12;:21::i;:::-;53789:5;53795:1;53789:8;;;;;;;;;;;;;;;;;;:32;;;;53834:55;;;;;;;;;;;;;;;;;:5;53840:2;53834:9;;;;;;;;;;;;;;;;;;:55;;;;53914:22;53928:7;53914:13;:22::i;:::-;53902:5;53908:2;53902:9;;;;;;;;;;;;;;;;;;:34;;;;53949:55;;;;;;;;;;;;;;;;;:5;53955:2;53949:9;;;;;;;;;;;;;;;;;;:55;;;;54029:22;54043:7;54029:13;:22::i;:::-;54017:5;54023:2;54017:9;;;;;;;;;;;;;;;;;;:34;;;;54064:55;;;;;;;;;;;;;;;;;:5;54070:2;54064:9;;;;;;;;;;;;;;;;;;:55;;;;54144:22;54158:7;54144:13;:22::i;:::-;54132:5;54138:2;54132:9;;;;;;;;;;;;;;;;;;:34;;;;54179:27;;;;;;;;;;;;;;;;;:5;54185:2;54179:9;;;;;;;;;;;;;;;;;;:27;;;;54219:20;54266:5;54272:1;54266:8;;;;;;;;;;;;;;;;;;;54276:5;54282:1;54276:8;;;;;;;;;;;;;;;;;;;54286:5;54292:1;54286:8;;;;;;;;;;;;;;;;;;;54296:5;54302:1;54296:8;;;;;;;;;;;;;;;;;;;54306:5;54312:1;54306:8;;;;;;;;;;;;;;;;;;;54316:5;54322:1;54316:8;;;;;;;;;;;;;;;;;;;54326:5;54332:1;54326:8;;;;;;;;;;;;;;;;;;;54336:5;54342:1;54336:8;;;;;;;;;;;;;;;;;;;54346:5;54352:1;54346:8;;;;;;;;;;;;;;;;;;;54249:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54219:137;;54400:6;54408:5;54414:1;54408:8;;;;;;;;;;;;;;;;;;;54418:5;54424:2;54418:9;;;;;;;;;;;;;;;;;;;54429:5;54435:2;54429:9;;;;;;;;;;;;;;;;;;;54440:5;54446:2;54440:9;;;;;;;;;;;;;;;;;;;54451:5;54457:2;54451:9;;;;;;;;;;;;;;;;;;;54462:5;54468:2;54462:9;;;;;;;;;;;;;;;;;;;54473:5;54479:2;54473:9;;;;;;;;;;;;;;;;;;;54484:5;54490:2;54484:9;;;;;;;;;;;;;;;;;;;54383:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54367:128;;54516:18;54537:338;54607:17;54616:7;54607:8;:17::i;:::-;54837:28;54857:6;54837:13;:28::i;:::-;54564:308;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54537:13;:338::i;:::-;54516:359;;54952:4;54902:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;54886:72;;54978:6;54971:13;;;;;52944:2048;;;:::o;27814:164::-;27911:4;27935:18;:25;27954:5;27935:25;;;;;;;;;;;;;;;:35;27961:8;27935:35;;;;;;;;;;;;;;;;;;;;;;;;;27928:42;;27814:164;;;;:::o;10237:192::-;9568:12;:10;:12::i;:::-;9557:23;;:7;:5;:7::i;:::-;:23;;;9549:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10346:1:::1;10326:22;;:8;:22;;;;10318:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10402:19;10412:8;10402:9;:19::i;:::-;10237:192:::0;:::o;24651:305::-;24753:4;24805:25;24790:40;;;:11;:40;;;;:105;;;;24862:33;24847:48;;;:11;:48;;;;24790:105;:158;;;;24912:36;24936:11;24912:23;:36::i;:::-;24790:158;24770:178;;24651:305;;;:::o;30549:127::-;30614:4;30666:1;30638:30;;:7;:16;30646:7;30638:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30631:37;;30549:127;;;:::o;8197:98::-;8250:7;8277:10;8270:17;;8197:98;:::o;34531:174::-;34633:2;34606:15;:24;34622:7;34606:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34689:7;34685:2;34651:46;;34660:23;34675:7;34660:14;:23::i;:::-;34651:46;;;;;;;;;;;;34531:174;;:::o;31533:110::-;31609:26;31619:2;31623:7;31609:26;;;;;;;;;;;;:9;:26::i;:::-;31533:110;;:::o;49706:512::-;49796:13;49822:12;49837:30;49845:7;49854:9;49865:1;49837:7;:30::i;:::-;49822:45;;49878:18;:23;;;;;;;;;;;;;;49924:1;49916:4;:9;49912:192;;;49942:17;;;;;;;;;;;;;;;;;;;49912:192;;;49998:1;49990:4;:9;49986:118;;;50016:16;;;;;;;;;;;;;;;;;;;49986:118;;;50073:19;;;;;;;;;;;;;;;;;;;49986:118;49912:192;50116:20;50163:9;50180:4;50146:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50116:70;;50204:6;50197:13;;;;;49706:512;;;;:::o;51177:1757::-;51266:13;51292:12;51307:27;51315:7;51324:9;51307:7;:27::i;:::-;51292:42;;51345:23;:28;;;;;;;;;;;;;;51396:1;51388:4;:9;51384:1431;;;51414:34;;;;;;;;;;;;;;;;;;;51384:1431;;;51487:2;51479:4;:10;51475:1340;;;51506:35;;;;;;;;;;;;;;;;;;;51475:1340;;;51580:1;51572:4;:9;51568:1247;;;51598:35;;;;;;;;;;;;;;;;;;;51568:1247;;;51672:2;51664:4;:10;51660:1155;;;51691:27;;;;;;;;;;;;;;;;;;;51660:1155;;;51757:1;51749:4;:9;51745:1070;;;51775:30;;;;;;;;;;;;;;;;;;;51745:1070;;;51844:2;51836:4;:10;51832:983;;;51863:27;;;;;;;;;;;;;;;;;;;51832:983;;;51929:1;51921:4;:9;51917:898;;;51947:29;;;;;;;;;;;;;;;;;;;51917:898;;;52015:2;52007:4;:10;52003:812;;;52034:25;;;;;;;;;;;;;;;;;;;52003:812;;;52098:1;52090:4;:9;52086:729;;;52116:27;;;;;;;;;;;;;;;;;;;52086:729;;;52182:2;52174:4;:10;52170:645;;;52201:29;;;;;;;;;;;;;;;;;;;52170:645;;;52269:1;52261:4;:9;52257:558;;;52287:32;;;;;;;;;;;;;;;;;;;52257:558;;;52358:2;52350:4;:10;52346:469;;;52377:28;;;;;;;;;;;;;;;;;;;52346:469;;;52444:1;52436:4;:9;52432:383;;;52462:26;;;;;;;;;;;;;;;;;;;52432:383;;;52527:2;52519:4;:10;52515:300;;;52547:26;;;;;;;;;;;;;;;;;;;52515:300;;;52612:2;52604:4;:10;52600:215;;;52631:30;;;;;;;;;;;;;;;;;;;52600:215;;;52700:2;52692:4;:10;52688:127;;;52719:24;;;;;;;;;;;;;;;;;;;52688:127;;;52785:18;;;;;;;;;;;;;;;;;;;52688:127;52600:215;52515:300;52432:383;52346:469;52257:558;52170:645;52086:729;52003:812;51917:898;51832:983;51745:1070;51660:1155;51568:1247;51475:1340;51384:1431;52827:20;52874:9;52891;52857:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52827:75;;52920:6;52913:13;;;;;51177:1757;;;;:::o;30843:348::-;30936:4;30961:16;30969:7;30961;:16::i;:::-;30953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31037:13;31053:23;31068:7;31053:14;:23::i;:::-;31037:39;;31106:5;31095:16;;:7;:16;;;:51;;;;31139:7;31115:31;;:20;31127:7;31115:11;:20::i;:::-;:31;;;31095:51;:87;;;;31150:32;31167:5;31174:7;31150:16;:32::i;:::-;31095:87;31087:96;;;30843:348;;;;:::o;33835:578::-;33994:4;33967:31;;:23;33982:7;33967:14;:23::i;:::-;:31;;;33959:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34077:1;34063:16;;:2;:16;;;;34055:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34133:39;34154:4;34160:2;34164:7;34133:20;:39::i;:::-;34237:29;34254:1;34258:7;34237:8;:29::i;:::-;34298:1;34279:9;:15;34289:4;34279:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34327:1;34310:9;:13;34320:2;34310:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34358:2;34339:7;:16;34347:7;34339:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34397:7;34393:2;34378:27;;34387:4;34378:27;;;;;;;;;;;;33835:578;;;:::o;50226:943::-;50311:13;50337:12;50352:27;50360:7;50369:9;50352:7;:27::i;:::-;50337:42;;50390:11;50404:1;50390:15;;50430:2;50422:4;:10;:24;;;;50444:2;50436:4;:10;50422:24;50418:626;;;50471:1;50463:9;;50418:626;;;50511:1;50503:4;:9;:23;;;;50524:2;50516:4;:10;50503:23;50499:545;;;50551:1;50543:9;;50499:545;;;50591:1;50583:4;:9;:23;;;;50604:2;50596:4;:10;50583:23;50579:465;;;50631:1;50623:9;;50579:465;;;50671:1;50663:4;:9;:23;;;;50684:2;50676:4;:10;50663:23;50659:385;;;50711:1;50703:9;;50659:385;;;50751:1;50743:4;:9;:23;;;;50764:2;50756:4;:10;50743:23;50739:305;;;50791:1;50783:9;;50739:305;;;50831:1;50823:4;:9;:23;;;;50844:2;50836:4;:10;50823:23;50819:225;;;50871:1;50863:9;;50819:225;;;50911:1;50903:4;:9;:23;;;;50924:2;50916:4;:10;50903:23;50899:145;;;50951:1;50943:9;;50899:145;;;50991:1;50983:4;:9;:23;;;;51004:2;50996:4;:10;50983:23;50979:65;;;51031:1;51023:9;;50979:65;50899:145;50819:225;50739:305;50659:385;50579:465;50499:545;50418:626;51056:20;51103:9;51120:15;51129:5;51120:15;;:8;:15::i;:::-;51086:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51056:81;;51155:6;51148:13;;;;;50226:943;;;;:::o;48940:758::-;49024:13;49050:12;49065:27;49073:7;49082:9;49065:7;:27::i;:::-;49050:42;;49103:22;:27;;;;;;;;;;;;;;49152:1;49145:4;:8;49141:439;;;49170:20;;;;;;;;;;;;;;;;;;;49141:439;;;49228:1;49221:4;:8;49217:363;;;49246:31;;;;;;;;;;;;;;;;;;;49217:363;;;49315:2;49308:4;:9;49304:276;;;49334:18;;;;;;;;;;;;;;;;;;;49304:276;;;49391:2;49383:4;:10;49379:201;;;49410:22;;;;;;;;;;;;;;;;;;;49379:201;;;49471:2;49463:4;:10;49459:121;;;49490:18;;;;;;;;;;;;;;;;;;;49459:121;;;49550:18;;;;;;;;;;;;;;;;;;;49459:121;49379:201;49304:276;49217:363;49141:439;49592:20;49639:9;49656:8;49622:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49592:74;;49684:6;49677:13;;;;;48940:758;;;;:::o;10437:173::-;10493:16;10512:6;;;;;;;;;;;10493:25;;10538:8;10529:6;;:17;;;;;;;;;;;;;;;;;;10593:8;10562:40;;10583:8;10562:40;;;;;;;;;;;;10437:173;;:::o;47514:1418::-;47602:13;47628:12;47643:31;47651:7;47660:9;47671:2;47643:7;:31::i;:::-;47628:46;;47685:22;:27;;;;;;;;;;;;;;47735:1;47727:4;:9;47723:1091;;;47753:30;;;;;;;;;;;;;;;;;;;47723:1091;;;47822:1;47814:4;:9;47810:1004;;;47840:25;;;;;;;;;;;;;;;;;;;47810:1004;;;47904:1;47896:4;:9;47892:922;;;47922:26;;;;;;;;;;;;;;;;;;;47892:922;;;47987:1;47979:4;:9;47975:839;;;48005:23;;;;;;;;;;;;;;;;;;;47975:839;;;48067:1;48059:4;:9;48055:759;;;48085:25;;;;;;;;;;;;;;;;;;;48055:759;;;48149:1;48141:4;:9;48137:677;;;48167:27;;;;;;;;;;;;;;;;;;;48137:677;;;48233:1;48225:4;:9;48221:593;;;48251:30;;;;;;;;;;;;;;;;;;;48221:593;;;48320:1;48312:4;:9;48308:506;;;48338:29;;;;;;;;;;;;;;;;;;;48308:506;;;48406:1;48398:4;:9;48394:420;;;48424:35;;;;;;;;;;;;;;;;;;;48394:420;;;48498:2;48490:4;:10;48486:328;;;48517:38;;;;;;;;;;;;;;;;;;;48486:328;;;48594:2;48586:4;:10;48582:232;;;48613:36;;;;;;;;;;;;;;;;;;;48582:232;;;48688:2;48680:4;:10;48676:138;;;48707:27;;;;;;;;;;;;;;;;;;;48676:138;;;48776:26;;;;;;;;;;;;;;;;;;;48676:138;48582:232;48486:328;48394:420;48308:506;48221:593;48137:677;48055:759;47975:839;47892:922;47810:1004;47723:1091;48826:20;48873:9;48890:8;48856:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48826:74;;48918:6;48911:13;;;;;47514:1418;;;;:::o;29921:315::-;30078:28;30088:4;30094:2;30098:7;30078:9;:28::i;:::-;30125:48;30148:4;30154:2;30158:7;30167:5;30125:22;:48::i;:::-;30117:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29921:315;;;;:::o;55276:715::-;55332:13;55554:1;55545:5;:10;55541:53;;;55572:10;;;;;;;;;;;;;;;;;;;;;55541:53;55604:12;55619:5;55604:20;;55635:14;55660:78;55675:1;55667:4;:9;55660:78;;55693:8;;;;;:::i;:::-;;;;55724:2;55716:10;;;;;:::i;:::-;;;55660:78;;;55748:19;55780:6;55770:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55748:39;;55798:154;55814:1;55805:5;:10;55798:154;;55842:1;55832:11;;;;;:::i;:::-;;;55909:2;55901:5;:10;;;;:::i;:::-;55888:2;:24;;;;:::i;:::-;55875:39;;55858:6;55865;55858:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;55938:2;55929:11;;;;;:::i;:::-;;;55798:154;;;55976:6;55962:21;;;;;55276:715;;;;:::o;56420:1607::-;56478:13;56504:11;56518:4;:11;56504:25;;56551:1;56544:3;:8;56540:23;;;56554:9;;;;;;;;;;;;;;;;;56540:23;56615:18;56653:1;56648;56642:3;:7;;;;:::i;:::-;56641:13;;;;:::i;:::-;56636:1;:19;;;;:::i;:::-;56615:40;;56713:19;56758:2;56745:10;:15;;;;:::i;:::-;56735:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56713:48;;56774:18;56795:5;;;;;;;;;;;;;;;;;56774:26;;56864:1;56857:5;56853:13;56909:2;56901:6;56897:15;56960:1;56928:777;56983:3;56980:1;56977:10;56928:777;;;57038:1;57035;57031:9;57026:14;;57096:8;57091:1;57085:4;57081:12;57075:19;57071:34;57176:4;57168:5;57164:2;57160:14;57156:25;57146:8;57142:40;57136:47;57215:3;57212:1;57208:11;57201:18;;57306:4;57297;57289:5;57285:2;57281:14;57277:25;57267:8;57263:40;57257:47;57253:58;57248:3;57244:68;57237:75;;57344:3;57341:1;57337:11;57330:18;;57434:4;57425;57417:5;57414:1;57410:13;57406:24;57396:8;57392:39;57386:46;57382:57;57377:3;57373:67;57366:74;;57472:3;57469:1;57465:11;57458:18;;57554:4;57545;57538:5;57534:16;57524:8;57520:31;57514:38;57510:49;57505:3;57501:59;57494:66;;57594:3;57589;57585:13;57578:20;;57636:3;57625:9;57618:22;57688:1;57677:9;57673:17;57660:30;;57007:698;;56928:777;;;56932:44;57737:1;57732:3;57728:11;57758:1;57753:84;;;;57856:1;57851:82;;;;57721:212;;57753:84;57814:6;57809:3;57805:16;57801:1;57790:9;57786:17;57779:43;57753:84;;57851:82;57912:4;57907:3;57903:14;57899:1;57888:9;57884:17;57877:41;57721:212;;57964:10;57956:6;57949:26;56822:1164;;58012:6;57998:21;;;;;;56420:1607;;;;:::o;23258:157::-;23343:4;23382:25;23367:40;;;:11;:40;;;;23360:47;;23258:157;;;:::o;31870:321::-;32000:18;32006:2;32010:7;32000:5;:18::i;:::-;32051:54;32082:1;32086:2;32090:7;32099:5;32051:22;:54::i;:::-;32029:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31870:321;;;:::o;44825:301::-;44916:7;44936:19;44982:9;44993:17;45002:7;44993:8;:17::i;:::-;44965:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44936:81;;45028:12;45095:1;45090;45044:47;;45079:5;45062:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;45052:34;;;;;;45044:43;;:47;;;;:::i;:::-;45043:53;;;;:::i;:::-;45028:68;;45114:4;45107:11;;;;44825:301;;;;;:::o;45134:692::-;45216:7;45236:20;45283:9;45294:17;45303:7;45294:8;:17::i;:::-;45266:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45236:82;;45329:20;45376:9;45387:17;45396:7;45387:8;:17::i;:::-;45359:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45329:82;;45422:20;45469:9;45480:17;45489:7;45480:8;:17::i;:::-;45452:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45422:82;;45517:13;45586:1;45581;45569:6;45552:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;45542:35;;;;;;45534:44;;:48;;;;:::i;:::-;45533:54;;;;:::i;:::-;45517:70;;45598:13;45667:1;45662;45650:6;45633:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;45623:35;;;;;;45615:44;;:48;;;;:::i;:::-;45614:54;;;;:::i;:::-;45598:70;;45679:13;45748:1;45743;45731:6;45714:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;45704:35;;;;;;45696:44;;:48;;;;:::i;:::-;45695:54;;;;:::i;:::-;45679:70;;45762:11;45792:5;45784;45776;:13;;;;:::i;:::-;:21;;;;:::i;:::-;45762:35;;45815:3;45808:10;;;;;;;;;45134:692;;;;:::o;40158:589::-;40302:45;40329:4;40335:2;40339:7;40302:26;:45::i;:::-;40380:1;40364:18;;:4;:18;;;40360:187;;;40399:40;40431:7;40399:31;:40::i;:::-;40360:187;;;40469:2;40461:10;;:4;:10;;;40457:90;;40488:47;40521:4;40527:7;40488:32;:47::i;:::-;40457:90;40360:187;40575:1;40561:16;;:2;:16;;;40557:183;;;40594:45;40631:7;40594:36;:45::i;:::-;40557:183;;;40667:4;40661:10;;:2;:10;;;40657:83;;40688:40;40716:2;40720:7;40688:27;:40::i;:::-;40657:83;40557:183;40158:589;;;:::o;35270:803::-;35425:4;35446:15;:2;:13;;;:15::i;:::-;35442:624;;;35498:2;35482:36;;;35519:12;:10;:12::i;:::-;35533:4;35539:7;35548:5;35482:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35478:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35745:1;35728:6;:13;:18;35724:272;;;35771:60;;;;;;;;;;:::i;:::-;;;;;;;;35724:272;35946:6;35940:13;35931:6;35927:2;35923:15;35916:38;35478:533;35615:45;;;35605:55;;;:6;:55;;;;35598:62;;;;;35442:624;36050:4;36043:11;;35270:803;;;;;;;:::o;32527:382::-;32621:1;32607:16;;:2;:16;;;;32599:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32680:16;32688:7;32680;:16::i;:::-;32679:17;32671:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32742:45;32771:1;32775:2;32779:7;32742:20;:45::i;:::-;32817:1;32800:9;:13;32810:2;32800:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32848:2;32829:7;:16;32837:7;32829:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32893:7;32889:2;32868:33;;32885:1;32868:33;;;;;;;;;;;;32527:382;;:::o;36645:126::-;;;;:::o;41470:164::-;41574:10;:17;;;;41547:15;:24;41563:7;41547:24;;;;;;;;;;;:44;;;;41602:10;41618:7;41602:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41470:164;:::o;42261:988::-;42527:22;42577:1;42552:22;42569:4;42552:16;:22::i;:::-;:26;;;;:::i;:::-;42527:51;;42589:18;42610:17;:26;42628:7;42610:26;;;;;;;;;;;;42589:47;;42757:14;42743:10;:28;42739:328;;42788:19;42810:12;:18;42823:4;42810:18;;;;;;;;;;;;;;;:34;42829:14;42810:34;;;;;;;;;;;;42788:56;;42894:11;42861:12;:18;42874:4;42861:18;;;;;;;;;;;;;;;:30;42880:10;42861:30;;;;;;;;;;;:44;;;;43011:10;42978:17;:30;42996:11;42978:30;;;;;;;;;;;:43;;;;42739:328;;43163:17;:26;43181:7;43163:26;;;;;;;;;;;43156:33;;;43207:12;:18;43220:4;43207:18;;;;;;;;;;;;;;;:34;43226:14;43207:34;;;;;;;;;;;43200:41;;;42261:988;;;;:::o;43544:1079::-;43797:22;43842:1;43822:10;:17;;;;:21;;;;:::i;:::-;43797:46;;43854:18;43875:15;:24;43891:7;43875:24;;;;;;;;;;;;43854:45;;44226:19;44248:10;44259:14;44248:26;;;;;;;;;;;;;;;;;;;;;;;;44226:48;;44312:11;44287:10;44298;44287:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44423:10;44392:15;:28;44408:11;44392:28;;;;;;;;;;;:41;;;;44564:15;:24;44580:7;44564:24;;;;;;;;;;;44557:31;;;44599:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43544:1079;;;;:::o;41048:221::-;41133:14;41150:20;41167:2;41150:16;:20::i;:::-;41133:37;;41208:7;41181:12;:16;41194:2;41181:16;;;;;;;;;;;;;;;:24;41198:6;41181:24;;;;;;;;;;;:34;;;;41255:6;41226:17;:26;41244:7;41226:26;;;;;;;;;;;:35;;;;41048:221;;;:::o;15430:387::-;15490:4;15698:12;15765:7;15753:20;15745:28;;15808:1;15801:4;:8;15794:15;;;15430:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:143::-;;588:6;582:13;573:22;;604:33;631:5;604:33;:::i;:::-;563:80;;;;:::o;649:133::-;;730:6;717:20;708:29;;746:30;770:5;746:30;:::i;:::-;698:84;;;;:::o;788:137::-;;871:6;858:20;849:29;;887:32;913:5;887:32;:::i;:::-;839:86;;;;:::o;931:141::-;;1018:6;1012:13;1003:22;;1034:32;1060:5;1034:32;:::i;:::-;993:79;;;;:::o;1091:271::-;;1195:3;1188:4;1180:6;1176:17;1172:27;1162:2;;1213:1;1210;1203:12;1162:2;1253:6;1240:20;1278:78;1352:3;1344:6;1337:4;1329:6;1325:17;1278:78;:::i;:::-;1269:87;;1152:210;;;;;:::o;1368:139::-;;1452:6;1439:20;1430:29;;1468:33;1495:5;1468:33;:::i;:::-;1420:87;;;;:::o;1513:262::-;;1621:2;1609:9;1600:7;1596:23;1592:32;1589:2;;;1637:1;1634;1627:12;1589:2;1680:1;1705:53;1750:7;1741:6;1730:9;1726:22;1705:53;:::i;:::-;1695:63;;1651:117;1579:196;;;;:::o;1781:284::-;;1900:2;1888:9;1879:7;1875:23;1871:32;1868:2;;;1916:1;1913;1906:12;1868:2;1959:1;1984:64;2040:7;2031:6;2020:9;2016:22;1984:64;:::i;:::-;1974:74;;1930:128;1858:207;;;;:::o;2071:407::-;;;2196:2;2184:9;2175:7;2171:23;2167:32;2164:2;;;2212:1;2209;2202:12;2164:2;2255:1;2280:53;2325:7;2316:6;2305:9;2301:22;2280:53;:::i;:::-;2270:63;;2226:117;2382:2;2408:53;2453:7;2444:6;2433:9;2429:22;2408:53;:::i;:::-;2398:63;;2353:118;2154:324;;;;;:::o;2484:552::-;;;;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;2812:2;2838:53;2883:7;2874:6;2863:9;2859:22;2838:53;:::i;:::-;2828:63;;2783:118;2940:2;2966:53;3011:7;3002:6;2991:9;2987:22;2966:53;:::i;:::-;2956:63;;2911:118;2584:452;;;;;:::o;3042:809::-;;;;;3210:3;3198:9;3189:7;3185:23;3181:33;3178:2;;;3227:1;3224;3217:12;3178:2;3270:1;3295:53;3340:7;3331:6;3320:9;3316:22;3295:53;:::i;:::-;3285:63;;3241:117;3397:2;3423:53;3468:7;3459:6;3448:9;3444:22;3423:53;:::i;:::-;3413:63;;3368:118;3525:2;3551:53;3596:7;3587:6;3576:9;3572:22;3551:53;:::i;:::-;3541:63;;3496:118;3681:2;3670:9;3666:18;3653:32;3712:18;3704:6;3701:30;3698:2;;;3744:1;3741;3734:12;3698:2;3772:62;3826:7;3817:6;3806:9;3802:22;3772:62;:::i;:::-;3762:72;;3624:220;3168:683;;;;;;;:::o;3857:401::-;;;3979:2;3967:9;3958:7;3954:23;3950:32;3947:2;;;3995:1;3992;3985:12;3947:2;4038:1;4063:53;4108:7;4099:6;4088:9;4084:22;4063:53;:::i;:::-;4053:63;;4009:117;4165:2;4191:50;4233:7;4224:6;4213:9;4209:22;4191:50;:::i;:::-;4181:60;;4136:115;3937:321;;;;;:::o;4264:407::-;;;4389:2;4377:9;4368:7;4364:23;4360:32;4357:2;;;4405:1;4402;4395:12;4357:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4347:324;;;;;:::o;4677:260::-;;4784:2;4772:9;4763:7;4759:23;4755:32;4752:2;;;4800:1;4797;4790:12;4752:2;4843:1;4868:52;4912:7;4903:6;4892:9;4888:22;4868:52;:::i;:::-;4858:62;;4814:116;4742:195;;;;:::o;4943:282::-;;5061:2;5049:9;5040:7;5036:23;5032:32;5029:2;;;5077:1;5074;5067:12;5029:2;5120:1;5145:63;5200:7;5191:6;5180:9;5176:22;5145:63;:::i;:::-;5135:73;;5091:127;5019:206;;;;:::o;5231:262::-;;5339:2;5327:9;5318:7;5314:23;5310:32;5307:2;;;5355:1;5352;5345:12;5307:2;5398:1;5423:53;5468:7;5459:6;5448:9;5444:22;5423:53;:::i;:::-;5413:63;;5369:117;5297:196;;;;:::o;5499:118::-;5586:24;5604:5;5586:24;:::i;:::-;5581:3;5574:37;5564:53;;:::o;5623:109::-;5704:21;5719:5;5704:21;:::i;:::-;5699:3;5692:34;5682:50;;:::o;5738:360::-;;5852:38;5884:5;5852:38;:::i;:::-;5906:70;5969:6;5964:3;5906:70;:::i;:::-;5899:77;;5985:52;6030:6;6025:3;6018:4;6011:5;6007:16;5985:52;:::i;:::-;6062:29;6084:6;6062:29;:::i;:::-;6057:3;6053:39;6046:46;;5828:270;;;;;:::o;6104:364::-;;6220:39;6253:5;6220:39;:::i;:::-;6275:71;6339:6;6334:3;6275:71;:::i;:::-;6268:78;;6355:52;6400:6;6395:3;6388:4;6381:5;6377:16;6355:52;:::i;:::-;6432:29;6454:6;6432:29;:::i;:::-;6427:3;6423:39;6416:46;;6196:272;;;;;:::o;6474:377::-;;6608:39;6641:5;6608:39;:::i;:::-;6663:89;6745:6;6740:3;6663:89;:::i;:::-;6656:96;;6761:52;6806:6;6801:3;6794:4;6787:5;6783:16;6761:52;:::i;:::-;6838:6;6833:3;6829:16;6822:23;;6584:267;;;;;:::o;6857:375::-;;7020:67;7084:2;7079:3;7020:67;:::i;:::-;7013:74;;7117:34;7113:1;7108:3;7104:11;7097:55;7183:13;7178:2;7173:3;7169:12;7162:35;7223:2;7218:3;7214:12;7207:19;;7003:229;;;:::o;7238:382::-;;7401:67;7465:2;7460:3;7401:67;:::i;:::-;7394:74;;7498:34;7494:1;7489:3;7485:11;7478:55;7564:20;7559:2;7554:3;7550:12;7543:42;7611:2;7606:3;7602:12;7595:19;;7384:236;;;:::o;7626:370::-;;7789:67;7853:2;7848:3;7789:67;:::i;:::-;7782:74;;7886:34;7882:1;7877:3;7873:11;7866:55;7952:8;7947:2;7942:3;7938:12;7931:30;7987:2;7982:3;7978:12;7971:19;;7772:224;;;:::o;8002:326::-;;8165:67;8229:2;8224:3;8165:67;:::i;:::-;8158:74;;8262:30;8258:1;8253:3;8249:11;8242:51;8319:2;8314:3;8310:12;8303:19;;8148:180;;;:::o;8334:333::-;;8515:84;8597:1;8592:3;8515:84;:::i;:::-;8508:91;;8629:3;8625:1;8620:3;8616:11;8609:24;8659:1;8654:3;8650:11;8643:18;;8498:169;;;:::o;8673:368::-;;8836:67;8900:2;8895:3;8836:67;:::i;:::-;8829:74;;8933:34;8929:1;8924:3;8920:11;8913:55;8999:6;8994:2;8989:3;8985:12;8978:28;9032:2;9027:3;9023:12;9016:19;;8819:222;;;:::o;9047:323::-;;9210:67;9274:2;9269:3;9210:67;:::i;:::-;9203:74;;9307:27;9303:1;9298:3;9294:11;9287:48;9361:2;9356:3;9352:12;9345:19;;9193:177;;;:::o;9376:376::-;;9539:67;9603:2;9598:3;9539:67;:::i;:::-;9532:74;;9636:34;9632:1;9627:3;9623:11;9616:55;9702:14;9697:2;9692:3;9688:12;9681:36;9743:2;9738:3;9734:12;9727:19;;9522:230;;;:::o;9758:388::-;;9921:67;9985:2;9980:3;9921:67;:::i;:::-;9914:74;;10018:34;10014:1;10009:3;10005:11;9998:55;10084:26;10079:2;10074:3;10070:12;10063:48;10137:2;10132:3;10128:12;10121:19;;9904:242;;;:::o;10152:374::-;;10315:67;10379:2;10374:3;10315:67;:::i;:::-;10308:74;;10412:34;10408:1;10403:3;10399:11;10392:55;10478:12;10473:2;10468:3;10464:12;10457:34;10517:2;10512:3;10508:12;10501:19;;10298:228;;;:::o;10532:373::-;;10695:67;10759:2;10754:3;10695:67;:::i;:::-;10688:74;;10792:34;10788:1;10783:3;10779:11;10772:55;10858:11;10853:2;10848:3;10844:12;10837:33;10896:2;10891:3;10887:12;10880:19;;10678:227;;;:::o;10911:396::-;;11092:84;11174:1;11169:3;11092:84;:::i;:::-;11085:91;;11206:66;11202:1;11197:3;11193:11;11186:87;11299:1;11294:3;11290:11;11283:18;;11075:232;;;:::o;11313:330::-;;11476:67;11540:2;11535:3;11476:67;:::i;:::-;11469:74;;11573:34;11569:1;11564:3;11560:11;11553:55;11634:2;11629:3;11625:12;11618:19;;11459:184;;;:::o;11649:376::-;;11812:67;11876:2;11871:3;11812:67;:::i;:::-;11805:74;;11909:34;11905:1;11900:3;11896:11;11889:55;11975:14;11970:2;11965:3;11961:12;11954:36;12016:2;12011:3;12007:12;12000:19;;11795:230;;;:::o;12031:330::-;;12194:67;12258:2;12253:3;12194:67;:::i;:::-;12187:74;;12291:34;12287:1;12282:3;12278:11;12271:55;12352:2;12347:3;12343:12;12336:19;;12177:184;;;:::o;12367:314::-;;12530:67;12594:2;12589:3;12530:67;:::i;:::-;12523:74;;12627:18;12623:1;12618:3;12614:11;12607:39;12672:2;12667:3;12663:12;12656:19;;12513:168;;;:::o;12687:373::-;;12850:67;12914:2;12909:3;12850:67;:::i;:::-;12843:74;;12947:34;12943:1;12938:3;12934:11;12927:55;13013:11;13008:2;13003:3;12999:12;12992:33;13051:2;13046:3;13042:12;13035:19;;12833:227;;;:::o;13066:333::-;;13247:84;13329:1;13324:3;13247:84;:::i;:::-;13240:91;;13361:3;13357:1;13352:3;13348:11;13341:24;13391:1;13386:3;13382:11;13375:18;;13230:169;;;:::o;13405:365::-;;13568:67;13632:2;13627:3;13568:67;:::i;:::-;13561:74;;13665:34;13661:1;13656:3;13652:11;13645:55;13731:3;13726:2;13721:3;13717:12;13710:25;13761:2;13756:3;13752:12;13745:19;;13551:219;;;:::o;13776:363::-;;13957:85;14039:2;14034:3;13957:85;:::i;:::-;13950:92;;14072:31;14068:1;14063:3;14059:11;14052:52;14130:2;14125:3;14121:12;14114:19;;13940:199;;;:::o;14145:381::-;;14308:67;14372:2;14367:3;14308:67;:::i;:::-;14301:74;;14405:34;14401:1;14396:3;14392:11;14385:55;14471:19;14466:2;14461:3;14457:12;14450:41;14517:2;14512:3;14508:12;14501:19;;14291:235;;;:::o;14532:333::-;;14713:84;14795:1;14790:3;14713:84;:::i;:::-;14706:91;;14827:3;14823:1;14818:3;14814:11;14807:24;14857:1;14852:3;14848:11;14841:18;;14696:169;;;:::o;14871:814::-;;15052:86;15134:3;15129;15052:86;:::i;:::-;15045:93;;15168:66;15164:1;15159:3;15155:11;15148:87;15266:34;15261:2;15256:3;15252:12;15245:56;15332:34;15327:2;15322:3;15318:12;15311:56;15398:34;15393:2;15388:3;15384:12;15377:56;15465:34;15459:3;15454;15450:13;15443:57;15532:66;15526:3;15521;15517:13;15510:89;15631:17;15625:3;15620;15616:13;15609:40;15675:3;15670;15666:13;15659:20;;15035:650;;;:::o;15691:376::-;;15854:67;15918:2;15913:3;15854:67;:::i;:::-;15847:74;;15951:34;15947:1;15942:3;15938:11;15931:55;16017:14;16012:2;16007:3;16003:12;15996:36;16058:2;16053:3;16049:12;16042:19;;15837:230;;;:::o;16073:334::-;;16254:84;16336:1;16331:3;16254:84;:::i;:::-;16247:91;;16368:4;16364:1;16359:3;16355:11;16348:25;16399:1;16394:3;16390:11;16383:18;;16237:170;;;:::o;16413:398::-;;16594:85;16676:2;16671:3;16594:85;:::i;:::-;16587:92;;16709:66;16705:1;16700:3;16696:11;16689:87;16802:2;16797:3;16793:12;16786:19;;16577:234;;;:::o;16817:329::-;;16980:67;17044:2;17039:3;16980:67;:::i;:::-;16973:74;;17077:33;17073:1;17068:3;17064:11;17057:54;17137:2;17132:3;17128:12;17121:19;;16963:183;;;:::o;17152:313::-;;17315:67;17379:2;17374:3;17315:67;:::i;:::-;17308:74;;17412:17;17408:1;17403:3;17399:11;17392:38;17456:2;17451:3;17447:12;17440:19;;17298:167;;;:::o;17471:118::-;17558:24;17576:5;17558:24;:::i;:::-;17553:3;17546:37;17536:53;;:::o;17595:275::-;;17749:95;17840:3;17831:6;17749:95;:::i;:::-;17742:102;;17861:3;17854:10;;17731:139;;;;:::o;17876:1555::-;;18414:95;18505:3;18496:6;18414:95;:::i;:::-;18407:102;;18526:95;18617:3;18608:6;18526:95;:::i;:::-;18519:102;;18638:95;18729:3;18720:6;18638:95;:::i;:::-;18631:102;;18750:95;18841:3;18832:6;18750:95;:::i;:::-;18743:102;;18862:95;18953:3;18944:6;18862:95;:::i;:::-;18855:102;;18974:95;19065:3;19056:6;18974:95;:::i;:::-;18967:102;;19086:95;19177:3;19168:6;19086:95;:::i;:::-;19079:102;;19198:95;19289:3;19280:6;19198:95;:::i;:::-;19191:102;;19310:95;19401:3;19392:6;19310:95;:::i;:::-;19303:102;;19422:3;19415:10;;18396:1035;;;;;;;;;;;;:::o;19437:701::-;;19740:95;19831:3;19822:6;19740:95;:::i;:::-;19733:102;;19852:95;19943:3;19934:6;19852:95;:::i;:::-;19845:102;;19964:148;20108:3;19964:148;:::i;:::-;19957:155;;20129:3;20122:10;;19722:416;;;;;:::o;20144:701::-;;20447:95;20538:3;20529:6;20447:95;:::i;:::-;20440:102;;20559:95;20650:3;20641:6;20559:95;:::i;:::-;20552:102;;20671:148;20815:3;20671:148;:::i;:::-;20664:155;;20836:3;20829:10;;20429:416;;;;;:::o;20851:701::-;;21154:95;21245:3;21236:6;21154:95;:::i;:::-;21147:102;;21266:95;21357:3;21348:6;21266:95;:::i;:::-;21259:102;;21378:148;21522:3;21378:148;:::i;:::-;21371:155;;21543:3;21536:10;;21136:416;;;;;:::o;21558:701::-;;21861:95;21952:3;21943:6;21861:95;:::i;:::-;21854:102;;21973:148;22117:3;21973:148;:::i;:::-;21966:155;;22138:95;22229:3;22220:6;22138:95;:::i;:::-;22131:102;;22250:3;22243:10;;21843:416;;;;;:::o;22265:541::-;;22520:148;22664:3;22520:148;:::i;:::-;22513:155;;22685:95;22776:3;22767:6;22685:95;:::i;:::-;22678:102;;22797:3;22790:10;;22502:304;;;;:::o;22812:1233::-;;23317:148;23461:3;23317:148;:::i;:::-;23310:155;;23482:95;23573:3;23564:6;23482:95;:::i;:::-;23475:102;;23594:148;23738:3;23594:148;:::i;:::-;23587:155;;23759:95;23850:3;23841:6;23759:95;:::i;:::-;23752:102;;23871:148;24015:3;23871:148;:::i;:::-;23864:155;;24036:3;24029:10;;23299:746;;;;;:::o;24051:222::-;;24182:2;24171:9;24167:18;24159:26;;24195:71;24263:1;24252:9;24248:17;24239:6;24195:71;:::i;:::-;24149:124;;;;:::o;24279:640::-;;24512:3;24501:9;24497:19;24489:27;;24526:71;24594:1;24583:9;24579:17;24570:6;24526:71;:::i;:::-;24607:72;24675:2;24664:9;24660:18;24651:6;24607:72;:::i;:::-;24689;24757:2;24746:9;24742:18;24733:6;24689:72;:::i;:::-;24808:9;24802:4;24798:20;24793:2;24782:9;24778:18;24771:48;24836:76;24907:4;24898:6;24836:76;:::i;:::-;24828:84;;24479:440;;;;;;;:::o;24925:210::-;;25050:2;25039:9;25035:18;25027:26;;25063:65;25125:1;25114:9;25110:17;25101:6;25063:65;:::i;:::-;25017:118;;;;:::o;25141:313::-;;25292:2;25281:9;25277:18;25269:26;;25341:9;25335:4;25331:20;25327:1;25316:9;25312:17;25305:47;25369:78;25442:4;25433:6;25369:78;:::i;:::-;25361:86;;25259:195;;;;:::o;25460:419::-;;25664:2;25653:9;25649:18;25641:26;;25713:9;25707:4;25703:20;25699:1;25688:9;25684:17;25677:47;25741:131;25867:4;25741:131;:::i;:::-;25733:139;;25631:248;;;:::o;25885:419::-;;26089:2;26078:9;26074:18;26066:26;;26138:9;26132:4;26128:20;26124:1;26113:9;26109:17;26102:47;26166:131;26292:4;26166:131;:::i;:::-;26158:139;;26056:248;;;:::o;26310:419::-;;26514:2;26503:9;26499:18;26491:26;;26563:9;26557:4;26553:20;26549:1;26538:9;26534:17;26527:47;26591:131;26717:4;26591:131;:::i;:::-;26583:139;;26481:248;;;:::o;26735:419::-;;26939:2;26928:9;26924:18;26916:26;;26988:9;26982:4;26978:20;26974:1;26963:9;26959:17;26952:47;27016:131;27142:4;27016:131;:::i;:::-;27008:139;;26906:248;;;:::o;27160:419::-;;27364:2;27353:9;27349:18;27341:26;;27413:9;27407:4;27403:20;27399:1;27388:9;27384:17;27377:47;27441:131;27567:4;27441:131;:::i;:::-;27433:139;;27331:248;;;:::o;27585:419::-;;27789:2;27778:9;27774:18;27766:26;;27838:9;27832:4;27828:20;27824:1;27813:9;27809:17;27802:47;27866:131;27992:4;27866:131;:::i;:::-;27858:139;;27756:248;;;:::o;28010:419::-;;28214:2;28203:9;28199:18;28191:26;;28263:9;28257:4;28253:20;28249:1;28238:9;28234:17;28227:47;28291:131;28417:4;28291:131;:::i;:::-;28283:139;;28181:248;;;:::o;28435:419::-;;28639:2;28628:9;28624:18;28616:26;;28688:9;28682:4;28678:20;28674:1;28663:9;28659:17;28652:47;28716:131;28842:4;28716:131;:::i;:::-;28708:139;;28606:248;;;:::o;28860:419::-;;29064:2;29053:9;29049:18;29041:26;;29113:9;29107:4;29103:20;29099:1;29088:9;29084:17;29077:47;29141:131;29267:4;29141:131;:::i;:::-;29133:139;;29031:248;;;:::o;29285:419::-;;29489:2;29478:9;29474:18;29466:26;;29538:9;29532:4;29528:20;29524:1;29513:9;29509:17;29502:47;29566:131;29692:4;29566:131;:::i;:::-;29558:139;;29456:248;;;:::o;29710:419::-;;29914:2;29903:9;29899:18;29891:26;;29963:9;29957:4;29953:20;29949:1;29938:9;29934:17;29927:47;29991:131;30117:4;29991:131;:::i;:::-;29983:139;;29881:248;;;:::o;30135:419::-;;30339:2;30328:9;30324:18;30316:26;;30388:9;30382:4;30378:20;30374:1;30363:9;30359:17;30352:47;30416:131;30542:4;30416:131;:::i;:::-;30408:139;;30306:248;;;:::o;30560:419::-;;30764:2;30753:9;30749:18;30741:26;;30813:9;30807:4;30803:20;30799:1;30788:9;30784:17;30777:47;30841:131;30967:4;30841:131;:::i;:::-;30833:139;;30731:248;;;:::o;30985:419::-;;31189:2;31178:9;31174:18;31166:26;;31238:9;31232:4;31228:20;31224:1;31213:9;31209:17;31202:47;31266:131;31392:4;31266:131;:::i;:::-;31258:139;;31156:248;;;:::o;31410:419::-;;31614:2;31603:9;31599:18;31591:26;;31663:9;31657:4;31653:20;31649:1;31638:9;31634:17;31627:47;31691:131;31817:4;31691:131;:::i;:::-;31683:139;;31581:248;;;:::o;31835:419::-;;32039:2;32028:9;32024:18;32016:26;;32088:9;32082:4;32078:20;32074:1;32063:9;32059:17;32052:47;32116:131;32242:4;32116:131;:::i;:::-;32108:139;;32006:248;;;:::o;32260:419::-;;32464:2;32453:9;32449:18;32441:26;;32513:9;32507:4;32503:20;32499:1;32488:9;32484:17;32477:47;32541:131;32667:4;32541:131;:::i;:::-;32533:139;;32431:248;;;:::o;32685:419::-;;32889:2;32878:9;32874:18;32866:26;;32938:9;32932:4;32928:20;32924:1;32913:9;32909:17;32902:47;32966:131;33092:4;32966:131;:::i;:::-;32958:139;;32856:248;;;:::o;33110:419::-;;33314:2;33303:9;33299:18;33291:26;;33363:9;33357:4;33353:20;33349:1;33338:9;33334:17;33327:47;33391:131;33517:4;33391:131;:::i;:::-;33383:139;;33281:248;;;:::o;33535:419::-;;33739:2;33728:9;33724:18;33716:26;;33788:9;33782:4;33778:20;33774:1;33763:9;33759:17;33752:47;33816:131;33942:4;33816:131;:::i;:::-;33808:139;;33706:248;;;:::o;33960:222::-;;34091:2;34080:9;34076:18;34068:26;;34104:71;34172:1;34161:9;34157:17;34148:6;34104:71;:::i;:::-;34058:124;;;;:::o;34188:283::-;;34254:2;34248:9;34238:19;;34296:4;34288:6;34284:17;34403:6;34391:10;34388:22;34367:18;34355:10;34352:34;34349:62;34346:2;;;34414:18;;:::i;:::-;34346:2;34454:10;34450:2;34443:22;34228:243;;;;:::o;34477:331::-;;34628:18;34620:6;34617:30;34614:2;;;34650:18;;:::i;:::-;34614:2;34735:4;34731:9;34724:4;34716:6;34712:17;34708:33;34700:41;;34796:4;34790;34786:15;34778:23;;34543:265;;;:::o;34814:98::-;;34899:5;34893:12;34883:22;;34872:40;;;:::o;34918:99::-;;35004:5;34998:12;34988:22;;34977:40;;;:::o;35023:168::-;;35140:6;35135:3;35128:19;35180:4;35175:3;35171:14;35156:29;;35118:73;;;;:::o;35197:169::-;;35315:6;35310:3;35303:19;35355:4;35350:3;35346:14;35331:29;;35293:73;;;;:::o;35372:148::-;;35511:3;35496:18;;35486:34;;;;:::o;35526:305::-;;35585:20;35603:1;35585:20;:::i;:::-;35580:25;;35619:20;35637:1;35619:20;:::i;:::-;35614:25;;35773:1;35705:66;35701:74;35698:1;35695:81;35692:2;;;35779:18;;:::i;:::-;35692:2;35823:1;35820;35816:9;35809:16;;35570:261;;;;:::o;35837:185::-;;35894:20;35912:1;35894:20;:::i;:::-;35889:25;;35928:20;35946:1;35928:20;:::i;:::-;35923:25;;35967:1;35957:2;;35972:18;;:::i;:::-;35957:2;36014:1;36011;36007:9;36002:14;;35879:143;;;;:::o;36028:348::-;;36091:20;36109:1;36091:20;:::i;:::-;36086:25;;36125:20;36143:1;36125:20;:::i;:::-;36120:25;;36313:1;36245:66;36241:74;36238:1;36235:81;36230:1;36223:9;36216:17;36212:105;36209:2;;;36320:18;;:::i;:::-;36209:2;36368:1;36365;36361:9;36350:20;;36076:300;;;;:::o;36382:191::-;;36442:20;36460:1;36442:20;:::i;:::-;36437:25;;36476:20;36494:1;36476:20;:::i;:::-;36471:25;;36515:1;36512;36509:8;36506:2;;;36520:18;;:::i;:::-;36506:2;36565:1;36562;36558:9;36550:17;;36427:146;;;;:::o;36579:96::-;;36645:24;36663:5;36645:24;:::i;:::-;36634:35;;36624:51;;;:::o;36681:90::-;;36758:5;36751:13;36744:21;36733:32;;36723:48;;;:::o;36777:149::-;;36853:66;36846:5;36842:78;36831:89;;36821:105;;;:::o;36932:126::-;;37009:42;37002:5;36998:54;36987:65;;36977:81;;;:::o;37064:77::-;;37130:5;37119:16;;37109:32;;;:::o;37147:154::-;37231:6;37226:3;37221;37208:30;37293:1;37284:6;37279:3;37275:16;37268:27;37198:103;;;:::o;37307:307::-;37375:1;37385:113;37399:6;37396:1;37393:13;37385:113;;;37484:1;37479:3;37475:11;37469:18;37465:1;37460:3;37456:11;37449:39;37421:2;37418:1;37414:10;37409:15;;37385:113;;;37516:6;37513:1;37510:13;37507:2;;;37596:1;37587:6;37582:3;37578:16;37571:27;37507:2;37356:258;;;;:::o;37620:320::-;;37701:1;37695:4;37691:12;37681:22;;37748:1;37742:4;37738:12;37769:18;37759:2;;37825:4;37817:6;37813:17;37803:27;;37759:2;37887;37879:6;37876:14;37856:18;37853:38;37850:2;;;37906:18;;:::i;:::-;37850:2;37671:269;;;;:::o;37946:233::-;;38008:24;38026:5;38008:24;:::i;:::-;37999:33;;38054:66;38047:5;38044:77;38041:2;;;38124:18;;:::i;:::-;38041:2;38171:1;38164:5;38160:13;38153:20;;37989:190;;;:::o;38185:176::-;;38234:20;38252:1;38234:20;:::i;:::-;38229:25;;38268:20;38286:1;38268:20;:::i;:::-;38263:25;;38307:1;38297:2;;38312:18;;:::i;:::-;38297:2;38353:1;38350;38346:9;38341:14;;38219:142;;;;:::o;38367:180::-;38415:77;38412:1;38405:88;38512:4;38509:1;38502:15;38536:4;38533:1;38526:15;38553:180;38601:77;38598:1;38591:88;38698:4;38695:1;38688:15;38722:4;38719:1;38712:15;38739:180;38787:77;38784:1;38777:88;38884:4;38881:1;38874:15;38908:4;38905:1;38898:15;38925:180;38973:77;38970:1;38963:88;39070:4;39067:1;39060:15;39094:4;39091:1;39084:15;39111:102;;39203:2;39199:7;39194:2;39187:5;39183:14;39179:28;39169:38;;39159:54;;;:::o;39219:122::-;39292:24;39310:5;39292:24;:::i;:::-;39285:5;39282:35;39272:2;;39331:1;39328;39321:12;39272:2;39262:79;:::o;39347:116::-;39417:21;39432:5;39417:21;:::i;:::-;39410:5;39407:32;39397:2;;39453:1;39450;39443:12;39397:2;39387:76;:::o;39469:120::-;39541:23;39558:5;39541:23;:::i;:::-;39534:5;39531:34;39521:2;;39579:1;39576;39569:12;39521:2;39511:78;:::o;39595:122::-;39668:24;39686:5;39668:24;:::i;:::-;39661:5;39658:35;39648:2;;39707:1;39704;39697:12;39648:2;39638:79;:::o

Swarm Source

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