ETH Price: $3,354.01 (-2.37%)

Token

ocDoggos (OCD)
 

Overview

Max Total Supply

48 OCD

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
golaso.eth
Balance
3 OCD
0x3c8cbd613857965267bcd4bdec7b794dd53969a0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
doggos

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-10-08
*/

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

// SPDX-License-Identifier: UNLICENSED
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;
}

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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 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 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 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.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();
    }
}

// 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// 
library doggosLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

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

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

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

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

    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;
    }
}

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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// 
contract doggos is ERC721Enumerable, Ownable {

    using doggosLibrary for uint8;

    struct Trait {
        string traitName;
        string traitType;
        string pixels;
        uint256 pixelCount;
    }
    
    // Price
    uint256 public price = 30000000000000000; // 0.03 eth

    //Mappings
    mapping(uint256 => Trait[]) public traitTypes;
    mapping(string => bool) hashToMinted;
    mapping(uint256 => string) internal tokenIdToHash;

    //uint256s
    uint256 MAX_SUPPLY = 4000;
    uint256 SEED_NONCE = 0;

    //string arrays
    string[] LETTERS = [
        "a",
        "b",
        "c",
        "d",
        "e",
        "f",
        "g",
        "h",
        "i",
        "j",
        "k",
        "l",
        "m",
        "n",
        "o",
        "p",
        "q",
        "r",
        "s",
        "t",
        "u",
        "v",
        "w",
        "x",
        "y",
        "z"
    ];

    //uint arrays
    uint16[][8] TIERS;

    //address
    address _owner;

    constructor() ERC721("ocDoggos", "OCD") {

        //Declare all the rarity tiers

        //Hat
        TIERS[0] = [50, 150, 200, 300, 400, 500, 600, 900, 1200, 5700];
        //Special
        TIERS[1] = [50, 200, 300, 300, 9150];
        //Neck
        TIERS[2] = [300, 800, 900, 1000, 7000];
        //Earrings
        TIERS[3] = [50, 200, 300, 300, 9150];
        //Eyes
        TIERS[4] = [50, 100, 400, 450, 500, 700, 1800, 2000, 2000, 2000];
        //Mouth
        TIERS[5] = [1428, 1428, 1428, 1429, 1429, 1429, 1429];
        //Nose
        TIERS[6] = [2000, 2000, 2000, 2000, 2000];
        //Character
        TIERS[7] = [20, 70, 721, 1000, 1155, 1200, 1300, 1434, 1541, 1559];
        
    }

    /*
  __  __ _     _   _             ___             _   _             
 |  \/  (_)_ _| |_(_)_ _  __ _  | __|  _ _ _  __| |_(_)___ _ _  ___
 | |\/| | | ' \  _| | ' \/ _` | | _| || | ' \/ _|  _| / _ \ ' \(_-<
 |_|  |_|_|_||_\__|_|_||_\__, | |_| \_,_|_||_\__|\__|_\___/_||_/__/
                         |___/                                     
   */

    /**
     * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier.
     * @param _randinput The input from 0 - 10000 to use for rarity gen.
     * @param _rarityTier The tier to use.
     */
    function rarityGen(uint256 _randinput, uint8 _rarityTier)
        internal
        view
        returns (string memory)
    {
        uint16 currentLowerBound = 0;
        for (uint8 i = 0; i < TIERS[_rarityTier].length; i++) {
            uint16 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return i.toString();
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        revert();
    }

    /**
     * @dev Generates a 9 digit hash from a tokenId, address, and random number.
     * @param _t The token id to be used within the hash.
     * @param _a The address to be used within the hash.
     * @param _c The custom nonce to be used within the hash.
     */
    function hash(
        uint256 _t,
        address _a,
        uint256 _c
    ) internal returns (string memory) {
        require(_c < 10);

        // This will generate a 9 character string.
        //The last 8 digits are random, the first is 0, due to the mouse not being burned.
        string memory currentHash = "0";

        for (uint8 i = 0; i < 8; i++) {
            SEED_NONCE++;
            uint16 _randinput = uint16(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            block.timestamp,
                            block.difficulty,
                            _t,
                            _a,
                            _c,
                            SEED_NONCE
                        )
                    )
                ) % 10000
            );

            currentHash = string(
                abi.encodePacked(currentHash, rarityGen(_randinput, i))
            );
        }

        if (hashToMinted[currentHash]) return hash(_t, _a, _c + 1);

        return currentHash;
    }


    /**
     * @dev Mint internal, this is to avoid code duplication.
     */
    function mintInternal() internal {
        uint256 _totalSupply = totalSupply();
        require(_totalSupply < MAX_SUPPLY);
        require(!doggosLibrary.isContract(msg.sender));

        uint256 thisTokenId = _totalSupply;

        tokenIdToHash[thisTokenId] = hash(thisTokenId, msg.sender, 0);

        hashToMinted[tokenIdToHash[thisTokenId]] = true;

        _mint(msg.sender, thisTokenId);
    }
    

    /**
     * @dev Mints new tokens.
     */
    function mintDoggos(uint256 _times) public payable {
        require((_times > 0 && _times <= 10) && (msg.value == _times * price) && (totalSupply() < MAX_SUPPLY), "t");
        
        for(uint256 i=0; i< _times; i++){
             mintInternal();
        }
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;

        payable(msg.sender).transfer(balance);
    }   


    /*
 ____     ___   ____  ___        _____  __ __  ____     __ ______  ____  ___   ____   _____
|    \   /  _] /    ||   \      |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|  D  ) /  [_ |  o  ||    \     |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|    / |    _]|     ||  D  |    |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|    \ |   [_ |  _  ||     |    |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|  .  \|     ||  |  ||     |    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
|__|\_||_____||__|__||_____|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                           
*/

    /**
     * @dev Helper function to reduce pixel size within contract
     */
    function letterToNumber(string memory _inputLetter)
        internal
        view
        returns (uint8)
    {
        for (uint8 i = 0; i < LETTERS.length; i++) {
            if (
                keccak256(abi.encodePacked((LETTERS[i]))) ==
                keccak256(abi.encodePacked((_inputLetter)))
            ) return (i + 1);
        }
        revert();
    }

    /**
     * @dev Hash to SVG function
     */
    function hashToSVG(string memory _hash)
        public
        view
        returns (string memory)
    {
        string memory svgString;
        bool[24][24] memory placedPixels;

        for (uint8 i = 0; i < 9; i++) { 
            uint8 thisTraitIndex = doggosLibrary.parseInt(
                doggosLibrary.substring(_hash, i, i + 1)
            );

            for (
                uint16 j = 0;
                j < traitTypes[i][thisTraitIndex].pixelCount; // <
                j++
            ) {
                string memory thisPixel = doggosLibrary.substring(
                    traitTypes[i][thisTraitIndex].pixels,
                    j * 4,
                    j * 4 + 4
                );

                uint8 x = letterToNumber(
                    doggosLibrary.substring(thisPixel, 0, 1)
                );
                uint8 y = letterToNumber(
                    doggosLibrary.substring(thisPixel, 1, 2)
                );

                if (placedPixels[x][y]) continue;

                svgString = string(
                    abi.encodePacked(
                        svgString,
                        "<rect class='c",
                        doggosLibrary.substring(thisPixel, 2, 4),
                        "' x='",
                        x.toString(),
                        "' y='",
                        y.toString(),
                        "'/>"
                    )
                );

                placedPixels[x][y] = true;
            }
        }

        svgString = string(
            abi.encodePacked(
                '<svg id="c" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 24 24"> ',
                svgString,
               // "<style>rect{width:1px;height:1px;} #mouse-svg{shape-rendering: crispedges;} .c00{fill:#000000}.c01{fill:#B1ADAC}.c02{fill:#D7D7D7}.c03{fill:#FFA6A6}.c04{fill:#FFD4D5}.c05{fill:#B9AD95}.c06{fill:#E2D6BE}.c07{fill:#7F625A}.c08{fill:#A58F82}.c09{fill:#4B1E0B}.c10{fill:#6D2C10}.c11{fill:#D8D8D8}.c12{fill:#F5F5F5}.c13{fill:#433D4B}.c14{fill:#8D949C}.c15{fill:#05FF00}.c16{fill:#01C700}.c17{fill:#0B8F08}.c18{fill:#421C13}.c19{fill:#6B392A}.c20{fill:#A35E40}.c21{fill:#DCBD91}.c22{fill:#777777}.c23{fill:#848484}.c24{fill:#ABABAB}.c25{fill:#BABABA}.c26{fill:#C7C7C7}.c27{fill:#EAEAEA}.c28{fill:#0C76AA}.c29{fill:#0E97DB}.c30{fill:#10A4EC}.c31{fill:#13B0FF}.c32{fill:#2EB9FE}.c33{fill:#54CCFF}.c34{fill:#50C0F2}.c35{fill:#54CCFF}.c36{fill:#72DAFF}.c37{fill:#B6EAFF}.c38{fill:#FFFFFF}.c39{fill:#954546}.c40{fill:#0B87F7}.c41{fill:#FF2626}.c42{fill:#180F02}.c43{fill:#2B2319}.c44{fill:#FBDD4B}.c45{fill:#F5B923}.c46{fill:#CC8A18}.c47{fill:#3C2203}.c48{fill:#53320B}.c49{fill:#7B501D}.c50{fill:#FFE646}.c51{fill:#FFD627}.c52{fill:#F5B700}.c53{fill:#242424}.c54{fill:#4A4A4A}.c55{fill:#676767}.c56{fill:#F08306}.c57{fill:#FCA30E}.c58{fill:#FEBC0E}.c59{fill:#FBEC1C}.c60{fill:#14242F}.c61{fill:#B06837}.c62{fill:#8F4B0E}.c63{fill:#D88227}.c64{fill:#B06837}</style></svg>"
                "<style>rect{width:1px;height:1px;}#c{shape-rendering: crispedges;}.c00{fill:#f6767b}.c01{fill:#ffffff}.c02{fill:#000000}.c03{fill:#c1008b}.c04{fill:#dc009e}.c05{fill:#ef00a9}.c06{fill:#ff0043}.c07{fill:#c74249}.c08{fill:#aa343a}.c09{fill:#363737}.c10{fill:#1c1c1c}.c11{fill:#2c2c2c}.c12{fill:#6a9cc5}.c13{fill:#9fd2fc}.c14{fill:#cd6100}.c15{fill:#2f2f2f}.c16{fill:#fd7500}.c17{fill:#f68d2f}.c18{fill:#474747}.c19{fill:#585858}.c20{fill:#242424}.c21{fill:#9c7d6a}.c22{fill:#3e3e3e}.c23{fill:#202020}.c24{fill:#b05514}.c25{fill:#733e39}.c26{fill:#f2d000}.c27{fill:#f3dd00}.c28{fill:#cccccd}.c29{fill:#dad4d2}.c30{fill:#ece3e0}.c31{fill:#00adc0}.c32{fill:#00b8cc}.c33{fill:#00c4db}.c34{fill:#4c3b2f}.c35{fill:#695038}.c36{fill:#b58152}.c37{fill:#008c9b}.c38{fill:#c5c5db}.c39{fill:#00d6ff}.c40{fill:#df3453}.c41{fill:#d4b500}.c42{fill:#523747}.c43{fill:#3f4043}.c44{fill:#5f5e5c}.c45{fill:#c69e94}.c46{fill:#a1958c}.c47{fill:#981870}.c48{fill:#cbba00}.c49{fill:#dfcc00}.c50{fill:#13a72e}.c51{fill:#0c8a24}</style></svg>"
            )
        );

        return svgString;
    }

    /**
     * @dev Hash to metadata function
     */
    function hashToMetadata(string memory _hash)
        public
        view
        returns (string memory)
    {
        string memory metadataString;

        for (uint8 i = 0; i < 9; i++) { //9
            uint8 thisTraitIndex = doggosLibrary.parseInt(
                doggosLibrary.substring(_hash, i, i + 1)
            );

            metadataString = string(
                abi.encodePacked(
                    metadataString,
                    '{"trait_type":"',
                    traitTypes[i][thisTraitIndex].traitType,
                    '","value":"',
                    traitTypes[i][thisTraitIndex].traitName,
                    '"}'
                )
            );

            if (i != 8)
                metadataString = string(abi.encodePacked(metadataString, ","));
        }

        return string(abi.encodePacked("[", metadataString, "]"));
    }

    /**
     * @dev Returns the SVG and metadata for a token Id
     * @param _tokenId The tokenId to return the SVG and metadata for.
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId));

        string memory tokenHash = _tokenIdToHash(_tokenId);

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    doggosLibrary.encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "ocDoggos #',
                                    doggosLibrary.toString(_tokenId),
                                    '", "description": "On-Chain Doggos is a collection of 4,000 uniquely generated Doggos. All the metadata and images are 100% stored on the Ethereum blockchain.", "image": "data:image/svg+xml;base64,',
                                    doggosLibrary.encode(
                                        bytes(hashToSVG(tokenHash))
                                    ),
                                    '","attributes":',
                                    hashToMetadata(tokenHash),
                                    "}"
                                )
                            )
                        )
                    )
                )
            );
    }

    /**
     * @dev Returns a hash for a given tokenId
     * @param _tokenId The tokenId to return the hash for.
     */
    function _tokenIdToHash(uint256 _tokenId)
        public
        view
        returns (string memory)
    {
        string memory tokenHash = tokenIdToHash[_tokenId];
        //If this is a burned token, override the previous hash
        if (ownerOf(_tokenId) == 0x000000000000000000000000000000000000dEaD) {
            tokenHash = string(
                abi.encodePacked(
                    "1",
                    doggosLibrary.substring(tokenHash, 1, 9)
                )
            );
        }

        return tokenHash;
    }

    /*

  ___   __    __  ____     ___  ____       _____  __ __  ____     __ ______  ____  ___   ____   _____
 /   \ |  |__|  ||    \   /  _]|    \     |     ||  |  ||    \   /  ]      ||    |/   \ |    \ / ___/
|     ||  |  |  ||  _  | /  [_ |  D  )    |   __||  |  ||  _  | /  /|      | |  ||     ||  _  (   \_ 
|  O  ||  |  |  ||  |  ||    _]|    /     |  |_  |  |  ||  |  |/  / |_|  |_| |  ||  O  ||  |  |\__  |
|     ||  `  '  ||  |  ||   [_ |    \     |   _] |  :  ||  |  /   \_  |  |   |  ||     ||  |  |/  \ |
|     | \      / |  |  ||     ||  .  \    |  |   |     ||  |  \     | |  |   |  ||     ||  |  |\    |
 \___/   \_/\_/  |__|__||_____||__|\_|    |__|    \__,_||__|__|\____| |__|  |____|\___/ |__|__| \___|
                                                                                                     


    */

    /**
     * @dev Clears the traits.
     */
     function clearTraits() public onlyOwner {
         for (uint256 i = 0; i < 9; i++) {
             delete traitTypes[i];
         }
     }

    /**
     * @dev Add a trait type
     * @param _traitTypeIndex The trait type index
     * @param traits Array of traits to add
     */

    function addTraitType(uint256 _traitTypeIndex, Trait[] memory traits)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                Trait(
                    traits[i].traitName,
                    traits[i].traitType,
                    traits[i].pixels,
                    traits[i].pixelCount
                )
            );
        }

        return;
    }
}

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":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"internalType":"struct doggos.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearTraits","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":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_times","type":"uint256"}],"name":"mintDoggos","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"},{"internalType":"string","name":"pixels","type":"string"},{"internalType":"uint256","name":"pixelCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052666a94d74f430000600b55610fa0600f5560006010556040518061034001604052806040518060400160405280600181526020017f610000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f620000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f630000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f640000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f650000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f660000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f670000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f680000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f690000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6a0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6b0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6c0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6d0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6e0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f6f0000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f700000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f710000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f720000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f730000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f740000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f750000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f760000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f770000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f780000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f790000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f7a00000000000000000000000000000000000000000000000000000000000000815250815250601190601a6200063492919062000d33565b503480156200064257600080fd5b506040518060400160405280600881526020017f6f63446f67676f730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4f434400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620006c792919062000d9a565b508060019080519060200190620006e092919062000d9a565b50505062000703620006f762000c6560201b60201c565b62000c6d60201b60201c565b604051806101400160405280603261ffff168152602001609661ffff16815260200160c861ffff16815260200161012c61ffff16815260200161019061ffff1681526020016101f461ffff16815260200161025861ffff16815260200161038461ffff1681526020016104b061ffff16815260200161164461ffff168152506012600060088110620007be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a620007cf92919062000e2b565b506040518060a00160405280603261ffff16815260200160c861ffff16815260200161012c61ffff16815260200161012c61ffff1681526020016123be61ffff1681525060126001600881106200084f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019060056200086092919062000edc565b506040518060a0016040528061012c61ffff16815260200161032061ffff16815260200161038461ffff1681526020016103e861ffff168152602001611b5861ffff168152506012600260088110620008e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01906005620008f392919062000edc565b506040518060a00160405280603261ffff16815260200160c861ffff16815260200161012c61ffff16815260200161012c61ffff1681526020016123be61ffff16815250601260036008811062000973577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b019060056200098492919062000edc565b50604051806101400160405280603261ffff168152602001606461ffff16815260200161019061ffff1681526020016101c261ffff1681526020016101f461ffff1681526020016102bc61ffff16815260200161070861ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff16815250601260046008811062000a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a62000a5292919062000e2b565b506040518060e0016040528061059461ffff16815260200161059461ffff16815260200161059461ffff16815260200161059561ffff16815260200161059561ffff16815260200161059561ffff16815260200161059561ffff16815250601260056008811062000aec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600762000afd92919062000f8d565b506040518060a001604052806107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff1681526020016107d061ffff16815250601260066008811062000b7f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600562000b9092919062000edc565b50604051806101400160405280601461ffff168152602001604661ffff1681526020016102d161ffff1681526020016103e861ffff16815260200161048361ffff1681526020016104b061ffff16815260200161051461ffff16815260200161059a61ffff16815260200161060561ffff16815260200161061761ffff16815250601260076008811062000c4d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0190600a62000c5e92919062000e2b565b5062001130565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000d87579160200282015b8281111562000d8657825182908051906020019062000d7592919062000d9a565b509160200191906001019062000d54565b5b50905062000d9691906200103e565b5090565b82805462000da890620010cb565b90600052602060002090601f01602090048101928262000dcc576000855562000e18565b82601f1062000de757805160ff191683800117855562000e18565b8280016001018555821562000e18579182015b8281111562000e1757825182559160200191906001019062000dfa565b5b50905062000e27919062001066565b5090565b82805482825590600052602060002090600f0160109004810192821562000ec95791602002820160005b8382111562000e9757835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000e55565b801562000ec75782816101000a81549061ffff021916905560020160208160010104928301926001030262000e97565b505b50905062000ed8919062001066565b5090565b82805482825590600052602060002090600f0160109004810192821562000f7a5791602002820160005b8382111562000f4857835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000f06565b801562000f785782816101000a81549061ffff021916905560020160208160010104928301926001030262000f48565b505b50905062000f89919062001066565b5090565b82805482825590600052602060002090600f016010900481019282156200102b5791602002820160005b8382111562000ff957835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000fb7565b8015620010295782816101000a81549061ffff021916905560020160208160010104928301926001030262000ff9565b505b5090506200103a919062001066565b5090565b5b8082111562001062576000818162001058919062001085565b506001016200103f565b5090565b5b808211156200108157600081600090555060010162001067565b5090565b5080546200109390620010cb565b6000825580601f10620010a75750620010c8565b601f016020900490600052602060002090810190620010c7919062001066565b5b50565b60006002820490506001821680620010e457607f821691505b60208210811415620010fb57620010fa62001101565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615edf80620011406000396000f3fe6080604052600436106101b65760003560e01c80636352211e116100ec578063a035b1fe1161008a578063c87b56dd11610064578063c87b56dd14610625578063d93dfe8814610662578063e985e9c51461068b578063f2fde38b146106c8576101b6565b8063a035b1fe146105a8578063a22cb465146105d3578063b88d4fde146105fc576101b6565b8063715018a6116100c6578063715018a6146104fe57806389ce3074146105155780638da5cb5b1461055257806395d89b411461057d576101b6565b80636352211e1461044757806366e338701461048457806370a08231146104c1576101b6565b80631a582424116101595780632fb098d2116101335780632fb098d21461038a5780633ccfd60b146103ca57806342842e0e146103e15780634f6ccce71461040a576101b6565b80631a5824241461030857806323b872dd146103245780632f745c591461034d576101b6565b8063081812fc11610195578063081812fc14610260578063095ea7b31461029d578063098afd4b146102c657806318160ddd146102dd576101b6565b80625ea307146101bb57806301ffc9a7146101f857806306fdde0314610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613ecd565b6106f1565b6040516101ef9190615518565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613e3a565b610809565b60405161022c91906154fd565b60405180910390f35b34801561024157600080fd5b5061024a610883565b6040516102579190615518565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613ecd565b610915565b6040516102949190615496565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613dfe565b61099a565b005b3480156102d257600080fd5b506102db610ab2565b005b3480156102e957600080fd5b506102f2610b6f565b6040516102ff91906157d4565b60405180910390f35b610322600480360381019061031d9190613ecd565b610b7c565b005b34801561033057600080fd5b5061034b60048036038101906103469190613cf8565b610c22565b005b34801561035957600080fd5b50610374600480360381019061036f9190613dfe565b610c82565b60405161038191906157d4565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190613f4a565b610d27565b6040516103c1949392919061553a565b60405180910390f35b3480156103d657600080fd5b506103df610f0c565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613cf8565b610fd7565b005b34801561041657600080fd5b50610431600480360381019061042c9190613ecd565b610ff7565b60405161043e91906157d4565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613ecd565b61108e565b60405161047b9190615496565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190613e8c565b611140565b6040516104b89190615518565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613c93565b6112ce565b6040516104f591906157d4565b60405180910390f35b34801561050a57600080fd5b50610513611386565b005b34801561052157600080fd5b5061053c60048036038101906105379190613e8c565b61140e565b6040516105499190615518565b60405180910390f35b34801561055e57600080fd5b506105676117d6565b6040516105749190615496565b60405180910390f35b34801561058957600080fd5b50610592611800565b60405161059f9190615518565b60405180910390f35b3480156105b457600080fd5b506105bd611892565b6040516105ca91906157d4565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613dc2565b611898565b005b34801561060857600080fd5b50610623600480360381019061061e9190613d47565b611a19565b005b34801561063157600080fd5b5061064c60048036038101906106479190613ecd565b611a7b565b6040516106599190615518565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190613ef6565b611b0f565b005b34801561069757600080fd5b506106b260048036038101906106ad9190613cbc565b611d7f565b6040516106bf91906154fd565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190613c93565b611e13565b005b60606000600e6000848152602001908152602001600020805461071390615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90615c04565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905061dead73ffffffffffffffffffffffffffffffffffffffff166107b58461108e565b73ffffffffffffffffffffffffffffffffffffffff161415610800576107de8160016009611f0b565b6040516020016107ee9190615404565b60405160208183030381529060405290505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087c575061087b82612079565b5b9050919050565b60606000805461089290615c04565b80601f01602080910402602001604051908101604052809291908181526020018280546108be90615c04565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b60006109208261215b565b61095f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610956906156f4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a58261108e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90615754565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a356121c7565b73ffffffffffffffffffffffffffffffffffffffff161480610a645750610a6381610a5e6121c7565b611d7f565b5b610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90615674565b60405180910390fd5b610aad83836121cf565b505050565b610aba6121c7565b73ffffffffffffffffffffffffffffffffffffffff16610ad86117d6565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590615714565b60405180910390fd5b60005b6009811015610b6c57600c60008281526020019081526020016000206000610b599190613870565b8080610b6490615c61565b915050610b31565b50565b6000600880549050905090565b600081118015610b8d5750600a8111155b8015610ba55750600b5481610ba29190615a36565b34145b8015610bb95750600f54610bb7610b6f565b105b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90615794565b60405180910390fd5b60005b81811015610c1e57610c0b612288565b8080610c1690615c61565b915050610bfb565b5050565b610c33610c2d6121c7565b82612344565b610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990615774565b60405180910390fd5b610c7d838383612422565b505050565b6000610c8d836112ce565b8210610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590615594565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c6020528160005260406000208181548110610d4357600080fd5b906000526020600020906004020160009150915050806000018054610d6790615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9390615c04565b8015610de05780601f10610db557610100808354040283529160200191610de0565b820191906000526020600020905b815481529060010190602001808311610dc357829003601f168201915b505050505090806001018054610df590615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2190615c04565b8015610e6e5780601f10610e4357610100808354040283529160200191610e6e565b820191906000526020600020905b815481529060010190602001808311610e5157829003601f168201915b505050505090806002018054610e8390615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaf90615c04565b8015610efc5780601f10610ed157610100808354040283529160200191610efc565b820191906000526020600020905b815481529060010190602001808311610edf57829003601f168201915b5050505050908060030154905084565b610f146121c7565b73ffffffffffffffffffffffffffffffffffffffff16610f326117d6565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90615714565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd3573d6000803e3d6000fd5b5050565b610ff283838360405180602001604052806000815250611a19565b505050565b6000611001610b6f565b8210611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906157b4565b60405180910390fd5b6008828154811061107c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906156b4565b60405180910390fd5b80915050919050565b60608060005b60098160ff1610156112a5576000611179611174868460ff1660018661116c9190615992565b60ff16611f0b565b61267e565b905082600c60008460ff1681526020019081526020016000208260ff16815481106111cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600101600c60008560ff1681526020019081526020016000208360ff168154811061122f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600001604051602001611252939291906152c2565b604051602081830303815290604052925060088260ff1614611291578260405160200161127f9190615236565b60405160208183030381529060405292505b50808061129d90615caa565b915050611146565b50806040516020016112b79190615358565b604051602081830303815290604052915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690615694565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138e6121c7565b73ffffffffffffffffffffffffffffffffffffffff166113ac6117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990615714565b60405180910390fd5b61140c60006127d4565b565b606080611419613894565b60005b60098160ff1610156117a957600061144f61144a878460ff166001866114429190615992565b60ff16611f0b565b61267e565b905060005b600c60008460ff1681526020019081526020016000208260ff16815481106114a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301548161ffff1610156117945760006115e4600c60008660ff1681526020019081526020016000208460ff1681548110611518577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201805461153490615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461156090615c04565b80156115ad5780601f10611582576101008083540402835291602001916115ad565b820191906000526020600020905b81548152906001019060200180831161159057829003601f168201915b50505050506004846115bf91906159fa565b61ffff16600480866115d191906159fa565b6115db9190615904565b61ffff16611f0b565b905060006115fd6115f88360006001611f0b565b61289a565b905060006116166116118460016002611f0b565b61289a565b9050868260ff1660188110611654577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518160ff1660188110611694577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151156116a657505050611781565b876116b48460026004611f0b565b6116c08460ff1661297f565b6116cc8460ff1661297f565b6040516020016116df9493929190615258565b60405160208183030381529060405297506001878360ff166018811061172e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260ff166018811061176e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020190151590811515815250505050505b808061178c90615c36565b915050611454565b505080806117a190615caa565b91505061141c565b50816040516020016117bb919061532b565b60405160208183030381529060405291508192505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461180f90615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461183b90615c04565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b5050505050905090565b600b5481565b6118a06121c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590615634565b60405180910390fd5b806005600061191b6121c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c86121c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a0d91906154fd565b60405180910390a35050565b611a2a611a246121c7565b83612344565b611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090615774565b60405180910390fd5b611a7584848484612b2c565b50505050565b6060611a868261215b565b611a8f57600080fd5b6000611a9a836106f1565b9050611ae8611aa88461297f565b611ab9611ab48461140e565b612b88565b611ac284611140565b604051602001611ad4939291906153a7565b604051602081830303815290604052612b88565b604051602001611af89190615385565b604051602081830303815290604052915050919050565b611b176121c7565b73ffffffffffffffffffffffffffffffffffffffff16611b356117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290615714565b60405180910390fd5b60005b8151811015611d7a57600c60008481526020019081526020016000206040518060800160405280848481518110611bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001848481518110611c38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001848481518110611c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001518152602001848481518110611ccc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516060015181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019080519060200190611d209291906138c2565b506020820151816001019080519060200190611d3d9291906138c2565b506040820151816002019080519060200190611d5a9291906138c2565b506060820151816003015550508080611d7290615c61565b915050611b8e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e1b6121c7565b73ffffffffffffffffffffffffffffffffffffffff16611e396117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690615714565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef6906155d4565b60405180910390fd5b611f08816127d4565b50565b6060600084905060008484611f209190615acb565b67ffffffffffffffff811115611f5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f915781602001600182028036833780820191505090505b50905060008590505b8481101561206c57828181518110611fdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828783611ff39190615acb565b8151811061202a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061206490615c61565b915050611f9a565b5080925050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612154575061215382612d33565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122428361108e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612292610b6f565b9050600f5481106122a257600080fd5b6122ab33612d9d565b156122b557600080fd5b60008190506122c681336000612db0565b600e600083815260200190815260200160002090805190602001906122ec9291906138c2565b506001600d600e60008481526020019081526020016000206040516123119190615314565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506123403382612f09565b5050565b600061234f8261215b565b61238e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238590615654565b60405180910390fd5b60006123998361108e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240857508373ffffffffffffffffffffffffffffffffffffffff166123f084610915565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241957506124188185611d7f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124428261108e565b73ffffffffffffffffffffffffffffffffffffffff1614612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90615734565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90615614565b60405180910390fd5b6125138383836130d7565b61251e6000826121cf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256e9190615acb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c5919061593c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808290506000805b82518160ff1610156127c9576030838260ff16815181106126d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff161015801561273e57506039838260ff168151811061272a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b156127b657600a826127509190615a90565b91506030838260ff1681518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c6127a89190615aff565b826127b39190615992565b91505b80806127c190615caa565b915050612688565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b6011805490508160ff16101561297457826040516020016128c391906151fb565b6040516020818303038152906040528051906020012060118260ff1681548110612916577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016129309190615314565b604051602081830303815290604052805190602001201415612961576001816129599190615992565b91505061297a565b808061296c90615caa565b9150506128a2565b50600080fd5b919050565b606060008214156129c7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b27565b600082905060005b600082146129f95780806129e290615c61565b915050600a826129f291906159c9565b91506129cf565b60008167ffffffffffffffff811115612a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a6d5781602001600182028036833780820191505090505b5090505b60008514612b2057600182612a869190615acb565b9150600a85612a959190615d02565b6030612aa1919061593c565b60f81b818381518110612add577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1991906159c9565b9450612a71565b8093505050505b919050565b612b37848484612422565b612b43848484846131eb565b612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b79906155b4565b60405180910390fd5b50505050565b6060600082511415612bab57604051806020016040528060008152509050612d2e565b6000604051806060016040528060408152602001615e6a6040913990506000600360028551612bda919061593c565b612be491906159c9565b6004612bf09190615a36565b90506000602082612c01919061593c565b67ffffffffffffffff811115612c40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c725781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612ced576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612c86565b600389510660018114612d075760028114612d1757612d22565b613d3d60f01b6002830352612d22565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b6060600a8210612dbf57600080fd5b60006040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905060005b60088160ff161015612eac5760106000815480929190612e1b90615c61565b919050555060006127104244898989601054604051602001612e4296959493929190615426565b6040516020818303038152906040528051906020012060001c612e659190615d02565b905082612e768261ffff1684613382565b604051602001612e87929190615212565b6040516020818303038152906040529250508080612ea490615caa565b915050612dfc565b50600d81604051612ebd91906151fb565b908152602001604051809103902060009054906101000a900460ff1615612efd57612ef58585600186612ef0919061593c565b612db0565b915050612f02565b809150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f70906156d4565b60405180910390fd5b612f828161215b565b15612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906155f4565b60405180910390fd5b612fce600083836130d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461301e919061593c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6130e28383836134e0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561312557613120816134e5565b613164565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461316357613162838261352e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a7576131a28161369b565b6131e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131e5576131e482826137de565b5b5b505050565b600061320c8473ffffffffffffffffffffffffffffffffffffffff1661385d565b15613375578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132356121c7565b8786866040518563ffffffff1660e01b815260040161325794939291906154b1565b602060405180830381600087803b15801561327157600080fd5b505af19250505080156132a257506040513d601f19601f8201168201806040525081019061329f9190613e63565b60015b613325573d80600081146132d2576040519150601f19603f3d011682016040523d82523d6000602084013e6132d7565b606091505b5060008151141561331d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613314906155b4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337a565b600190505b949350505050565b60606000805b60128460ff16600881106133c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01805490508160ff1610156134d457600060128560ff1660088110613413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018260ff168154811061344f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff168610158015613497575080836134909190615904565b61ffff1686105b156134b2576134a88260ff1661297f565b93505050506134da565b80836134be9190615904565b92505080806134cc90615caa565b915050613388565b50600080fd5b92915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161353b846112ce565b6135459190615acb565b905060006007600084815260200190815260200160002054905081811461362a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136af9190615acb565b9050600060096000848152602001908152602001600020549050600060088381548110613705577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061374d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137e9836112ce565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b50805460008255600402906000526020600020908101906138919190613948565b50565b6040518061030001604052806018905b6138ac613997565b8152602001906001900390816138a45790505090565b8280546138ce90615c04565b90600052602060002090601f0160209004810192826138f05760008555613937565b82601f1061390957805160ff1916838001178555613937565b82800160010185558215613937579182015b8281111561393657825182559160200191906001019061391b565b5b50905061394491906139ba565b5090565b5b80821115613993576000808201600061396291906139d7565b60018201600061397291906139d7565b60028201600061398291906139d7565b600382016000905550600401613949565b5090565b604051806103000160405280601890602082028036833780820191505090505090565b5b808211156139d35760008160009055506001016139bb565b5090565b5080546139e390615c04565b6000825580601f106139f55750613a14565b601f016020900490600052602060002090810190613a1391906139ba565b5b50565b6000613a2a613a2584615820565b6157ef565b9050808382526020820190508260005b85811015613a6a5781358501613a508882613bc2565b845260208401935060208301925050600181019050613a3a565b5050509392505050565b6000613a87613a828461584c565b6157ef565b905082815260208101848484011115613a9f57600080fd5b613aaa848285615bc2565b509392505050565b6000613ac5613ac08461587c565b6157ef565b905082815260208101848484011115613add57600080fd5b613ae8848285615bc2565b509392505050565b600081359050613aff81615e0d565b92915050565b600082601f830112613b1657600080fd5b8135613b26848260208601613a17565b91505092915050565b600081359050613b3e81615e24565b92915050565b600081359050613b5381615e3b565b92915050565b600081519050613b6881615e3b565b92915050565b600082601f830112613b7f57600080fd5b8135613b8f848260208601613a74565b91505092915050565b600082601f830112613ba957600080fd5b8135613bb9848260208601613ab2565b91505092915050565b600060808284031215613bd457600080fd5b613bde60806157ef565b9050600082013567ffffffffffffffff811115613bfa57600080fd5b613c0684828501613b98565b600083015250602082013567ffffffffffffffff811115613c2657600080fd5b613c3284828501613b98565b602083015250604082013567ffffffffffffffff811115613c5257600080fd5b613c5e84828501613b98565b6040830152506060613c7284828501613c7e565b60608301525092915050565b600081359050613c8d81615e52565b92915050565b600060208284031215613ca557600080fd5b6000613cb384828501613af0565b91505092915050565b60008060408385031215613ccf57600080fd5b6000613cdd85828601613af0565b9250506020613cee85828601613af0565b9150509250929050565b600080600060608486031215613d0d57600080fd5b6000613d1b86828701613af0565b9350506020613d2c86828701613af0565b9250506040613d3d86828701613c7e565b9150509250925092565b60008060008060808587031215613d5d57600080fd5b6000613d6b87828801613af0565b9450506020613d7c87828801613af0565b9350506040613d8d87828801613c7e565b925050606085013567ffffffffffffffff811115613daa57600080fd5b613db687828801613b6e565b91505092959194509250565b60008060408385031215613dd557600080fd5b6000613de385828601613af0565b9250506020613df485828601613b2f565b9150509250929050565b60008060408385031215613e1157600080fd5b6000613e1f85828601613af0565b9250506020613e3085828601613c7e565b9150509250929050565b600060208284031215613e4c57600080fd5b6000613e5a84828501613b44565b91505092915050565b600060208284031215613e7557600080fd5b6000613e8384828501613b59565b91505092915050565b600060208284031215613e9e57600080fd5b600082013567ffffffffffffffff811115613eb857600080fd5b613ec484828501613b98565b91505092915050565b600060208284031215613edf57600080fd5b6000613eed84828501613c7e565b91505092915050565b60008060408385031215613f0957600080fd5b6000613f1785828601613c7e565b925050602083013567ffffffffffffffff811115613f3457600080fd5b613f4085828601613b05565b9150509250929050565b60008060408385031215613f5d57600080fd5b6000613f6b85828601613c7e565b9250506020613f7c85828601613c7e565b9150509250929050565b613f8f81615b33565b82525050565b613fa6613fa182615b33565b615cd4565b82525050565b613fb581615b45565b82525050565b6000613fc6826158c1565b613fd081856158d7565b9350613fe0818560208601615bd1565b613fe981615def565b840191505092915050565b6000613fff826158cc565b61400981856158e8565b9350614019818560208601615bd1565b61402281615def565b840191505092915050565b6000614038826158cc565b61404281856158f9565b9350614052818560208601615bd1565b80840191505092915050565b6000815461406b81615c04565b61407581866158f9565b9450600182166000811461409057600181146140a1576140d4565b60ff198316865281860193506140d4565b6140aa856158ac565b60005b838110156140cc578154818901526001820191506020810190506140ad565b838801955050505b50505092915050565b60006140ea6005836158f9565b91507f2720793d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061412a602b836158e8565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006141906032836158e8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141f66068836158f9565b91507f3c7376672069643d22632220786d6c6e733d22687474703a2f2f7777772e773360008301527f2e6f72672f323030302f7376672220707265736572766541737065637452617460208301527f696f3d22784d696e594d696e206d656574222076696577426f783d223020302060408301527f3234203234223e200000000000000000000000000000000000000000000000006060830152606882019050919050565b60006142a86026836158e8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430e601c836158e8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061434e6005836158f9565b91507f2720783d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061438e600f836158f9565b91507f222c2261747472696275746573223a00000000000000000000000000000000006000830152600f82019050919050565b60006143ce6001836158f9565b91507f2c000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b600061440e600e836158f9565b91507f3c7265637420636c6173733d27630000000000000000000000000000000000006000830152600e82019050919050565b600061444e6024836158e8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144b46019836158e8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144f4600f836158f9565b91507f7b2274726169745f74797065223a2200000000000000000000000000000000006000830152600f82019050919050565b6000614534602c836158e8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061459a6003836158f9565b91507f272f3e00000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006145da6038836158e8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614640602a836158e8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a66029836158e8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061470d6103f8836158f9565b91507f3c7374796c653e726563747b77696474683a3170783b6865696768743a31707860008301527f3b7d23637b73686170652d72656e646572696e673a206372697370656467657360208301527f3b7d2e6330307b66696c6c3a236636373637627d2e6330317b66696c6c3a236660408301527f66666666667d2e6330327b66696c6c3a233030303030307d2e6330337b66696c60608301527f6c3a236331303038627d2e6330347b66696c6c3a236463303039657d2e63303560808301527f7b66696c6c3a236566303061397d2e6330367b66696c6c3a236666303034337d60a08301527f2e6330377b66696c6c3a236337343234397d2e6330387b66696c6c3a2361613360c08301527f3433617d2e6330397b66696c6c3a233336333733377d2e6331307b66696c6c3a60e08301527f233163316331637d2e6331317b66696c6c3a233263326332637d2e6331327b666101008301527f696c6c3a233661396363357d2e6331337b66696c6c3a233966643266637d2e636101208301527f31347b66696c6c3a236364363130307d2e6331357b66696c6c3a2332663266326101408301527f667d2e6331367b66696c6c3a236664373530307d2e6331377b66696c6c3a23666101608301527f36386432667d2e6331387b66696c6c3a233437343734377d2e6331397b66696c6101808301527f6c3a233538353835387d2e6332307b66696c6c3a233234323432347d2e6332316101a08301527f7b66696c6c3a233963376436617d2e6332327b66696c6c3a233365336533657d6101c08301527f2e6332337b66696c6c3a233230323032307d2e6332347b66696c6c3a236230356101e08301527f3531347d2e6332357b66696c6c3a233733336533397d2e6332367b66696c6c3a6102008301527f236632643030307d2e6332377b66696c6c3a236633646430307d2e6332387b666102208301527f696c6c3a236363636363647d2e6332397b66696c6c3a236461643464327d2e636102408301527f33307b66696c6c3a236563653365307d2e6333317b66696c6c3a2330306164636102608301527f307d2e6333327b66696c6c3a233030623863637d2e6333337b66696c6c3a23306102808301527f30633464627d2e6333347b66696c6c3a233463336232667d2e6333357b66696c6102a08301527f6c3a233639353033387d2e6333367b66696c6c3a236235383135327d2e6333376102c08301527f7b66696c6c3a233030386339627d2e6333387b66696c6c3a236335633564627d6102e08301527f2e6333397b66696c6c3a233030643666667d2e6334307b66696c6c3a236466336103008301527f3435337d2e6334317b66696c6c3a236434623530307d2e6334327b66696c6c3a6103208301527f233532333734377d2e6334337b66696c6c3a233366343034337d2e6334347b666103408301527f696c6c3a233566356535637d2e6334357b66696c6c3a236336396539347d2e636103608301527f34367b66696c6c3a236131393538637d2e6334377b66696c6c3a2339383138376103808301527f307d2e6334387b66696c6c3a236362626130307d2e6334397b66696c6c3a23646103a08301527f66636330307d2e6335307b66696c6c3a233133613732657d2e6335317b66696c6103c08301527f6c3a233063386132347d3c2f7374796c653e3c2f7376673e00000000000000006103e08301526103f882019050919050565b6000614c006002836158f9565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614c406020836158e8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614c806001836158f9565b91507f7d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614cc0602c836158e8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614d266020836158e8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614d666001836158f9565b91507f5b000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614da66029836158e8565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e0c600b836158f9565b91507f222c2276616c7565223a220000000000000000000000000000000000000000006000830152600b82019050919050565b6000614e4c6001836158f9565b91507f5d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614e8c6021836158e8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ef2601d836158f9565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614f326014836158f9565b91507f7b226e616d65223a20226f63446f67676f7320230000000000000000000000006000830152601482019050919050565b6000614f726031836158e8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614fd86001836158f9565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006150186001836158e8565b91507f74000000000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000615058602c836158e8565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006150be60c5836158f9565b91507f222c20226465736372697074696f6e223a20224f6e2d436861696e20446f676760008301527f6f73206973206120636f6c6c656374696f6e206f6620342c30303020756e697160208301527f75656c792067656e65726174656420446f67676f732e20416c6c20746865206d60408301527f6574616461746120616e6420696d616765732061726520313030252073746f7260608301527f6564206f6e2074686520457468657265756d20626c6f636b636861696e2e222c60808301527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160a08301527f736536342c00000000000000000000000000000000000000000000000000000060c083015260c582019050919050565b6151de81615bab565b82525050565b6151f56151f082615bab565b615cf8565b82525050565b6000615207828461402d565b915081905092915050565b600061521e828561402d565b915061522a828461402d565b91508190509392505050565b6000615242828461402d565b915061524d826143c1565b915081905092915050565b6000615264828761402d565b915061526f82614401565b915061527b828661402d565b915061528682614341565b9150615292828561402d565b915061529d826140dd565b91506152a9828461402d565b91506152b48261458d565b915081905095945050505050565b60006152ce828661402d565b91506152d9826144e7565b91506152e5828561405e565b91506152f082614dff565b91506152fc828461405e565b915061530782614bf3565b9150819050949350505050565b6000615320828461405e565b915081905092915050565b6000615336826141e9565b9150615342828461402d565b915061534d826146ff565b915081905092915050565b600061536382614d59565b915061536f828461402d565b915061537a82614e3f565b915081905092915050565b600061539082614ee5565b915061539c828461402d565b915081905092915050565b60006153b282614f25565b91506153be828661402d565b91506153c9826150b1565b91506153d5828561402d565b91506153e082614381565b91506153ec828461402d565b91506153f782614c73565b9150819050949350505050565b600061540f82614fcb565b915061541b828461402d565b915081905092915050565b600061543282896151e4565b60208201915061544282886151e4565b60208201915061545282876151e4565b6020820191506154628286613f95565b60148201915061547282856151e4565b60208201915061548282846151e4565b602082019150819050979650505050505050565b60006020820190506154ab6000830184613f86565b92915050565b60006080820190506154c66000830187613f86565b6154d36020830186613f86565b6154e060408301856151d5565b81810360608301526154f28184613fbb565b905095945050505050565b60006020820190506155126000830184613fac565b92915050565b600060208201905081810360008301526155328184613ff4565b905092915050565b600060808201905081810360008301526155548187613ff4565b905081810360208301526155688186613ff4565b9050818103604083015261557c8185613ff4565b905061558b60608301846151d5565b95945050505050565b600060208201905081810360008301526155ad8161411d565b9050919050565b600060208201905081810360008301526155cd81614183565b9050919050565b600060208201905081810360008301526155ed8161429b565b9050919050565b6000602082019050818103600083015261560d81614301565b9050919050565b6000602082019050818103600083015261562d81614441565b9050919050565b6000602082019050818103600083015261564d816144a7565b9050919050565b6000602082019050818103600083015261566d81614527565b9050919050565b6000602082019050818103600083015261568d816145cd565b9050919050565b600060208201905081810360008301526156ad81614633565b9050919050565b600060208201905081810360008301526156cd81614699565b9050919050565b600060208201905081810360008301526156ed81614c33565b9050919050565b6000602082019050818103600083015261570d81614cb3565b9050919050565b6000602082019050818103600083015261572d81614d19565b9050919050565b6000602082019050818103600083015261574d81614d99565b9050919050565b6000602082019050818103600083015261576d81614e7f565b9050919050565b6000602082019050818103600083015261578d81614f65565b9050919050565b600060208201905081810360008301526157ad8161500b565b9050919050565b600060208201905081810360008301526157cd8161504b565b9050919050565b60006020820190506157e960008301846151d5565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561581657615815615dc0565b5b8060405250919050565b600067ffffffffffffffff82111561583b5761583a615dc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561586757615866615dc0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561589757615896615dc0565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061590f82615b7d565b915061591a83615b7d565b92508261ffff0382111561593157615930615d33565b5b828201905092915050565b600061594782615bab565b915061595283615bab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561598757615986615d33565b5b828201905092915050565b600061599d82615bb5565b91506159a883615bb5565b92508260ff038211156159be576159bd615d33565b5b828201905092915050565b60006159d482615bab565b91506159df83615bab565b9250826159ef576159ee615d62565b5b828204905092915050565b6000615a0582615b7d565b9150615a1083615b7d565b92508161ffff0483118215151615615a2b57615a2a615d33565b5b828202905092915050565b6000615a4182615bab565b9150615a4c83615bab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615a8557615a84615d33565b5b828202905092915050565b6000615a9b82615bb5565b9150615aa683615bb5565b92508160ff0483118215151615615ac057615abf615d33565b5b828202905092915050565b6000615ad682615bab565b9150615ae183615bab565b925082821015615af457615af3615d33565b5b828203905092915050565b6000615b0a82615bb5565b9150615b1583615bb5565b925082821015615b2857615b27615d33565b5b828203905092915050565b6000615b3e82615b8b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615bef578082015181840152602081019050615bd4565b83811115615bfe576000848401525b50505050565b60006002820490506001821680615c1c57607f821691505b60208210811415615c3057615c2f615d91565b5b50919050565b6000615c4182615b7d565b915061ffff821415615c5657615c55615d33565b5b600182019050919050565b6000615c6c82615bab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c9f57615c9e615d33565b5b600182019050919050565b6000615cb582615bb5565b915060ff821415615cc957615cc8615d33565b5b600182019050919050565b6000615cdf82615ce6565b9050919050565b6000615cf182615e00565b9050919050565b6000819050919050565b6000615d0d82615bab565b9150615d1883615bab565b925082615d2857615d27615d62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615e1681615b33565b8114615e2157600080fd5b50565b615e2d81615b45565b8114615e3857600080fd5b50565b615e4481615b51565b8114615e4f57600080fd5b50565b615e5b81615bab565b8114615e6657600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220956b4c89e876bc95d6ec071020853d01512b3bb5da09c17c0b2025e1cdcb03bb64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101b65760003560e01c80636352211e116100ec578063a035b1fe1161008a578063c87b56dd11610064578063c87b56dd14610625578063d93dfe8814610662578063e985e9c51461068b578063f2fde38b146106c8576101b6565b8063a035b1fe146105a8578063a22cb465146105d3578063b88d4fde146105fc576101b6565b8063715018a6116100c6578063715018a6146104fe57806389ce3074146105155780638da5cb5b1461055257806395d89b411461057d576101b6565b80636352211e1461044757806366e338701461048457806370a08231146104c1576101b6565b80631a582424116101595780632fb098d2116101335780632fb098d21461038a5780633ccfd60b146103ca57806342842e0e146103e15780634f6ccce71461040a576101b6565b80631a5824241461030857806323b872dd146103245780632f745c591461034d576101b6565b8063081812fc11610195578063081812fc14610260578063095ea7b31461029d578063098afd4b146102c657806318160ddd146102dd576101b6565b80625ea307146101bb57806301ffc9a7146101f857806306fdde0314610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd9190613ecd565b6106f1565b6040516101ef9190615518565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613e3a565b610809565b60405161022c91906154fd565b60405180910390f35b34801561024157600080fd5b5061024a610883565b6040516102579190615518565b60405180910390f35b34801561026c57600080fd5b5061028760048036038101906102829190613ecd565b610915565b6040516102949190615496565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613dfe565b61099a565b005b3480156102d257600080fd5b506102db610ab2565b005b3480156102e957600080fd5b506102f2610b6f565b6040516102ff91906157d4565b60405180910390f35b610322600480360381019061031d9190613ecd565b610b7c565b005b34801561033057600080fd5b5061034b60048036038101906103469190613cf8565b610c22565b005b34801561035957600080fd5b50610374600480360381019061036f9190613dfe565b610c82565b60405161038191906157d4565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac9190613f4a565b610d27565b6040516103c1949392919061553a565b60405180910390f35b3480156103d657600080fd5b506103df610f0c565b005b3480156103ed57600080fd5b5061040860048036038101906104039190613cf8565b610fd7565b005b34801561041657600080fd5b50610431600480360381019061042c9190613ecd565b610ff7565b60405161043e91906157d4565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613ecd565b61108e565b60405161047b9190615496565b60405180910390f35b34801561049057600080fd5b506104ab60048036038101906104a69190613e8c565b611140565b6040516104b89190615518565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190613c93565b6112ce565b6040516104f591906157d4565b60405180910390f35b34801561050a57600080fd5b50610513611386565b005b34801561052157600080fd5b5061053c60048036038101906105379190613e8c565b61140e565b6040516105499190615518565b60405180910390f35b34801561055e57600080fd5b506105676117d6565b6040516105749190615496565b60405180910390f35b34801561058957600080fd5b50610592611800565b60405161059f9190615518565b60405180910390f35b3480156105b457600080fd5b506105bd611892565b6040516105ca91906157d4565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190613dc2565b611898565b005b34801561060857600080fd5b50610623600480360381019061061e9190613d47565b611a19565b005b34801561063157600080fd5b5061064c60048036038101906106479190613ecd565b611a7b565b6040516106599190615518565b60405180910390f35b34801561066e57600080fd5b5061068960048036038101906106849190613ef6565b611b0f565b005b34801561069757600080fd5b506106b260048036038101906106ad9190613cbc565b611d7f565b6040516106bf91906154fd565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea9190613c93565b611e13565b005b60606000600e6000848152602001908152602001600020805461071390615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461073f90615c04565b801561078c5780601f106107615761010080835404028352916020019161078c565b820191906000526020600020905b81548152906001019060200180831161076f57829003601f168201915b5050505050905061dead73ffffffffffffffffffffffffffffffffffffffff166107b58461108e565b73ffffffffffffffffffffffffffffffffffffffff161415610800576107de8160016009611f0b565b6040516020016107ee9190615404565b60405160208183030381529060405290505b80915050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087c575061087b82612079565b5b9050919050565b60606000805461089290615c04565b80601f01602080910402602001604051908101604052809291908181526020018280546108be90615c04565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b60006109208261215b565b61095f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610956906156f4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a58261108e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0d90615754565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a356121c7565b73ffffffffffffffffffffffffffffffffffffffff161480610a645750610a6381610a5e6121c7565b611d7f565b5b610aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9a90615674565b60405180910390fd5b610aad83836121cf565b505050565b610aba6121c7565b73ffffffffffffffffffffffffffffffffffffffff16610ad86117d6565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590615714565b60405180910390fd5b60005b6009811015610b6c57600c60008281526020019081526020016000206000610b599190613870565b8080610b6490615c61565b915050610b31565b50565b6000600880549050905090565b600081118015610b8d5750600a8111155b8015610ba55750600b5481610ba29190615a36565b34145b8015610bb95750600f54610bb7610b6f565b105b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90615794565b60405180910390fd5b60005b81811015610c1e57610c0b612288565b8080610c1690615c61565b915050610bfb565b5050565b610c33610c2d6121c7565b82612344565b610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990615774565b60405180910390fd5b610c7d838383612422565b505050565b6000610c8d836112ce565b8210610cce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc590615594565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c6020528160005260406000208181548110610d4357600080fd5b906000526020600020906004020160009150915050806000018054610d6790615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9390615c04565b8015610de05780601f10610db557610100808354040283529160200191610de0565b820191906000526020600020905b815481529060010190602001808311610dc357829003601f168201915b505050505090806001018054610df590615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2190615c04565b8015610e6e5780601f10610e4357610100808354040283529160200191610e6e565b820191906000526020600020905b815481529060010190602001808311610e5157829003601f168201915b505050505090806002018054610e8390615c04565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaf90615c04565b8015610efc5780601f10610ed157610100808354040283529160200191610efc565b820191906000526020600020905b815481529060010190602001808311610edf57829003601f168201915b5050505050908060030154905084565b610f146121c7565b73ffffffffffffffffffffffffffffffffffffffff16610f326117d6565b73ffffffffffffffffffffffffffffffffffffffff1614610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90615714565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd3573d6000803e3d6000fd5b5050565b610ff283838360405180602001604052806000815250611a19565b505050565b6000611001610b6f565b8210611042576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611039906157b4565b60405180910390fd5b6008828154811061107c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906156b4565b60405180910390fd5b80915050919050565b60608060005b60098160ff1610156112a5576000611179611174868460ff1660018661116c9190615992565b60ff16611f0b565b61267e565b905082600c60008460ff1681526020019081526020016000208260ff16815481106111cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600101600c60008560ff1681526020019081526020016000208360ff168154811061122f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600001604051602001611252939291906152c2565b604051602081830303815290604052925060088260ff1614611291578260405160200161127f9190615236565b60405160208183030381529060405292505b50808061129d90615caa565b915050611146565b50806040516020016112b79190615358565b604051602081830303815290604052915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133690615694565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61138e6121c7565b73ffffffffffffffffffffffffffffffffffffffff166113ac6117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990615714565b60405180910390fd5b61140c60006127d4565b565b606080611419613894565b60005b60098160ff1610156117a957600061144f61144a878460ff166001866114429190615992565b60ff16611f0b565b61267e565b905060005b600c60008460ff1681526020019081526020016000208260ff16815481106114a5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600301548161ffff1610156117945760006115e4600c60008660ff1681526020019081526020016000208460ff1681548110611518577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060040201600201805461153490615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461156090615c04565b80156115ad5780601f10611582576101008083540402835291602001916115ad565b820191906000526020600020905b81548152906001019060200180831161159057829003601f168201915b50505050506004846115bf91906159fa565b61ffff16600480866115d191906159fa565b6115db9190615904565b61ffff16611f0b565b905060006115fd6115f88360006001611f0b565b61289a565b905060006116166116118460016002611f0b565b61289a565b9050868260ff1660188110611654577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518160ff1660188110611694577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151156116a657505050611781565b876116b48460026004611f0b565b6116c08460ff1661297f565b6116cc8460ff1661297f565b6040516020016116df9493929190615258565b60405160208183030381529060405297506001878360ff166018811061172e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518260ff166018811061176e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020190151590811515815250505050505b808061178c90615c36565b915050611454565b505080806117a190615caa565b91505061141c565b50816040516020016117bb919061532b565b60405160208183030381529060405291508192505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461180f90615c04565b80601f016020809104026020016040519081016040528092919081815260200182805461183b90615c04565b80156118885780601f1061185d57610100808354040283529160200191611888565b820191906000526020600020905b81548152906001019060200180831161186b57829003601f168201915b5050505050905090565b600b5481565b6118a06121c7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190590615634565b60405180910390fd5b806005600061191b6121c7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c86121c7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a0d91906154fd565b60405180910390a35050565b611a2a611a246121c7565b83612344565b611a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6090615774565b60405180910390fd5b611a7584848484612b2c565b50505050565b6060611a868261215b565b611a8f57600080fd5b6000611a9a836106f1565b9050611ae8611aa88461297f565b611ab9611ab48461140e565b612b88565b611ac284611140565b604051602001611ad4939291906153a7565b604051602081830303815290604052612b88565b604051602001611af89190615385565b604051602081830303815290604052915050919050565b611b176121c7565b73ffffffffffffffffffffffffffffffffffffffff16611b356117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8290615714565b60405180910390fd5b60005b8151811015611d7a57600c60008481526020019081526020016000206040518060800160405280848481518110611bee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001848481518110611c38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001848481518110611c82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001518152602001848481518110611ccc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516060015181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019080519060200190611d209291906138c2565b506020820151816001019080519060200190611d3d9291906138c2565b506040820151816002019080519060200190611d5a9291906138c2565b506060820151816003015550508080611d7290615c61565b915050611b8e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e1b6121c7565b73ffffffffffffffffffffffffffffffffffffffff16611e396117d6565b73ffffffffffffffffffffffffffffffffffffffff1614611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690615714565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef6906155d4565b60405180910390fd5b611f08816127d4565b50565b6060600084905060008484611f209190615acb565b67ffffffffffffffff811115611f5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611f915781602001600182028036833780820191505090505b50905060008590505b8481101561206c57828181518110611fdb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b828783611ff39190615acb565b8151811061202a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061206490615c61565b915050611f9a565b5080925050509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612154575061215382612d33565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122428361108e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612292610b6f565b9050600f5481106122a257600080fd5b6122ab33612d9d565b156122b557600080fd5b60008190506122c681336000612db0565b600e600083815260200190815260200160002090805190602001906122ec9291906138c2565b506001600d600e60008481526020019081526020016000206040516123119190615314565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506123403382612f09565b5050565b600061234f8261215b565b61238e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238590615654565b60405180910390fd5b60006123998361108e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240857508373ffffffffffffffffffffffffffffffffffffffff166123f084610915565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241957506124188185611d7f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124428261108e565b73ffffffffffffffffffffffffffffffffffffffff1614612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90615734565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90615614565b60405180910390fd5b6125138383836130d7565b61251e6000826121cf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256e9190615acb565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c5919061593c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000808290506000805b82518160ff1610156127c9576030838260ff16815181106126d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff161015801561273e57506039838260ff168151811061272a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c60ff1611155b156127b657600a826127509190615a90565b91506030838260ff1681518110612790577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b60f81c6127a89190615aff565b826127b39190615992565b91505b80806127c190615caa565b915050612688565b508092505050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080600090505b6011805490508160ff16101561297457826040516020016128c391906151fb565b6040516020818303038152906040528051906020012060118260ff1681548110612916577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020016040516020016129309190615314565b604051602081830303815290604052805190602001201415612961576001816129599190615992565b91505061297a565b808061296c90615caa565b9150506128a2565b50600080fd5b919050565b606060008214156129c7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b27565b600082905060005b600082146129f95780806129e290615c61565b915050600a826129f291906159c9565b91506129cf565b60008167ffffffffffffffff811115612a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a6d5781602001600182028036833780820191505090505b5090505b60008514612b2057600182612a869190615acb565b9150600a85612a959190615d02565b6030612aa1919061593c565b60f81b818381518110612add577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1991906159c9565b9450612a71565b8093505050505b919050565b612b37848484612422565b612b43848484846131eb565b612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b79906155b4565b60405180910390fd5b50505050565b6060600082511415612bab57604051806020016040528060008152509050612d2e565b6000604051806060016040528060408152602001615e6a6040913990506000600360028551612bda919061593c565b612be491906159c9565b6004612bf09190615a36565b90506000602082612c01919061593c565b67ffffffffffffffff811115612c40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c725781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612ced576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612c86565b600389510660018114612d075760028114612d1757612d22565b613d3d60f01b6002830352612d22565b603d60f81b60018303525b50505050508093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080823b905060008111915050919050565b6060600a8210612dbf57600080fd5b60006040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905060005b60088160ff161015612eac5760106000815480929190612e1b90615c61565b919050555060006127104244898989601054604051602001612e4296959493929190615426565b6040516020818303038152906040528051906020012060001c612e659190615d02565b905082612e768261ffff1684613382565b604051602001612e87929190615212565b6040516020818303038152906040529250508080612ea490615caa565b915050612dfc565b50600d81604051612ebd91906151fb565b908152602001604051809103902060009054906101000a900460ff1615612efd57612ef58585600186612ef0919061593c565b612db0565b915050612f02565b809150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f70906156d4565b60405180910390fd5b612f828161215b565b15612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906155f4565b60405180910390fd5b612fce600083836130d7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461301e919061593c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6130e28383836134e0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561312557613120816134e5565b613164565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461316357613162838261352e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131a7576131a28161369b565b6131e6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131e5576131e482826137de565b5b5b505050565b600061320c8473ffffffffffffffffffffffffffffffffffffffff1661385d565b15613375578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132356121c7565b8786866040518563ffffffff1660e01b815260040161325794939291906154b1565b602060405180830381600087803b15801561327157600080fd5b505af19250505080156132a257506040513d601f19601f8201168201806040525081019061329f9190613e63565b60015b613325573d80600081146132d2576040519150601f19603f3d011682016040523d82523d6000602084013e6132d7565b606091505b5060008151141561331d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613314906155b4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061337a565b600190505b949350505050565b60606000805b60128460ff16600881106133c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01805490508160ff1610156134d457600060128560ff1660088110613413577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018260ff168154811061344f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508261ffff168610158015613497575080836134909190615904565b61ffff1686105b156134b2576134a88260ff1661297f565b93505050506134da565b80836134be9190615904565b92505080806134cc90615caa565b915050613388565b50600080fd5b92915050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161353b846112ce565b6135459190615acb565b905060006007600084815260200190815260200160002054905081811461362a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136af9190615acb565b9050600060096000848152602001908152602001600020549050600060088381548110613705577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061374d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006137e9836112ce565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b50805460008255600402906000526020600020908101906138919190613948565b50565b6040518061030001604052806018905b6138ac613997565b8152602001906001900390816138a45790505090565b8280546138ce90615c04565b90600052602060002090601f0160209004810192826138f05760008555613937565b82601f1061390957805160ff1916838001178555613937565b82800160010185558215613937579182015b8281111561393657825182559160200191906001019061391b565b5b50905061394491906139ba565b5090565b5b80821115613993576000808201600061396291906139d7565b60018201600061397291906139d7565b60028201600061398291906139d7565b600382016000905550600401613949565b5090565b604051806103000160405280601890602082028036833780820191505090505090565b5b808211156139d35760008160009055506001016139bb565b5090565b5080546139e390615c04565b6000825580601f106139f55750613a14565b601f016020900490600052602060002090810190613a1391906139ba565b5b50565b6000613a2a613a2584615820565b6157ef565b9050808382526020820190508260005b85811015613a6a5781358501613a508882613bc2565b845260208401935060208301925050600181019050613a3a565b5050509392505050565b6000613a87613a828461584c565b6157ef565b905082815260208101848484011115613a9f57600080fd5b613aaa848285615bc2565b509392505050565b6000613ac5613ac08461587c565b6157ef565b905082815260208101848484011115613add57600080fd5b613ae8848285615bc2565b509392505050565b600081359050613aff81615e0d565b92915050565b600082601f830112613b1657600080fd5b8135613b26848260208601613a17565b91505092915050565b600081359050613b3e81615e24565b92915050565b600081359050613b5381615e3b565b92915050565b600081519050613b6881615e3b565b92915050565b600082601f830112613b7f57600080fd5b8135613b8f848260208601613a74565b91505092915050565b600082601f830112613ba957600080fd5b8135613bb9848260208601613ab2565b91505092915050565b600060808284031215613bd457600080fd5b613bde60806157ef565b9050600082013567ffffffffffffffff811115613bfa57600080fd5b613c0684828501613b98565b600083015250602082013567ffffffffffffffff811115613c2657600080fd5b613c3284828501613b98565b602083015250604082013567ffffffffffffffff811115613c5257600080fd5b613c5e84828501613b98565b6040830152506060613c7284828501613c7e565b60608301525092915050565b600081359050613c8d81615e52565b92915050565b600060208284031215613ca557600080fd5b6000613cb384828501613af0565b91505092915050565b60008060408385031215613ccf57600080fd5b6000613cdd85828601613af0565b9250506020613cee85828601613af0565b9150509250929050565b600080600060608486031215613d0d57600080fd5b6000613d1b86828701613af0565b9350506020613d2c86828701613af0565b9250506040613d3d86828701613c7e565b9150509250925092565b60008060008060808587031215613d5d57600080fd5b6000613d6b87828801613af0565b9450506020613d7c87828801613af0565b9350506040613d8d87828801613c7e565b925050606085013567ffffffffffffffff811115613daa57600080fd5b613db687828801613b6e565b91505092959194509250565b60008060408385031215613dd557600080fd5b6000613de385828601613af0565b9250506020613df485828601613b2f565b9150509250929050565b60008060408385031215613e1157600080fd5b6000613e1f85828601613af0565b9250506020613e3085828601613c7e565b9150509250929050565b600060208284031215613e4c57600080fd5b6000613e5a84828501613b44565b91505092915050565b600060208284031215613e7557600080fd5b6000613e8384828501613b59565b91505092915050565b600060208284031215613e9e57600080fd5b600082013567ffffffffffffffff811115613eb857600080fd5b613ec484828501613b98565b91505092915050565b600060208284031215613edf57600080fd5b6000613eed84828501613c7e565b91505092915050565b60008060408385031215613f0957600080fd5b6000613f1785828601613c7e565b925050602083013567ffffffffffffffff811115613f3457600080fd5b613f4085828601613b05565b9150509250929050565b60008060408385031215613f5d57600080fd5b6000613f6b85828601613c7e565b9250506020613f7c85828601613c7e565b9150509250929050565b613f8f81615b33565b82525050565b613fa6613fa182615b33565b615cd4565b82525050565b613fb581615b45565b82525050565b6000613fc6826158c1565b613fd081856158d7565b9350613fe0818560208601615bd1565b613fe981615def565b840191505092915050565b6000613fff826158cc565b61400981856158e8565b9350614019818560208601615bd1565b61402281615def565b840191505092915050565b6000614038826158cc565b61404281856158f9565b9350614052818560208601615bd1565b80840191505092915050565b6000815461406b81615c04565b61407581866158f9565b9450600182166000811461409057600181146140a1576140d4565b60ff198316865281860193506140d4565b6140aa856158ac565b60005b838110156140cc578154818901526001820191506020810190506140ad565b838801955050505b50505092915050565b60006140ea6005836158f9565b91507f2720793d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061412a602b836158e8565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006141906032836158e8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141f66068836158f9565b91507f3c7376672069643d22632220786d6c6e733d22687474703a2f2f7777772e773360008301527f2e6f72672f323030302f7376672220707265736572766541737065637452617460208301527f696f3d22784d696e594d696e206d656574222076696577426f783d223020302060408301527f3234203234223e200000000000000000000000000000000000000000000000006060830152606882019050919050565b60006142a86026836158e8565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061430e601c836158e8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061434e6005836158f9565b91507f2720783d270000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061438e600f836158f9565b91507f222c2261747472696275746573223a00000000000000000000000000000000006000830152600f82019050919050565b60006143ce6001836158f9565b91507f2c000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b600061440e600e836158f9565b91507f3c7265637420636c6173733d27630000000000000000000000000000000000006000830152600e82019050919050565b600061444e6024836158e8565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144b46019836158e8565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144f4600f836158f9565b91507f7b2274726169745f74797065223a2200000000000000000000000000000000006000830152600f82019050919050565b6000614534602c836158e8565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061459a6003836158f9565b91507f272f3e00000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b60006145da6038836158e8565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614640602a836158e8565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a66029836158e8565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061470d6103f8836158f9565b91507f3c7374796c653e726563747b77696474683a3170783b6865696768743a31707860008301527f3b7d23637b73686170652d72656e646572696e673a206372697370656467657360208301527f3b7d2e6330307b66696c6c3a236636373637627d2e6330317b66696c6c3a236660408301527f66666666667d2e6330327b66696c6c3a233030303030307d2e6330337b66696c60608301527f6c3a236331303038627d2e6330347b66696c6c3a236463303039657d2e63303560808301527f7b66696c6c3a236566303061397d2e6330367b66696c6c3a236666303034337d60a08301527f2e6330377b66696c6c3a236337343234397d2e6330387b66696c6c3a2361613360c08301527f3433617d2e6330397b66696c6c3a233336333733377d2e6331307b66696c6c3a60e08301527f233163316331637d2e6331317b66696c6c3a233263326332637d2e6331327b666101008301527f696c6c3a233661396363357d2e6331337b66696c6c3a233966643266637d2e636101208301527f31347b66696c6c3a236364363130307d2e6331357b66696c6c3a2332663266326101408301527f667d2e6331367b66696c6c3a236664373530307d2e6331377b66696c6c3a23666101608301527f36386432667d2e6331387b66696c6c3a233437343734377d2e6331397b66696c6101808301527f6c3a233538353835387d2e6332307b66696c6c3a233234323432347d2e6332316101a08301527f7b66696c6c3a233963376436617d2e6332327b66696c6c3a233365336533657d6101c08301527f2e6332337b66696c6c3a233230323032307d2e6332347b66696c6c3a236230356101e08301527f3531347d2e6332357b66696c6c3a233733336533397d2e6332367b66696c6c3a6102008301527f236632643030307d2e6332377b66696c6c3a236633646430307d2e6332387b666102208301527f696c6c3a236363636363647d2e6332397b66696c6c3a236461643464327d2e636102408301527f33307b66696c6c3a236563653365307d2e6333317b66696c6c3a2330306164636102608301527f307d2e6333327b66696c6c3a233030623863637d2e6333337b66696c6c3a23306102808301527f30633464627d2e6333347b66696c6c3a233463336232667d2e6333357b66696c6102a08301527f6c3a233639353033387d2e6333367b66696c6c3a236235383135327d2e6333376102c08301527f7b66696c6c3a233030386339627d2e6333387b66696c6c3a236335633564627d6102e08301527f2e6333397b66696c6c3a233030643666667d2e6334307b66696c6c3a236466336103008301527f3435337d2e6334317b66696c6c3a236434623530307d2e6334327b66696c6c3a6103208301527f233532333734377d2e6334337b66696c6c3a233366343034337d2e6334347b666103408301527f696c6c3a233566356535637d2e6334357b66696c6c3a236336396539347d2e636103608301527f34367b66696c6c3a236131393538637d2e6334377b66696c6c3a2339383138376103808301527f307d2e6334387b66696c6c3a236362626130307d2e6334397b66696c6c3a23646103a08301527f66636330307d2e6335307b66696c6c3a233133613732657d2e6335317b66696c6103c08301527f6c3a233063386132347d3c2f7374796c653e3c2f7376673e00000000000000006103e08301526103f882019050919050565b6000614c006002836158f9565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000614c406020836158e8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614c806001836158f9565b91507f7d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614cc0602c836158e8565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614d266020836158e8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614d666001836158f9565b91507f5b000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614da66029836158e8565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e0c600b836158f9565b91507f222c2276616c7565223a220000000000000000000000000000000000000000006000830152600b82019050919050565b6000614e4c6001836158f9565b91507f5d000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b6000614e8c6021836158e8565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ef2601d836158f9565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614f326014836158f9565b91507f7b226e616d65223a20226f63446f67676f7320230000000000000000000000006000830152601482019050919050565b6000614f726031836158e8565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614fd86001836158f9565b91507f31000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006150186001836158e8565b91507f74000000000000000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000615058602c836158e8565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006150be60c5836158f9565b91507f222c20226465736372697074696f6e223a20224f6e2d436861696e20446f676760008301527f6f73206973206120636f6c6c656374696f6e206f6620342c30303020756e697160208301527f75656c792067656e65726174656420446f67676f732e20416c6c20746865206d60408301527f6574616461746120616e6420696d616765732061726520313030252073746f7260608301527f6564206f6e2074686520457468657265756d20626c6f636b636861696e2e222c60808301527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160a08301527f736536342c00000000000000000000000000000000000000000000000000000060c083015260c582019050919050565b6151de81615bab565b82525050565b6151f56151f082615bab565b615cf8565b82525050565b6000615207828461402d565b915081905092915050565b600061521e828561402d565b915061522a828461402d565b91508190509392505050565b6000615242828461402d565b915061524d826143c1565b915081905092915050565b6000615264828761402d565b915061526f82614401565b915061527b828661402d565b915061528682614341565b9150615292828561402d565b915061529d826140dd565b91506152a9828461402d565b91506152b48261458d565b915081905095945050505050565b60006152ce828661402d565b91506152d9826144e7565b91506152e5828561405e565b91506152f082614dff565b91506152fc828461405e565b915061530782614bf3565b9150819050949350505050565b6000615320828461405e565b915081905092915050565b6000615336826141e9565b9150615342828461402d565b915061534d826146ff565b915081905092915050565b600061536382614d59565b915061536f828461402d565b915061537a82614e3f565b915081905092915050565b600061539082614ee5565b915061539c828461402d565b915081905092915050565b60006153b282614f25565b91506153be828661402d565b91506153c9826150b1565b91506153d5828561402d565b91506153e082614381565b91506153ec828461402d565b91506153f782614c73565b9150819050949350505050565b600061540f82614fcb565b915061541b828461402d565b915081905092915050565b600061543282896151e4565b60208201915061544282886151e4565b60208201915061545282876151e4565b6020820191506154628286613f95565b60148201915061547282856151e4565b60208201915061548282846151e4565b602082019150819050979650505050505050565b60006020820190506154ab6000830184613f86565b92915050565b60006080820190506154c66000830187613f86565b6154d36020830186613f86565b6154e060408301856151d5565b81810360608301526154f28184613fbb565b905095945050505050565b60006020820190506155126000830184613fac565b92915050565b600060208201905081810360008301526155328184613ff4565b905092915050565b600060808201905081810360008301526155548187613ff4565b905081810360208301526155688186613ff4565b9050818103604083015261557c8185613ff4565b905061558b60608301846151d5565b95945050505050565b600060208201905081810360008301526155ad8161411d565b9050919050565b600060208201905081810360008301526155cd81614183565b9050919050565b600060208201905081810360008301526155ed8161429b565b9050919050565b6000602082019050818103600083015261560d81614301565b9050919050565b6000602082019050818103600083015261562d81614441565b9050919050565b6000602082019050818103600083015261564d816144a7565b9050919050565b6000602082019050818103600083015261566d81614527565b9050919050565b6000602082019050818103600083015261568d816145cd565b9050919050565b600060208201905081810360008301526156ad81614633565b9050919050565b600060208201905081810360008301526156cd81614699565b9050919050565b600060208201905081810360008301526156ed81614c33565b9050919050565b6000602082019050818103600083015261570d81614cb3565b9050919050565b6000602082019050818103600083015261572d81614d19565b9050919050565b6000602082019050818103600083015261574d81614d99565b9050919050565b6000602082019050818103600083015261576d81614e7f565b9050919050565b6000602082019050818103600083015261578d81614f65565b9050919050565b600060208201905081810360008301526157ad8161500b565b9050919050565b600060208201905081810360008301526157cd8161504b565b9050919050565b60006020820190506157e960008301846151d5565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561581657615815615dc0565b5b8060405250919050565b600067ffffffffffffffff82111561583b5761583a615dc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561586757615866615dc0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561589757615896615dc0565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061590f82615b7d565b915061591a83615b7d565b92508261ffff0382111561593157615930615d33565b5b828201905092915050565b600061594782615bab565b915061595283615bab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561598757615986615d33565b5b828201905092915050565b600061599d82615bb5565b91506159a883615bb5565b92508260ff038211156159be576159bd615d33565b5b828201905092915050565b60006159d482615bab565b91506159df83615bab565b9250826159ef576159ee615d62565b5b828204905092915050565b6000615a0582615b7d565b9150615a1083615b7d565b92508161ffff0483118215151615615a2b57615a2a615d33565b5b828202905092915050565b6000615a4182615bab565b9150615a4c83615bab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615a8557615a84615d33565b5b828202905092915050565b6000615a9b82615bb5565b9150615aa683615bb5565b92508160ff0483118215151615615ac057615abf615d33565b5b828202905092915050565b6000615ad682615bab565b9150615ae183615bab565b925082821015615af457615af3615d33565b5b828203905092915050565b6000615b0a82615bb5565b9150615b1583615bb5565b925082821015615b2857615b27615d33565b5b828203905092915050565b6000615b3e82615b8b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615bef578082015181840152602081019050615bd4565b83811115615bfe576000848401525b50505050565b60006002820490506001821680615c1c57607f821691505b60208210811415615c3057615c2f615d91565b5b50919050565b6000615c4182615b7d565b915061ffff821415615c5657615c55615d33565b5b600182019050919050565b6000615c6c82615bab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c9f57615c9e615d33565b5b600182019050919050565b6000615cb582615bb5565b915060ff821415615cc957615cc8615d33565b5b600182019050919050565b6000615cdf82615ce6565b9050919050565b6000615cf182615e00565b9050919050565b6000819050919050565b6000615d0d82615bab565b9150615d1883615bab565b925082615d2857615d27615d62565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615e1681615b33565b8114615e2157600080fd5b50565b615e2d81615b45565b8114615e3857600080fd5b50565b615e4481615b51565b8114615e4f57600080fd5b50565b615e5b81615bab565b8114615e6657600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220956b4c89e876bc95d6ec071020853d01512b3bb5da09c17c0b2025e1cdcb03bb64736f6c63430008000033

Deployed Bytecode Sourcemap

48963:15666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62395:554;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33789:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20911:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22470:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21993:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63856:141;;;;;;;;;;;;;:::i;:::-;;34429:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53905:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23360:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34097:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49286:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54184:145;;;;;;;;;;;;;:::i;:::-;;23770:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34619:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20605:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59832:903;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20335:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48139:103;;;;;;;;;;;;;:::i;:::-;;55622:4145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47488:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21080:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49209:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22763:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24026:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60890:1371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64152:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23129:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48397:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62395:554;62485:13;62516:23;62542:13;:23;62556:8;62542:23;;;;;;;;;;;62516:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62666:42;62645:63;;:17;62653:8;62645:7;:17::i;:::-;:63;;;62641:272;;;62827:40;62851:9;62862:1;62865;62827:23;:40::i;:::-;62762:124;;;;;;;;:::i;:::-;;;;;;;;;;;;;62725:176;;62641:272;62932:9;62925:16;;;62395:554;;;:::o;33789:224::-;33891:4;33930:35;33915:50;;;:11;:50;;;;:90;;;;33969:36;33993:11;33969:23;:36::i;:::-;33915:90;33908:97;;33789:224;;;:::o;20911:100::-;20965:13;20998:5;20991:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20911:100;:::o;22470:221::-;22546:7;22574:16;22582:7;22574;:16::i;:::-;22566:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22659:15;:24;22675:7;22659:24;;;;;;;;;;;;;;;;;;;;;22652:31;;22470:221;;;:::o;21993:411::-;22074:13;22090:23;22105:7;22090:14;:23::i;:::-;22074:39;;22138:5;22132:11;;:2;:11;;;;22124:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22232:5;22216:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22241:37;22258:5;22265:12;:10;:12::i;:::-;22241:16;:37::i;:::-;22216:62;22194:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22375:21;22384:2;22388:7;22375:8;:21::i;:::-;21993:411;;;:::o;63856:141::-;47719:12;:10;:12::i;:::-;47708:23;;:7;:5;:7::i;:::-;:23;;;47700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63913:9:::1;63908:81;63932:1;63928;:5;63908:81;;;63963:10;:13;63974:1;63963:13;;;;;;;;;;;;63956:20;;;;:::i;:::-;63935:3;;;;;:::i;:::-;;;;63908:81;;;;63856:141::o:0;34429:113::-;34490:7;34517:10;:17;;;;34510:24;;34429:113;:::o;53905:271::-;53985:1;53976:6;:10;:26;;;;;54000:2;53990:6;:12;;53976:26;53975:61;;;;;54030:5;;54021:6;:14;;;;:::i;:::-;54008:9;:27;53975:61;:93;;;;;54057:10;;54041:13;:11;:13::i;:::-;:26;53975:93;53967:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;54099:9;54095:74;54115:6;54112:1;:9;54095:74;;;54143:14;:12;:14::i;:::-;54123:3;;;;;:::i;:::-;;;;54095:74;;;;53905:271;:::o;23360:339::-;23555:41;23574:12;:10;:12::i;:::-;23588:7;23555:18;:41::i;:::-;23547:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23663:28;23673:4;23679:2;23683:7;23663:9;:28::i;:::-;23360:339;;;:::o;34097:256::-;34194:7;34230:23;34247:5;34230:16;:23::i;:::-;34222:5;:31;34214:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34319:12;:19;34332:5;34319:19;;;;;;;;;;;;;;;:26;34339:5;34319:26;;;;;;;;;;;;34312:33;;34097:256;;;;:::o;49286:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54184:145::-;47719:12;:10;:12::i;:::-;47708:23;;:7;:5;:7::i;:::-;:23;;;47700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54232:15:::1;54250:21;54232:39;;54292:10;54284:28;;:37;54313:7;54284:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47779:1;54184:145::o:0;23770:185::-;23908:39;23925:4;23931:2;23935:7;23908:39;;;;;;;;;;;;:16;:39::i;:::-;23770:185;;;:::o;34619:233::-;34694:7;34730:30;:28;:30::i;:::-;34722:5;:38;34714:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34827:10;34838:5;34827:17;;;;;;;;;;;;;;;;;;;;;;;;34820:24;;34619:233;;;:::o;20605:239::-;20677:7;20697:13;20713:7;:16;20721:7;20713:16;;;;;;;;;;;;;;;;;;;;;20697:32;;20765:1;20748:19;;:5;:19;;;;20740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20831:5;20824:12;;;20605:239;;;:::o;59832:903::-;59925:13;59956:28;60002:7;59997:661;60019:1;60015;:5;;;59997:661;;;60046:20;60069:96;60110:40;60134:5;60141:1;60110:40;;60148:1;60144;:5;;;;:::i;:::-;60110:40;;:23;:40::i;:::-;60069:22;:96::i;:::-;60046:119;;60263:14;60340:10;:13;60351:1;60340:13;;;;;;;;;;;;;60354:14;60340:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;60438:10;:13;60449:1;60438:13;;;;;;;;;;;;;60452:14;60438:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:39;;60224:299;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60182:356;;60564:1;60559;:6;;;60555:91;;60625:14;60608:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;60584:62;;60555:91;59997:661;60022:3;;;;;:::i;:::-;;;;59997:661;;;;60706:14;60684:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;60670:57;;;59832:903;;;:::o;20335:208::-;20407:7;20452:1;20435:19;;:5;:19;;;;20427:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20519:9;:16;20529:5;20519:16;;;;;;;;;;;;;;;;20512:23;;20335:208;;;:::o;48139:103::-;47719:12;:10;:12::i;:::-;47708:23;;:7;:5;:7::i;:::-;:23;;;47700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48204:30:::1;48231:1;48204:18;:30::i;:::-;48139:103::o:0;55622:4145::-;55710:13;55741:23;55775:32;;:::i;:::-;55825:7;55820:1351;55842:1;55838;:5;;;55820:1351;;;55866:20;55889:96;55930:40;55954:5;55961:1;55930:40;;55968:1;55964;:5;;;;:::i;:::-;55930:40;;:23;:40::i;:::-;55889:22;:96::i;:::-;55866:119;;56025:8;56002:1158;56060:10;:13;56071:1;56060:13;;;;;;;;;;;;;56074:14;56060:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;56056:1;:44;;;56002:1158;;;56162:23;56188:161;56234:10;:13;56245:1;56234:13;;;;;;;;;;;;;56248:14;56234:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;56188:161;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56297:1;56293;:5;;;;:::i;:::-;56188:161;;56329:1;56325;56321;:5;;;;:::i;:::-;:9;;;;:::i;:::-;56188:161;;:23;:161::i;:::-;56162:187;;56370:7;56380:96;56417:40;56441:9;56452:1;56455;56417:23;:40::i;:::-;56380:14;:96::i;:::-;56370:106;;56495:7;56505:96;56542:40;56566:9;56577:1;56580;56542:23;:40::i;:::-;56505:14;:96::i;:::-;56495:106;;56626:12;56639:1;56626:15;;;;;;;;;;;;;;;;;;;;;56642:1;56626:18;;;;;;;;;;;;;;;;;;;;;56622:32;;;56646:8;;;;;56622:32;56759:9;56838:40;56862:9;56873:1;56876;56838:23;:40::i;:::-;56939:12;:1;:10;;;:12::i;:::-;57012;:1;:10;;;:12::i;:::-;56716:363;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56675:423;;57140:4;57119:12;57132:1;57119:15;;;;;;;;;;;;;;;;;;;;;57135:1;57119:18;;;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;56002:1158;;;;56124:3;;;;;:::i;:::-;;;;56002:1158;;;;55820:1351;55845:3;;;;;:::i;:::-;;;;55820:1351;;;;57376:9;57216:2503;;;;;;;;:::i;:::-;;;;;;;;;;;;;57183:2547;;59750:9;59743:16;;;;55622:4145;;;:::o;47488:87::-;47534:7;47561:6;;;;;;;;;;;47554:13;;47488:87;:::o;21080:104::-;21136:13;21169:7;21162:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21080:104;:::o;49209:40::-;;;;:::o;22763:295::-;22878:12;:10;:12::i;:::-;22866:24;;:8;:24;;;;22858:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22978:8;22933:18;:32;22952:12;:10;:12::i;:::-;22933:32;;;;;;;;;;;;;;;:42;22966:8;22933:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23031:8;23002:48;;23017:12;:10;:12::i;:::-;23002:48;;;23041:8;23002:48;;;;;;:::i;:::-;;;;;;;;22763:295;;:::o;24026:328::-;24201:41;24220:12;:10;:12::i;:::-;24234:7;24201:18;:41::i;:::-;24193:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24307:39;24321:4;24327:2;24331:7;24340:5;24307:13;:39::i;:::-;24026:328;;;;:::o;60890:1371::-;60992:13;61031:17;61039:8;61031:7;:17::i;:::-;61023:26;;;;;;61062:23;61088:24;61103:8;61088:14;:24::i;:::-;61062:50;;61263:956;61503:32;61526:8;61503:22;:32::i;:::-;61812:129;61881:20;61891:9;61881;:20::i;:::-;61812;:129::i;:::-;62036:25;62051:9;62036:14;:25::i;:::-;61387:751;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61263:20;:956::i;:::-;61170:1068;;;;;;;;:::i;:::-;;;;;;;;;;;;;61125:1128;;;60890:1371;;;:::o;64152:474::-;47719:12;:10;:12::i;:::-;47708:23;;:7;:5;:7::i;:::-;:23;;;47700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64278:9:::1;64273:327;64297:6;:13;64293:1;:17;64273:327;;;64332:10;:27;64343:15;64332:27;;;;;;;;;;;64383:190;;;;;;;;64411:6;64418:1;64411:9;;;;;;;;;;;;;;;;;;;;;;:19;;;64383:190;;;;64453:6;64460:1;64453:9;;;;;;;;;;;;;;;;;;;;;;:19;;;64383:190;;;;64495:6;64502:1;64495:9;;;;;;;;;;;;;;;;;;;;;;:16;;;64383:190;;;;64534:6;64541:1;64534:9;;;;;;;;;;;;;;;;;;;;;;:20;;;64383:190;;::::0;64332:256:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;64312:3;;;;;:::i;:::-;;;;64273:327;;;;64152:474:::0;;:::o;23129:164::-;23226:4;23250:18;:25;23269:5;23250:25;;;;;;;;;;;;;;;:35;23276:8;23250:35;;;;;;;;;;;;;;;;;;;;;;;;;23243:42;;23129:164;;;;:::o;48397:201::-;47719:12;:10;:12::i;:::-;47708:23;;:7;:5;:7::i;:::-;:23;;;47700:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48506:1:::1;48486:22;;:8;:22;;;;48478:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48562:28;48581:8;48562:18;:28::i;:::-;48397:201:::0;:::o;46255:419::-;46388:13;46414:21;46444:3;46414:34;;46459:19;46502:10;46491:8;:21;;;;:::i;:::-;46481:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46459:54;;46529:9;46541:10;46529:22;;46524:111;46557:8;46553:1;:12;46524:111;;;46612:8;46621:1;46612:11;;;;;;;;;;;;;;;;;;;;;;;;46587:6;46598:10;46594:1;:14;;;;:::i;:::-;46587:22;;;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;46567:3;;;;;:::i;:::-;;;;46524:111;;;;46659:6;46645:21;;;;46255:419;;;;;:::o;19966:305::-;20068:4;20120:25;20105:40;;;:11;:40;;;;:105;;;;20177:33;20162:48;;;:11;:48;;;;20105:105;:158;;;;20227:36;20251:11;20227:23;:36::i;:::-;20105:158;20085:178;;19966:305;;;:::o;25864:127::-;25929:4;25981:1;25953:30;;:7;:16;25961:7;25953:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25946:37;;25864:127;;;:::o;15663:98::-;15716:7;15743:10;15736:17;;15663:98;:::o;29846:174::-;29948:2;29921:15;:24;29937:7;29921:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30004:7;30000:2;29966:46;;29975:23;29990:7;29975:14;:23::i;:::-;29966:46;;;;;;;;;;;;29846:174;;:::o;53428:414::-;53472:20;53495:13;:11;:13::i;:::-;53472:36;;53542:10;;53527:12;:25;53519:34;;;;;;53573:36;53598:10;53573:24;:36::i;:::-;53572:37;53564:46;;;;;;53623:19;53645:12;53623:34;;53699:32;53704:11;53717:10;53729:1;53699:4;:32::i;:::-;53670:13;:26;53684:11;53670:26;;;;;;;;;;;:61;;;;;;;;;;;;:::i;:::-;;53787:4;53744:12;53757:13;:26;53771:11;53757:26;;;;;;;;;;;53744:40;;;;;;:::i;:::-;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;53804:30;53810:10;53822:11;53804:5;:30::i;:::-;53428:414;;:::o;26158:348::-;26251:4;26276:16;26284:7;26276;:16::i;:::-;26268:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26352:13;26368:23;26383:7;26368:14;:23::i;:::-;26352:39;;26421:5;26410:16;;:7;:16;;;:51;;;;26454:7;26430:31;;:20;26442:7;26430:11;:20::i;:::-;:31;;;26410:51;:87;;;;26465:32;26482:5;26489:7;26465:16;:32::i;:::-;26410:87;26402:96;;;26158:348;;;;:::o;29150:578::-;29309:4;29282:31;;:23;29297:7;29282:14;:23::i;:::-;:31;;;29274:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29392:1;29378:16;;:2;:16;;;;29370:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29448:39;29469:4;29475:2;29479:7;29448:20;:39::i;:::-;29552:29;29569:1;29573:7;29552:8;:29::i;:::-;29613:1;29594:9;:15;29604:4;29594:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29642:1;29625:9;:13;29635:2;29625:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29673:2;29654:7;:16;29662:7;29654:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29712:7;29708:2;29693:27;;29702:4;29693:27;;;;;;;;;;;;29150:578;;;:::o;45744:503::-;45830:16;45864:20;45893:2;45864:32;;45907:10;45937:7;45932:286;45954:7;:14;45950:1;:18;;;45932:286;;;46041:2;46025:7;46033:1;46025:10;;;;;;;;;;;;;;;;;;;;;;;;;;46019:17;;46013:30;;;;46012:85;;;;;46094:2;46078:7;46086:1;46078:10;;;;;;;;;;;;;;;;;;;;;;;;;;46072:17;;46066:30;;;;46012:85;45990:217;;;46140:2;46132:10;;;;;:::i;:::-;;;46189:2;46175:7;46183:1;46175:10;;;;;;;;;;;;;;;;;;;;;;;;;;46169:17;;:22;;;;:::i;:::-;46161:30;;;;;:::i;:::-;;;45990:217;45970:3;;;;;:::i;:::-;;;;45932:286;;;;46235:4;46228:11;;;;45744:503;;;:::o;48758:191::-;48832:16;48851:6;;;;;;;;;;;48832:25;;48877:8;48868:6;;:17;;;;;;;;;;;;;;;;;;48932:8;48901:40;;48922:8;48901:40;;;;;;;;;;;;48758:191;;:::o;55184:378::-;55286:5;55314:7;55324:1;55314:11;;55309:227;55331:7;:14;;;;55327:1;:18;;;55309:227;;;55479:12;55461:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;55451:43;;;;;;55417:7;55425:1;55417:10;;;;;;;;;;;;;;;;;;;;;;;;;55399:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;55389:41;;;;;;:105;55367:157;;;55522:1;55518;:5;;;;:::i;:::-;55510:14;;;;;55367:157;55347:3;;;;;:::i;:::-;;;;55309:227;;;;55546:8;;;55184:378;;;;:::o;45204:532::-;45260:13;45299:1;45290:5;:10;45286:53;;;45317:10;;;;;;;;;;;;;;;;;;;;;45286:53;45349:12;45364:5;45349:20;;45380:14;45405:78;45420:1;45412:4;:9;45405:78;;45438:8;;;;;:::i;:::-;;;;45469:2;45461:10;;;;;:::i;:::-;;;45405:78;;;45493:19;45525:6;45515:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45493:39;;45543:154;45559:1;45550:5;:10;45543:154;;45587:1;45577:11;;;;;:::i;:::-;;;45654:2;45646:5;:10;;;;:::i;:::-;45633:2;:24;;;;:::i;:::-;45620:39;;45603:6;45610;45603:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;45683:2;45674:11;;;;;:::i;:::-;;;45543:154;;;45721:6;45707:21;;;;;45204:532;;;;:::o;25236:315::-;25393:28;25403:4;25409:2;25413:7;25393:9;:28::i;:::-;25440:48;25463:4;25469:2;25473:7;25482:5;25440:22;:48::i;:::-;25432:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25236:315;;;;:::o;42842:2256::-;42900:13;42945:1;42930:4;:11;:16;42926:31;;;42948:9;;;;;;;;;;;;;;;;42926:31;43009:19;43031:5;;;;;;;;;;;;;;;;;43009:27;;43088:18;43134:1;43129;43115:4;:11;:15;;;;:::i;:::-;43114:21;;;;:::i;:::-;43109:1;:27;;;;:::i;:::-;43088:48;;43219:20;43266:2;43253:10;:15;;;;:::i;:::-;43242:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43219:50;;43366:10;43358:6;43351:26;43461:1;43454:5;43450:13;43520:4;43571;43565:11;43556:7;43552:25;43667:2;43659:6;43655:15;43740:1045;43775:6;43766:7;43763:19;43740:1045;;;43845:1;43836:7;43832:15;43821:26;;43919:7;43913:14;44096:4;44088:5;44084:2;44080:14;44076:25;44066:8;44062:40;44056:47;44051:3;44047:57;44015:9;43986:137;44169:1;44158:9;44154:17;44141:30;;44299:4;44291:5;44287:2;44283:14;44279:25;44269:8;44265:40;44259:47;44254:3;44250:57;44218:9;44189:137;44372:1;44361:9;44357:17;44344:30;;44501:4;44493:5;44490:1;44486:13;44482:24;44472:8;44468:39;44462:46;44457:3;44453:56;44421:9;44392:136;44574:1;44563:9;44559:17;44546:30;;44695:4;44688:5;44684:16;44674:8;44670:31;44664:38;44659:3;44655:48;44623:9;44594:128;44768:1;44757:9;44753:17;44740:30;;43802:983;43740:1045;;;44858:1;44851:4;44845:11;44841:19;44879:1;44874:84;;;;44977:1;44972:82;;;;44834:220;;44874:84;44935:6;44930:3;44926:16;44922:1;44911:9;44907:17;44900:43;44874:84;;44972:82;45033:4;45028:3;45024:14;45020:1;45009:9;45005:17;44998:41;44834:220;;43291:1774;;;;45084:6;45077:13;;;;;42842:2256;;;;:::o;18570:157::-;18655:4;18694:25;18679:40;;;:11;:40;;;;18672:47;;18570:157;;;:::o;46682:387::-;46742:4;46950:12;47017:7;47005:20;46997:28;;47060:1;47053:4;:8;47046:15;;;46682:387;;;:::o;52220:1117::-;52322:13;52361:2;52356;:7;52348:16;;;;;;52522:25;:31;;;;;;;;;;;;;;;;;;;52571:7;52566:662;52588:1;52584;:5;;;52566:662;;;52611:10;;:12;;;;;;;;;:::i;:::-;;;;;;52638:17;53070:5;52796:15;52842:16;52889:2;52922;52955;52988:10;;52749:276;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52713:335;;;;;;52683:384;;:392;;;;:::i;:::-;52638:452;;53163:11;53176:24;53186:10;53176:24;;53198:1;53176:9;:24::i;:::-;53146:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53107:109;;52566:662;52591:3;;;;;:::i;:::-;;;;52566:662;;;;53244:12;53257:11;53244:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;53240:58;;;53278:20;53283:2;53287;53296:1;53291:2;:6;;;;:::i;:::-;53278:4;:20::i;:::-;53271:27;;;;;53240:58;53318:11;53311:18;;;52220:1117;;;;;;:::o;27842:382::-;27936:1;27922:16;;:2;:16;;;;27914:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27995:16;28003:7;27995;:16::i;:::-;27994:17;27986:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28057:45;28086:1;28090:2;28094:7;28057:20;:45::i;:::-;28132:1;28115:9;:13;28125:2;28115:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28163:2;28144:7;:16;28152:7;28144:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28208:7;28204:2;28183:33;;28200:1;28183:33;;;;;;;;;;;;27842:382;;:::o;35465:589::-;35609:45;35636:4;35642:2;35646:7;35609:26;:45::i;:::-;35687:1;35671:18;;:4;:18;;;35667:187;;;35706:40;35738:7;35706:31;:40::i;:::-;35667:187;;;35776:2;35768:10;;:4;:10;;;35764:90;;35795:47;35828:4;35834:7;35795:32;:47::i;:::-;35764:90;35667:187;35882:1;35868:16;;:2;:16;;;35864:183;;;35901:45;35938:7;35901:36;:45::i;:::-;35864:183;;;35974:4;35968:10;;:2;:10;;;35964:83;;35995:40;36023:2;36027:7;35995:27;:40::i;:::-;35964:83;35864:183;35465:589;;;:::o;30585:799::-;30740:4;30761:15;:2;:13;;;:15::i;:::-;30757:620;;;30813:2;30797:36;;;30834:12;:10;:12::i;:::-;30848:4;30854:7;30863:5;30797:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30793:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31056:1;31039:6;:13;:18;31035:272;;;31082:60;;;;;;;;;;:::i;:::-;;;;;;;;31035:272;31257:6;31251:13;31242:6;31238:2;31234:15;31227:38;30793:529;30930:41;;;30920:51;;;:6;:51;;;;30913:58;;;;;30757:620;31361:4;31354:11;;30585:799;;;;;;;:::o;51360:572::-;51468:13;51499:24;51543:7;51538:366;51560:5;51566:11;51560:18;;;;;;;;;;;;;;;;;;:25;;;;51556:1;:29;;;51538:366;;;51607:21;51631:5;51637:11;51631:18;;;;;;;;;;;;;;;;;;51650:1;51631:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51607:45;;51703:17;51689:31;;:10;:31;;:99;;;;;51774:14;51754:17;:34;;;;:::i;:::-;51741:47;;:10;:47;51689:99;51667:156;;;51811:12;:1;:10;;;:12::i;:::-;51804:19;;;;;;;51667:156;51878:14;51858:17;:34;;;;:::i;:::-;51838:54;;51538:366;51587:3;;;;;:::i;:::-;;;;51538:366;;;;51916:8;;;51360:572;;;;;:::o;31956:126::-;;;;:::o;36777:164::-;36881:10;:17;;;;36854:15;:24;36870:7;36854:24;;;;;;;;;;;:44;;;;36909:10;36925:7;36909:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36777:164;:::o;37568:988::-;37834:22;37884:1;37859:22;37876:4;37859:16;:22::i;:::-;:26;;;;:::i;:::-;37834:51;;37896:18;37917:17;:26;37935:7;37917:26;;;;;;;;;;;;37896:47;;38064:14;38050:10;:28;38046:328;;38095:19;38117:12;:18;38130:4;38117:18;;;;;;;;;;;;;;;:34;38136:14;38117:34;;;;;;;;;;;;38095:56;;38201:11;38168:12;:18;38181:4;38168:18;;;;;;;;;;;;;;;:30;38187:10;38168:30;;;;;;;;;;;:44;;;;38318:10;38285:17;:30;38303:11;38285:30;;;;;;;;;;;:43;;;;38046:328;;38470:17;:26;38488:7;38470:26;;;;;;;;;;;38463:33;;;38514:12;:18;38527:4;38514:18;;;;;;;;;;;;;;;:34;38533:14;38514:34;;;;;;;;;;;38507:41;;;37568:988;;;;:::o;38851:1079::-;39104:22;39149:1;39129:10;:17;;;;:21;;;;:::i;:::-;39104:46;;39161:18;39182:15;:24;39198:7;39182:24;;;;;;;;;;;;39161:45;;39533:19;39555:10;39566:14;39555:26;;;;;;;;;;;;;;;;;;;;;;;;39533:48;;39619:11;39594:10;39605;39594:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39730:10;39699:15;:28;39715:11;39699:28;;;;;;;;;;;:41;;;;39871:15;:24;39887:7;39871:24;;;;;;;;;;;39864:31;;;39906:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38851:1079;;;;:::o;36355:221::-;36440:14;36457:20;36474:2;36457:16;:20::i;:::-;36440:37;;36515:7;36488:12;:16;36501:2;36488:16;;;;;;;;;;;;;;;:24;36505:6;36488:24;;;;;;;;;;;:34;;;;36562:6;36533:17;:26;36551:7;36533:26;;;;;;;;;;;:35;;;;36355:221;;;:::o;7787:387::-;7847:4;8055:12;8122:7;8110:20;8102:28;;8165:1;8158:4;:8;8151:15;;;7787:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;36:654:1:-;;180:103;195:87;275:6;195:87;:::i;:::-;180:103;:::i;:::-;171:112;;303:5;331:6;324:5;317:21;357:4;350:5;346:16;339:23;;382:6;413:1;398:286;423:6;420:1;417:13;398:286;;;515:3;502:17;494:6;490:30;545:60;601:3;589:10;545:60;:::i;:::-;540:3;533:73;635:4;630:3;626:14;619:21;;669:4;664:3;660:14;653:21;;458:226;445:1;442;438:9;433:14;;398:286;;;402:14;161:529;;;;;;;:::o;696:342::-;;798:64;813:48;854:6;813:48;:::i;:::-;798:64;:::i;:::-;789:73;;885:6;878:5;871:21;923:4;916:5;912:16;961:3;952:6;947:3;943:16;940:25;937:2;;;978:1;975;968:12;937:2;991:41;1025:6;1020:3;1015;991:41;:::i;:::-;779:259;;;;;;:::o;1044:344::-;;1147:65;1162:49;1204:6;1162:49;:::i;:::-;1147:65;:::i;:::-;1138:74;;1235:6;1228:5;1221:21;1273:4;1266:5;1262:16;1311:3;1302:6;1297:3;1293:16;1290:25;1287:2;;;1328:1;1325;1318:12;1287:2;1341:41;1375:6;1370:3;1365;1341:41;:::i;:::-;1128:260;;;;;;:::o;1394:139::-;;1478:6;1465:20;1456:29;;1494:33;1521:5;1494:33;:::i;:::-;1446:87;;;;:::o;1568:349::-;;1711:3;1704:4;1696:6;1692:17;1688:27;1678:2;;1729:1;1726;1719:12;1678:2;1769:6;1756:20;1794:117;1907:3;1899:6;1892:4;1884:6;1880:17;1794:117;:::i;:::-;1785:126;;1668:249;;;;;:::o;1923:133::-;;2004:6;1991:20;1982:29;;2020:30;2044:5;2020:30;:::i;:::-;1972:84;;;;:::o;2062:137::-;;2145:6;2132:20;2123:29;;2161:32;2187:5;2161:32;:::i;:::-;2113:86;;;;:::o;2205:141::-;;2292:6;2286:13;2277:22;;2308:32;2334:5;2308:32;:::i;:::-;2267:79;;;;:::o;2365:271::-;;2469:3;2462:4;2454:6;2450:17;2446:27;2436:2;;2487:1;2484;2477:12;2436:2;2527:6;2514:20;2552:78;2626:3;2618:6;2611:4;2603:6;2599:17;2552:78;:::i;:::-;2543:87;;2426:210;;;;;:::o;2656:273::-;;2761:3;2754:4;2746:6;2742:17;2738:27;2728:2;;2779:1;2776;2769:12;2728:2;2819:6;2806:20;2844:79;2919:3;2911:6;2904:4;2896:6;2892:17;2844:79;:::i;:::-;2835:88;;2718:211;;;;;:::o;2962:1153::-;;3078:4;3066:9;3061:3;3057:19;3053:30;3050:2;;;3096:1;3093;3086:12;3050:2;3118:20;3133:4;3118:20;:::i;:::-;3109:29;;3230:1;3219:9;3215:17;3202:31;3260:18;3252:6;3249:30;3246:2;;;3292:1;3289;3282:12;3246:2;3335:59;3390:3;3381:6;3370:9;3366:22;3335:59;:::i;:::-;3328:4;3321:5;3317:16;3310:85;3148:258;3498:2;3487:9;3483:18;3470:32;3529:18;3521:6;3518:30;3515:2;;;3561:1;3558;3551:12;3515:2;3604:59;3659:3;3650:6;3639:9;3635:22;3604:59;:::i;:::-;3597:4;3590:5;3586:16;3579:85;3416:259;3764:2;3753:9;3749:18;3736:32;3795:18;3787:6;3784:30;3781:2;;;3827:1;3824;3817:12;3781:2;3870:59;3925:3;3916:6;3905:9;3901:22;3870:59;:::i;:::-;3863:4;3856:5;3852:16;3845:85;3685:256;4006:2;4047:49;4092:3;4083:6;4072:9;4068:22;4047:49;:::i;:::-;4040:4;4033:5;4029:16;4022:75;3951:157;3040:1075;;;;:::o;4121:139::-;;4205:6;4192:20;4183:29;;4221:33;4248:5;4221:33;:::i;:::-;4173:87;;;;:::o;4266:262::-;;4374:2;4362:9;4353:7;4349:23;4345:32;4342:2;;;4390:1;4387;4380:12;4342:2;4433:1;4458:53;4503:7;4494:6;4483:9;4479:22;4458:53;:::i;:::-;4448:63;;4404:117;4332:196;;;;:::o;4534:407::-;;;4659:2;4647:9;4638:7;4634:23;4630:32;4627:2;;;4675:1;4672;4665:12;4627:2;4718:1;4743:53;4788:7;4779:6;4768:9;4764:22;4743:53;:::i;:::-;4733:63;;4689:117;4845:2;4871:53;4916:7;4907:6;4896:9;4892:22;4871:53;:::i;:::-;4861:63;;4816:118;4617:324;;;;;:::o;4947:552::-;;;;5089:2;5077:9;5068:7;5064:23;5060:32;5057:2;;;5105:1;5102;5095:12;5057:2;5148:1;5173:53;5218:7;5209:6;5198:9;5194:22;5173:53;:::i;:::-;5163:63;;5119:117;5275:2;5301:53;5346:7;5337:6;5326:9;5322:22;5301:53;:::i;:::-;5291:63;;5246:118;5403:2;5429:53;5474:7;5465:6;5454:9;5450:22;5429:53;:::i;:::-;5419:63;;5374:118;5047:452;;;;;:::o;5505:809::-;;;;;5673:3;5661:9;5652:7;5648:23;5644:33;5641:2;;;5690:1;5687;5680:12;5641:2;5733:1;5758:53;5803:7;5794:6;5783:9;5779:22;5758:53;:::i;:::-;5748:63;;5704:117;5860:2;5886:53;5931:7;5922:6;5911:9;5907:22;5886:53;:::i;:::-;5876:63;;5831:118;5988:2;6014:53;6059:7;6050:6;6039:9;6035:22;6014:53;:::i;:::-;6004:63;;5959:118;6144:2;6133:9;6129:18;6116:32;6175:18;6167:6;6164:30;6161:2;;;6207:1;6204;6197:12;6161:2;6235:62;6289:7;6280:6;6269:9;6265:22;6235:62;:::i;:::-;6225:72;;6087:220;5631:683;;;;;;;:::o;6320:401::-;;;6442:2;6430:9;6421:7;6417:23;6413:32;6410:2;;;6458:1;6455;6448:12;6410:2;6501:1;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6472:117;6628:2;6654:50;6696:7;6687:6;6676:9;6672:22;6654:50;:::i;:::-;6644:60;;6599:115;6400:321;;;;;:::o;6727:407::-;;;6852:2;6840:9;6831:7;6827:23;6823:32;6820:2;;;6868:1;6865;6858:12;6820:2;6911:1;6936:53;6981:7;6972:6;6961:9;6957:22;6936:53;:::i;:::-;6926:63;;6882:117;7038:2;7064:53;7109:7;7100:6;7089:9;7085:22;7064:53;:::i;:::-;7054:63;;7009:118;6810:324;;;;;:::o;7140:260::-;;7247:2;7235:9;7226:7;7222:23;7218:32;7215:2;;;7263:1;7260;7253:12;7215:2;7306:1;7331:52;7375:7;7366:6;7355:9;7351:22;7331:52;:::i;:::-;7321:62;;7277:116;7205:195;;;;:::o;7406:282::-;;7524:2;7512:9;7503:7;7499:23;7495:32;7492:2;;;7540:1;7537;7530:12;7492:2;7583:1;7608:63;7663:7;7654:6;7643:9;7639:22;7608:63;:::i;:::-;7598:73;;7554:127;7482:206;;;;:::o;7694:375::-;;7812:2;7800:9;7791:7;7787:23;7783:32;7780:2;;;7828:1;7825;7818:12;7780:2;7899:1;7888:9;7884:17;7871:31;7929:18;7921:6;7918:30;7915:2;;;7961:1;7958;7951:12;7915:2;7989:63;8044:7;8035:6;8024:9;8020:22;7989:63;:::i;:::-;7979:73;;7842:220;7770:299;;;;:::o;8075:262::-;;8183:2;8171:9;8162:7;8158:23;8154:32;8151:2;;;8199:1;8196;8189:12;8151:2;8242:1;8267:53;8312:7;8303:6;8292:9;8288:22;8267:53;:::i;:::-;8257:63;;8213:117;8141:196;;;;:::o;8343:596::-;;;8516:2;8504:9;8495:7;8491:23;8487:32;8484:2;;;8532:1;8529;8522:12;8484:2;8575:1;8600:53;8645:7;8636:6;8625:9;8621:22;8600:53;:::i;:::-;8590:63;;8546:117;8730:2;8719:9;8715:18;8702:32;8761:18;8753:6;8750:30;8747:2;;;8793:1;8790;8783:12;8747:2;8821:101;8914:7;8905:6;8894:9;8890:22;8821:101;:::i;:::-;8811:111;;8673:259;8474:465;;;;;:::o;8945:407::-;;;9070:2;9058:9;9049:7;9045:23;9041:32;9038:2;;;9086:1;9083;9076:12;9038:2;9129:1;9154:53;9199:7;9190:6;9179:9;9175:22;9154:53;:::i;:::-;9144:63;;9100:117;9256:2;9282:53;9327:7;9318:6;9307:9;9303:22;9282:53;:::i;:::-;9272:63;;9227:118;9028:324;;;;;:::o;9358:118::-;9445:24;9463:5;9445:24;:::i;:::-;9440:3;9433:37;9423:53;;:::o;9482:157::-;9587:45;9607:24;9625:5;9607:24;:::i;:::-;9587:45;:::i;:::-;9582:3;9575:58;9565:74;;:::o;9645:109::-;9726:21;9741:5;9726:21;:::i;:::-;9721:3;9714:34;9704:50;;:::o;9760:360::-;;9874:38;9906:5;9874:38;:::i;:::-;9928:70;9991:6;9986:3;9928:70;:::i;:::-;9921:77;;10007:52;10052:6;10047:3;10040:4;10033:5;10029:16;10007:52;:::i;:::-;10084:29;10106:6;10084:29;:::i;:::-;10079:3;10075:39;10068:46;;9850:270;;;;;:::o;10126:364::-;;10242:39;10275:5;10242:39;:::i;:::-;10297:71;10361:6;10356:3;10297:71;:::i;:::-;10290:78;;10377:52;10422:6;10417:3;10410:4;10403:5;10399:16;10377:52;:::i;:::-;10454:29;10476:6;10454:29;:::i;:::-;10449:3;10445:39;10438:46;;10218:272;;;;;:::o;10496:377::-;;10630:39;10663:5;10630:39;:::i;:::-;10685:89;10767:6;10762:3;10685:89;:::i;:::-;10678:96;;10783:52;10828:6;10823:3;10816:4;10809:5;10805:16;10783:52;:::i;:::-;10860:6;10855:3;10851:16;10844:23;;10606:267;;;;;:::o;10903:845::-;;11043:5;11037:12;11072:36;11098:9;11072:36;:::i;:::-;11124:89;11206:6;11201:3;11124:89;:::i;:::-;11117:96;;11244:1;11233:9;11229:17;11260:1;11255:137;;;;11406:1;11401:341;;;;11222:520;;11255:137;11339:4;11335:9;11324;11320:25;11315:3;11308:38;11375:6;11370:3;11366:16;11359:23;;11255:137;;11401:341;11468:38;11500:5;11468:38;:::i;:::-;11528:1;11542:154;11556:6;11553:1;11550:13;11542:154;;;11630:7;11624:14;11620:1;11615:3;11611:11;11604:35;11680:1;11671:7;11667:15;11656:26;;11578:4;11575:1;11571:12;11566:17;;11542:154;;;11725:6;11720:3;11716:16;11709:23;;11408:334;;11222:520;;11010:738;;;;;;:::o;11754:337::-;;11935:84;12017:1;12012:3;11935:84;:::i;:::-;11928:91;;12049:7;12045:1;12040:3;12036:11;12029:28;12083:1;12078:3;12074:11;12067:18;;11918:173;;;:::o;12097:375::-;;12260:67;12324:2;12319:3;12260:67;:::i;:::-;12253:74;;12357:34;12353:1;12348:3;12344:11;12337:55;12423:13;12418:2;12413:3;12409:12;12402:35;12463:2;12458:3;12454:12;12447:19;;12243:229;;;:::o;12478:382::-;;12641:67;12705:2;12700:3;12641:67;:::i;:::-;12634:74;;12738:34;12734:1;12729:3;12725:11;12718:55;12804:20;12799:2;12794:3;12790:12;12783:42;12851:2;12846:3;12842:12;12835:19;;12624:236;;;:::o;12866:694::-;;13047:86;13129:3;13124;13047:86;:::i;:::-;13040:93;;13163:66;13159:1;13154:3;13150:11;13143:87;13261:66;13256:2;13251:3;13247:12;13240:88;13359:66;13354:2;13349:3;13345:12;13338:88;13457:66;13452:2;13447:3;13443:12;13436:88;13550:3;13545;13541:13;13534:20;;13030:530;;;:::o;13566:370::-;;13729:67;13793:2;13788:3;13729:67;:::i;:::-;13722:74;;13826:34;13822:1;13817:3;13813:11;13806:55;13892:8;13887:2;13882:3;13878:12;13871:30;13927:2;13922:3;13918:12;13911:19;;13712:224;;;:::o;13942:326::-;;14105:67;14169:2;14164:3;14105:67;:::i;:::-;14098:74;;14202:30;14198:1;14193:3;14189:11;14182:51;14259:2;14254:3;14250:12;14243:19;;14088:180;;;:::o;14274:337::-;;14455:84;14537:1;14532:3;14455:84;:::i;:::-;14448:91;;14569:7;14565:1;14560:3;14556:11;14549:28;14603:1;14598:3;14594:11;14587:18;;14438:173;;;:::o;14617:398::-;;14798:85;14880:2;14875:3;14798:85;:::i;:::-;14791:92;;14913:66;14909:1;14904:3;14900:11;14893:87;15006:2;15001:3;14997:12;14990:19;;14781:234;;;:::o;15021:333::-;;15202:84;15284:1;15279:3;15202:84;:::i;:::-;15195:91;;15316:3;15312:1;15307:3;15303:11;15296:24;15346:1;15341:3;15337:11;15330:18;;15185:169;;;:::o;15360:348::-;;15541:85;15623:2;15618:3;15541:85;:::i;:::-;15534:92;;15656:16;15652:1;15647:3;15643:11;15636:37;15699:2;15694:3;15690:12;15683:19;;15524:184;;;:::o;15714:368::-;;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15974:34;15970:1;15965:3;15961:11;15954:55;16040:6;16035:2;16030:3;16026:12;16019:28;16073:2;16068:3;16064:12;16057:19;;15860:222;;;:::o;16088:323::-;;16251:67;16315:2;16310:3;16251:67;:::i;:::-;16244:74;;16348:27;16344:1;16339:3;16335:11;16328:48;16402:2;16397:3;16393:12;16386:19;;16234:177;;;:::o;16417:398::-;;16598:85;16680:2;16675:3;16598:85;:::i;:::-;16591:92;;16713:66;16709:1;16704:3;16700:11;16693:87;16806:2;16801:3;16797:12;16790:19;;16581:234;;;:::o;16821:376::-;;16984:67;17048:2;17043:3;16984:67;:::i;:::-;16977:74;;17081:34;17077:1;17072:3;17068:11;17061:55;17147:14;17142:2;17137:3;17133:12;17126:36;17188:2;17183:3;17179:12;17172:19;;16967:230;;;:::o;17203:335::-;;17384:84;17466:1;17461:3;17384:84;:::i;:::-;17377:91;;17498:5;17494:1;17489:3;17485:11;17478:26;17530:1;17525:3;17521:11;17514:18;;17367:171;;;:::o;17544:388::-;;17707:67;17771:2;17766:3;17707:67;:::i;:::-;17700:74;;17804:34;17800:1;17795:3;17791:11;17784:55;17870:26;17865:2;17860:3;17856:12;17849:48;17923:2;17918:3;17914:12;17907:19;;17690:242;;;:::o;17938:374::-;;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18198:34;18194:1;18189:3;18185:11;18178:55;18264:12;18259:2;18254:3;18250:12;18243:34;18303:2;18298:3;18294:12;18287:19;;18084:228;;;:::o;18318:373::-;;18481:67;18545:2;18540:3;18481:67;:::i;:::-;18474:74;;18578:34;18574:1;18569:3;18565:11;18558:55;18644:11;18639:2;18634:3;18630:12;18623:33;18682:2;18677:3;18673:12;18666:19;;18464:227;;;:::o;18697:2496::-;;18878:87;18960:4;18955:3;18878:87;:::i;:::-;18871:94;;18995:34;18991:1;18986:3;18982:11;18975:55;19065:34;19060:2;19055:3;19051:12;19044:56;19135:34;19130:2;19125:3;19121:12;19114:56;19205:34;19200:2;19195:3;19191:12;19184:56;19272:34;19266:3;19261;19257:13;19250:57;19339:34;19333:3;19328;19324:13;19317:57;19406:34;19400:3;19395;19391:13;19384:57;19477:34;19471:3;19466;19462:13;19455:57;19548:34;19542:3;19537;19533:13;19526:57;19615:34;19609:3;19604;19600:13;19593:57;19682:34;19676:3;19671;19667:13;19660:57;19753:34;19747:3;19742;19738:13;19731:57;19824:34;19818:3;19813;19809:13;19802:57;19891:34;19885:3;19880;19876:13;19869:57;19958:34;19952:3;19947;19943:13;19936:57;20025:34;20019:3;20014;20010:13;20003:57;20096:34;20090:3;20085;20081:13;20074:57;20167:34;20161:3;20156;20152:13;20145:57;20234:34;20228:3;20223;20219:13;20212:57;20301:34;20295:3;20290;20286:13;20279:57;20372:34;20366:3;20361;20357:13;20350:57;20443:34;20437:3;20432;20428:13;20421:57;20510:34;20504:3;20499;20495:13;20488:57;20577:34;20571:3;20566;20562:13;20555:57;20644:34;20638:3;20633;20629:13;20622:57;20715:34;20709:3;20704;20700:13;20693:57;20786:34;20780:3;20775;20771:13;20764:57;20853:34;20847:3;20842;20838:13;20831:57;20920:34;20914:3;20909;20905:13;20898:57;20991:34;20985:3;20980;20976:13;20969:57;21062:34;21056:3;21051;21047:13;21040:57;21129:26;21123:3;21118;21114:13;21107:49;21182:4;21177:3;21173:14;21166:21;;18861:2332;;;:::o;21199:396::-;;21380:84;21462:1;21457:3;21380:84;:::i;:::-;21373:91;;21494:66;21490:1;21485:3;21481:11;21474:87;21587:1;21582:3;21578:11;21571:18;;21363:232;;;:::o;21601:330::-;;21764:67;21828:2;21823:3;21764:67;:::i;:::-;21757:74;;21861:34;21857:1;21852:3;21848:11;21841:55;21922:2;21917:3;21913:12;21906:19;;21747:184;;;:::o;21937:321::-;;22118:84;22200:1;22195:3;22118:84;:::i;:::-;22111:91;;22228:3;22224:1;22219:3;22215:11;22208:24;22254:1;22249:3;22245:11;22238:18;;22101:157;;;:::o;22260:356::-;;22419:67;22483:2;22478:3;22419:67;:::i;:::-;22412:74;;22512:34;22508:1;22503:3;22499:11;22492:55;22574:14;22569:2;22564:3;22560:12;22553:36;22611:2;22606:3;22602:12;22595:19;;22406:210;;;:::o;22618:314::-;;22777:67;22841:2;22836:3;22777:67;:::i;:::-;22770:74;;22870:34;22866:1;22861:3;22857:11;22850:55;22927:2;22922:3;22918:12;22911:19;;22764:168;;;:::o;22934:317::-;;23111:84;23193:1;23188:3;23111:84;:::i;:::-;23104:91;;23221:3;23217:1;23212:3;23208:11;23201:24;23247:1;23242:3;23238:11;23231:18;;23098:153;;;:::o;23253:353::-;;23412:67;23476:2;23471:3;23412:67;:::i;:::-;23405:74;;23505:34;23501:1;23496:3;23492:11;23485:55;23567:11;23562:2;23557:3;23553:12;23546:33;23601:2;23596:3;23592:12;23585:19;;23399:207;;;:::o;23608:382::-;;23785:85;23867:2;23862:3;23785:85;:::i;:::-;23778:92;;23896:66;23892:1;23887:3;23883:11;23876:87;23985:2;23980:3;23976:12;23969:19;;23772:218;;;:::o;23992:317::-;;24169:84;24251:1;24246:3;24169:84;:::i;:::-;24162:91;;24279:3;24275:1;24270:3;24266:11;24259:24;24305:1;24300:3;24296:11;24289:18;;24156:153;;;:::o;24311:345::-;;24470:67;24534:2;24529:3;24470:67;:::i;:::-;24463:74;;24563:34;24559:1;24554:3;24550:11;24543:55;24625:3;24620:2;24615:3;24611:12;24604:25;24651:2;24646:3;24642:12;24635:19;;24457:199;;;:::o;24658:347::-;;24835:85;24917:2;24912:3;24835:85;:::i;:::-;24828:92;;24946:31;24942:1;24937:3;24933:11;24926:52;25000:2;24995:3;24991:12;24984:19;;24822:183;;;:::o;25007:382::-;;25184:85;25266:2;25261:3;25184:85;:::i;:::-;25177:92;;25295:66;25291:1;25286:3;25282:11;25275:87;25384:2;25379:3;25375:12;25368:19;;25171:218;;;:::o;25391:361::-;;25550:67;25614:2;25609:3;25550:67;:::i;:::-;25543:74;;25643:34;25639:1;25634:3;25630:11;25623:55;25705:19;25700:2;25695:3;25691:12;25684:41;25747:2;25742:3;25738:12;25731:19;;25537:215;;;:::o;25754:317::-;;25931:84;26013:1;26008:3;25931:84;:::i;:::-;25924:91;;26041:3;26037:1;26032:3;26028:11;26021:24;26067:1;26062:3;26058:11;26051:18;;25918:153;;;:::o;26073:282::-;;26232:66;26296:1;26291:3;26232:66;:::i;:::-;26225:73;;26324:3;26320:1;26315:3;26311:11;26304:24;26350:2;26345:3;26341:12;26334:19;;26219:136;;;:::o;26357:356::-;;26516:67;26580:2;26575:3;26516:67;:::i;:::-;26509:74;;26609:34;26605:1;26600:3;26596:11;26589:55;26671:14;26666:2;26661:3;26657:12;26650:36;26708:2;26703:3;26699:12;26692:19;;26503:210;;;:::o;26715:796::-;;26892:86;26974:3;26969;26892:86;:::i;:::-;26885:93;;27004:66;27000:1;26995:3;26991:11;26984:87;27098:34;27093:2;27088:3;27084:12;27077:56;27160:34;27155:2;27150:3;27146:12;27139:56;27222:34;27217:2;27212:3;27208:12;27201:56;27285:66;27279:3;27274;27270:13;27263:89;27380:66;27374:3;27369;27365:13;27358:89;27475:7;27469:3;27464;27460:13;27453:30;27505:3;27500;27496:13;27489:20;;26879:632;;;:::o;27513:110::-;27596:24;27614:5;27596:24;:::i;:::-;27591:3;27584:37;27578:45;;:::o;27625:149::-;27726:45;27746:24;27764:5;27746:24;:::i;:::-;27726:45;:::i;:::-;27721:3;27714:58;27708:66;;:::o;27776:263::-;;27926:95;28017:3;28008:6;27926:95;:::i;:::-;27919:102;;28034:3;28027:10;;27912:127;;;;:::o;28041:419::-;;28239:95;28330:3;28321:6;28239:95;:::i;:::-;28232:102;;28347:95;28438:3;28429:6;28347:95;:::i;:::-;28340:102;;28455:3;28448:10;;28225:235;;;;;:::o;28462:525::-;;28713:95;28804:3;28795:6;28713:95;:::i;:::-;28706:102;;28821:148;28965:3;28821:148;:::i;:::-;28814:155;;28982:3;28975:10;;28699:288;;;;:::o;28989:1779::-;;29687:95;29778:3;29769:6;29687:95;:::i;:::-;29680:102;;29795:148;29939:3;29795:148;:::i;:::-;29788:155;;29956:95;30047:3;30038:6;29956:95;:::i;:::-;29949:102;;30064:148;30208:3;30064:148;:::i;:::-;30057:155;;30225:95;30316:3;30307:6;30225:95;:::i;:::-;30218:102;;30333:148;30477:3;30333:148;:::i;:::-;30326:155;;30494:95;30585:3;30576:6;30494:95;:::i;:::-;30487:102;;30602:148;30746:3;30602:148;:::i;:::-;30595:155;;30763:3;30756:10;;29673:1095;;;;;;;:::o;30770:1349::-;;31313:95;31404:3;31395:6;31313:95;:::i;:::-;31306:102;;31421:148;31565:3;31421:148;:::i;:::-;31414:155;;31582:92;31670:3;31661:6;31582:92;:::i;:::-;31575:99;;31687:148;31831:3;31687:148;:::i;:::-;31680:155;;31848:92;31936:3;31927:6;31848:92;:::i;:::-;31841:99;;31953:148;32097:3;31953:148;:::i;:::-;31946:155;;32114:3;32107:10;;31299:820;;;;;;:::o;32121:257::-;;32268:92;32356:3;32347:6;32268:92;:::i;:::-;32261:99;;32373:3;32366:10;;32254:124;;;;:::o;32380:787::-;;32732:148;32876:3;32732:148;:::i;:::-;32725:155;;32893:95;32984:3;32975:6;32893:95;:::i;:::-;32886:102;;33001:148;33145:3;33001:148;:::i;:::-;32994:155;;33162:3;33155:10;;32718:449;;;;:::o;33169:787::-;;33521:148;33665:3;33521:148;:::i;:::-;33514:155;;33682:95;33773:3;33764:6;33682:95;:::i;:::-;33675:102;;33790:148;33934:3;33790:148;:::i;:::-;33783:155;;33951:3;33944:10;;33507:449;;;;:::o;33958:525::-;;34209:148;34353:3;34209:148;:::i;:::-;34202:155;;34370:95;34461:3;34452:6;34370:95;:::i;:::-;34363:102;;34478:3;34471:10;;34195:288;;;;:::o;34485:1623::-;;35135:148;35279:3;35135:148;:::i;:::-;35128:155;;35296:95;35387:3;35378:6;35296:95;:::i;:::-;35289:102;;35404:148;35548:3;35404:148;:::i;:::-;35397:155;;35565:95;35656:3;35647:6;35565:95;:::i;:::-;35558:102;;35673:148;35817:3;35673:148;:::i;:::-;35666:155;;35834:95;35925:3;35916:6;35834:95;:::i;:::-;35827:102;;35942:148;36086:3;35942:148;:::i;:::-;35935:155;;36103:3;36096:10;;35121:987;;;;;;:::o;36110:525::-;;36361:148;36505:3;36361:148;:::i;:::-;36354:155;;36522:95;36613:3;36604:6;36522:95;:::i;:::-;36515:102;;36630:3;36623:10;;36347:288;;;;:::o;36637:905::-;;36900:75;36971:3;36962:6;36900:75;:::i;:::-;36996:2;36991:3;36987:12;36980:19;;37005:75;37076:3;37067:6;37005:75;:::i;:::-;37101:2;37096:3;37092:12;37085:19;;37110:75;37181:3;37172:6;37110:75;:::i;:::-;37206:2;37201:3;37197:12;37190:19;;37215:75;37286:3;37277:6;37215:75;:::i;:::-;37311:2;37306:3;37302:12;37295:19;;37320:75;37391:3;37382:6;37320:75;:::i;:::-;37416:2;37411:3;37407:12;37400:19;;37425:75;37496:3;37487:6;37425:75;:::i;:::-;37521:2;37516:3;37512:12;37505:19;;37537:3;37530:10;;36893:649;;;;;;;;;:::o;37544:210::-;;37671:2;37660:9;37656:18;37648:26;;37680:71;37748:1;37737:9;37733:17;37724:6;37680:71;:::i;:::-;37642:112;;;;:::o;37756:612::-;;37985:3;37974:9;37970:19;37962:27;;37995:71;38063:1;38052:9;38048:17;38039:6;37995:71;:::i;:::-;38072:72;38140:2;38129:9;38125:18;38116:6;38072:72;:::i;:::-;38150;38218:2;38207:9;38203:18;38194:6;38150:72;:::i;:::-;38265:9;38259:4;38255:20;38250:2;38239:9;38235:18;38228:48;38289:76;38360:4;38351:6;38289:76;:::i;:::-;38281:84;;37956:412;;;;;;;:::o;38370:198::-;;38491:2;38480:9;38476:18;38468:26;;38500:65;38562:1;38551:9;38547:17;38538:6;38500:65;:::i;:::-;38462:106;;;;:::o;38570:297::-;;38717:2;38706:9;38702:18;38694:26;;38762:9;38756:4;38752:20;38748:1;38737:9;38733:17;38726:47;38786:78;38859:4;38850:6;38786:78;:::i;:::-;38778:86;;38688:179;;;;:::o;38869:790::-;;39140:3;39129:9;39125:19;39117:27;;39186:9;39180:4;39176:20;39172:1;39161:9;39157:17;39150:47;39210:78;39283:4;39274:6;39210:78;:::i;:::-;39202:86;;39331:9;39325:4;39321:20;39316:2;39305:9;39301:18;39294:48;39355:78;39428:4;39419:6;39355:78;:::i;:::-;39347:86;;39476:9;39470:4;39466:20;39461:2;39450:9;39446:18;39439:48;39500:78;39573:4;39564:6;39500:78;:::i;:::-;39492:86;;39584:72;39652:2;39641:9;39637:18;39628:6;39584:72;:::i;:::-;39111:548;;;;;;;:::o;39661:403::-;;39861:2;39850:9;39846:18;39838:26;;39906:9;39900:4;39896:20;39892:1;39881:9;39877:17;39870:47;39930:131;40056:4;39930:131;:::i;:::-;39922:139;;39832:232;;;:::o;40066:403::-;;40266:2;40255:9;40251:18;40243:26;;40311:9;40305:4;40301:20;40297:1;40286:9;40282:17;40275:47;40335:131;40461:4;40335:131;:::i;:::-;40327:139;;40237:232;;;:::o;40471:403::-;;40671:2;40660:9;40656:18;40648:26;;40716:9;40710:4;40706:20;40702:1;40691:9;40687:17;40680:47;40740:131;40866:4;40740:131;:::i;:::-;40732:139;;40642:232;;;:::o;40876:403::-;;41076:2;41065:9;41061:18;41053:26;;41121:9;41115:4;41111:20;41107:1;41096:9;41092:17;41085:47;41145:131;41271:4;41145:131;:::i;:::-;41137:139;;41047:232;;;:::o;41281:403::-;;41481:2;41470:9;41466:18;41458:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41550:131;41676:4;41550:131;:::i;:::-;41542:139;;41452:232;;;:::o;41686:403::-;;41886:2;41875:9;41871:18;41863:26;;41931:9;41925:4;41921:20;41917:1;41906:9;41902:17;41895:47;41955:131;42081:4;41955:131;:::i;:::-;41947:139;;41857:232;;;:::o;42091:403::-;;42291:2;42280:9;42276:18;42268:26;;42336:9;42330:4;42326:20;42322:1;42311:9;42307:17;42300:47;42360:131;42486:4;42360:131;:::i;:::-;42352:139;;42262:232;;;:::o;42496:403::-;;42696:2;42685:9;42681:18;42673:26;;42741:9;42735:4;42731:20;42727:1;42716:9;42712:17;42705:47;42765:131;42891:4;42765:131;:::i;:::-;42757:139;;42667:232;;;:::o;42901:403::-;;43101:2;43090:9;43086:18;43078:26;;43146:9;43140:4;43136:20;43132:1;43121:9;43117:17;43110:47;43170:131;43296:4;43170:131;:::i;:::-;43162:139;;43072:232;;;:::o;43306:403::-;;43506:2;43495:9;43491:18;43483:26;;43551:9;43545:4;43541:20;43537:1;43526:9;43522:17;43515:47;43575:131;43701:4;43575:131;:::i;:::-;43567:139;;43477:232;;;:::o;43711:403::-;;43911:2;43900:9;43896:18;43888:26;;43956:9;43950:4;43946:20;43942:1;43931:9;43927:17;43920:47;43980:131;44106:4;43980:131;:::i;:::-;43972:139;;43882:232;;;:::o;44116:403::-;;44316:2;44305:9;44301:18;44293:26;;44361:9;44355:4;44351:20;44347:1;44336:9;44332:17;44325:47;44385:131;44511:4;44385:131;:::i;:::-;44377:139;;44287:232;;;:::o;44521:403::-;;44721:2;44710:9;44706:18;44698:26;;44766:9;44760:4;44756:20;44752:1;44741:9;44737:17;44730:47;44790:131;44916:4;44790:131;:::i;:::-;44782:139;;44692:232;;;:::o;44926:403::-;;45126:2;45115:9;45111:18;45103:26;;45171:9;45165:4;45161:20;45157:1;45146:9;45142:17;45135:47;45195:131;45321:4;45195:131;:::i;:::-;45187:139;;45097:232;;;:::o;45331:403::-;;45531:2;45520:9;45516:18;45508:26;;45576:9;45570:4;45566:20;45562:1;45551:9;45547:17;45540:47;45600:131;45726:4;45600:131;:::i;:::-;45592:139;;45502:232;;;:::o;45736:403::-;;45936:2;45925:9;45921:18;45913:26;;45981:9;45975:4;45971:20;45967:1;45956:9;45952:17;45945:47;46005:131;46131:4;46005:131;:::i;:::-;45997:139;;45907:232;;;:::o;46141:403::-;;46341:2;46330:9;46326:18;46318:26;;46386:9;46380:4;46376:20;46372:1;46361:9;46357:17;46350:47;46410:131;46536:4;46410:131;:::i;:::-;46402:139;;46312:232;;;:::o;46546:403::-;;46746:2;46735:9;46731:18;46723:26;;46791:9;46785:4;46781:20;46777:1;46766:9;46762:17;46755:47;46815:131;46941:4;46815:131;:::i;:::-;46807:139;;46717:232;;;:::o;46951:210::-;;47078:2;47067:9;47063:18;47055:26;;47087:71;47155:1;47144:9;47140:17;47131:6;47087:71;:::i;:::-;47049:112;;;;:::o;47163:259::-;;47225:2;47219:9;47209:19;;47263:4;47255:6;47251:17;47362:6;47350:10;47347:22;47326:18;47314:10;47311:34;47308:62;47305:2;;;47373:18;;:::i;:::-;47305:2;47409:10;47405:2;47398:22;47203:219;;;;:::o;47424:310::-;;47606:18;47598:6;47595:30;47592:2;;;47628:18;;:::i;:::-;47592:2;47674:4;47666:6;47662:17;47654:25;;47726:4;47720;47716:15;47708:23;;47529:205;;;:::o;47736:303::-;;47879:18;47871:6;47868:30;47865:2;;;47901:18;;:::i;:::-;47865:2;47978:4;47974:9;47967:4;47959:6;47955:17;47951:33;47943:41;;48031:4;48025;48021:15;48013:23;;47802:237;;;:::o;48041:304::-;;48185:18;48177:6;48174:30;48171:2;;;48207:18;;:::i;:::-;48171:2;48284:4;48280:9;48273:4;48265:6;48261:17;48257:33;48249:41;;48337:4;48331;48327:15;48319:23;;48108:237;;;:::o;48347:125::-;;48415:3;48407:11;;48434:3;48431:1;48424:14;48464:4;48461:1;48451:18;48443:26;;48401:71;;;:::o;48474:90::-;;48555:5;48549:12;48539:22;;48532:32;;;:::o;48566:91::-;;48648:5;48642:12;48632:22;;48625:32;;;:::o;48659:156::-;;48772:6;48767:3;48760:19;48808:4;48803:3;48799:14;48784:29;;48754:61;;;;:::o;48817:157::-;;48931:6;48926:3;48919:19;48967:4;48962:3;48958:14;48943:29;;48913:61;;;;:::o;48976:140::-;;49111:3;49096:18;;49090:26;;;;:::o;49118:218::-;;49172:19;49189:1;49172:19;:::i;:::-;49167:24;;49201:19;49218:1;49201:19;:::i;:::-;49196:24;;49286:1;49278:6;49274:14;49271:1;49268:21;49265:2;;;49292:18;;:::i;:::-;49265:2;49332:1;49329;49325:9;49318:16;;49161:175;;;;:::o;49338:281::-;;49393:20;49411:1;49393:20;:::i;:::-;49388:25;;49423:20;49441:1;49423:20;:::i;:::-;49418:25;;49569:1;49501:66;49497:74;49494:1;49491:81;49488:2;;;49575:18;;:::i;:::-;49488:2;49615:1;49612;49608:9;49601:16;;49382:237;;;;:::o;49621:213::-;;49674:18;49690:1;49674:18;:::i;:::-;49669:23;;49702:18;49718:1;49702:18;:::i;:::-;49697:23;;49784:1;49778:4;49774:12;49771:1;49768:19;49765:2;;;49790:18;;:::i;:::-;49765:2;49830:1;49827;49823:9;49816:16;;49663:171;;;;:::o;49836:165::-;;49889:20;49907:1;49889:20;:::i;:::-;49884:25;;49919:20;49937:1;49919:20;:::i;:::-;49914:25;;49954:1;49944:2;;49959:18;;:::i;:::-;49944:2;49997:1;49994;49990:9;49985:14;;49878:123;;;;:::o;50003:261::-;;50061:19;50078:1;50061:19;:::i;:::-;50056:24;;50090:19;50107:1;50090:19;:::i;:::-;50085:24;;50209:1;50201:6;50197:14;50194:1;50191:21;50186:1;50179:9;50172:17;50168:45;50165:2;;;50216:18;;:::i;:::-;50165:2;50260:1;50257;50253:9;50242:20;;50050:214;;;;:::o;50266:324::-;;50325:20;50343:1;50325:20;:::i;:::-;50320:25;;50355:20;50373:1;50355:20;:::i;:::-;50350:25;;50535:1;50467:66;50463:74;50460:1;50457:81;50452:1;50445:9;50438:17;50434:105;50431:2;;;50542:18;;:::i;:::-;50431:2;50586:1;50583;50579:9;50568:20;;50314:276;;;;:::o;50592:256::-;;50649:18;50665:1;50649:18;:::i;:::-;50644:23;;50677:18;50693:1;50677:18;:::i;:::-;50672:23;;50793:1;50787:4;50783:12;50780:1;50777:19;50772:1;50765:9;50758:17;50754:43;50751:2;;;50800:18;;:::i;:::-;50751:2;50844:1;50841;50837:9;50826:20;;50638:210;;;;:::o;50850:171::-;;50906:20;50924:1;50906:20;:::i;:::-;50901:25;;50936:20;50954:1;50936:20;:::i;:::-;50931:25;;50971:1;50968;50965:8;50962:2;;;50976:18;;:::i;:::-;50962:2;51017:1;51014;51010:9;51002:17;;50895:126;;;;:::o;51023:165::-;;51077:18;51093:1;51077:18;:::i;:::-;51072:23;;51105:18;51121:1;51105:18;:::i;:::-;51100:23;;51138:1;51135;51132:8;51129:2;;;51143:18;;:::i;:::-;51129:2;51184:1;51181;51177:9;51169:17;;51066:122;;;;:::o;51190:88::-;;51252:24;51270:5;51252:24;:::i;:::-;51241:35;;51235:43;;;:::o;51280:82::-;;51353:5;51346:13;51339:21;51328:32;;51322:40;;;:::o;51364:141::-;;51436:66;51429:5;51425:78;51414:89;;51408:97;;;:::o;51507:81::-;;51579:6;51572:5;51568:18;51557:29;;51551:37;;;:::o;51590:118::-;;51663:42;51656:5;51652:54;51641:65;;51635:73;;;:::o;51710:69::-;;51772:5;51761:16;;51755:24;;;:::o;51781:78::-;;51852:4;51845:5;51841:16;51830:27;;51824:35;;;:::o;51861:138::-;51941:6;51936:3;51931;51918:30;51995:1;51986:6;51981:3;51977:16;51970:27;51912:87;;;:::o;52001:263::-;52065:1;52071:101;52085:6;52082:1;52079:13;52071:101;;;52162:1;52157:3;52153:11;52147:18;52143:1;52138:3;52134:11;52127:39;52107:2;52104:1;52100:10;52095:15;;52071:101;;;52186:6;52183:1;52180:13;52177:2;;;52254:1;52245:6;52240:3;52236:16;52229:27;52177:2;52050:214;;;;:::o;52266:284::-;;52343:1;52337:4;52333:12;52323:22;;52386:1;52380:4;52376:12;52403:18;52393:2;;52455:4;52447:6;52443:17;52433:27;;52393:2;52509;52501:6;52498:14;52478:18;52475:38;52472:2;;;52524:18;;:::i;:::-;52472:2;52317:233;;;;:::o;52552:155::-;;52609:23;52626:5;52609:23;:::i;:::-;52600:32;;52650:6;52643:5;52640:17;52637:2;;;52660:18;;:::i;:::-;52637:2;52703:1;52696:5;52692:13;52685:20;;52594:113;;;:::o;52709:217::-;;52767:24;52785:5;52767:24;:::i;:::-;52758:33;;52809:66;52802:5;52799:77;52796:2;;;52879:18;;:::i;:::-;52796:2;52922:1;52915:5;52911:13;52904:20;;52752:174;;;:::o;52928:151::-;;52984:22;53000:5;52984:22;:::i;:::-;52975:31;;53024:4;53017:5;53014:15;53011:2;;;53032:18;;:::i;:::-;53011:2;53075:1;53068:5;53064:13;53057:20;;52969:110;;;:::o;53081:92::-;;53145:26;53165:5;53145:26;:::i;:::-;53134:37;;53128:45;;;:::o;53175:86::-;;53239:20;53253:5;53239:20;:::i;:::-;53228:31;;53222:39;;;:::o;53263:71::-;;53327:5;53316:16;;53310:24;;;:::o;53336:156::-;;53381:20;53399:1;53381:20;:::i;:::-;53376:25;;53411:20;53429:1;53411:20;:::i;:::-;53406:25;;53446:1;53436:2;;53451:18;;:::i;:::-;53436:2;53488:1;53485;53481:9;53476:14;;53370:122;;;;:::o;53494:164::-;53538:77;53535:1;53528:88;53631:4;53628:1;53621:15;53651:4;53648:1;53641:15;53660:164;53704:77;53701:1;53694:88;53797:4;53794:1;53787:15;53817:4;53814:1;53807:15;53826:164;53870:77;53867:1;53860:88;53963:4;53960:1;53953:15;53983:4;53980:1;53973:15;53992:164;54036:77;54033:1;54026:88;54129:4;54126:1;54119:15;54149:4;54146:1;54139:15;54158:94;;54246:2;54242:7;54237:2;54230:5;54226:14;54222:28;54212:38;;54206:46;;;:::o;54254:82::-;;54327:5;54323:2;54319:14;54302:31;;54296:40;;;:::o;54338:114::-;54407:24;54425:5;54407:24;:::i;:::-;54400:5;54397:35;54387:2;;54446:1;54443;54436:12;54387:2;54381:71;:::o;54454:108::-;54520:21;54535:5;54520:21;:::i;:::-;54513:5;54510:32;54500:2;;54556:1;54553;54546:12;54500:2;54494:68;:::o;54564:112::-;54632:23;54649:5;54632:23;:::i;:::-;54625:5;54622:34;54612:2;;54670:1;54667;54660:12;54612:2;54606:70;:::o;54678:114::-;54747:24;54765:5;54747:24;:::i;:::-;54740:5;54737:35;54727:2;;54786:1;54783;54776:12;54727:2;54721:71;:::o

Swarm Source

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