ETH Price: $3,426.78 (-1.59%)
Gas: 6 Gwei

Token

YakuzaBrothersOfBlood (YAKUZABOB)
 

Overview

Max Total Supply

784 YAKUZABOB

Holders

338

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 YAKUZABOB
0xd97c78a597b51a18f43f34ef099e1529f1c6b9c8
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
YakuzaBrothersOfBlood

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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


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


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





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

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

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

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

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

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

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

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

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

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

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

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


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





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


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





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

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

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


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





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


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





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


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





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


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





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


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











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


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





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

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

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


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






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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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





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

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

    bool private _paused;

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

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

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

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

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

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


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





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

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

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

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

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

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

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

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


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





// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File contracts/Yakuza.sol








contract YakuzaBrothersOfBlood is ERC721, ERC721Enumerable, Pausable, Ownable {
    using SafeMath for uint256;
    
    string public PROV;
    uint256 public price = 50000000000000000;
    
    mapping(address => uint256) private reservations;
    
    uint256 public maxYakuzas = 10000;
    uint256 public totalReserved = 0;
    
    bool public saleIsActive = false;
    bool public reservationIsActive = false;
    bool public reservationSaleIsActive = false;
    
    string public baseURI;
    
    constructor() ERC721("YakuzaBrothersOfBlood", "YAKUZABOB") {}
    
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    function flipReservationState() public onlyOwner {
        reservationIsActive = !reservationIsActive;
    }
    
    function flipReservationSaleState() public onlyOwner {
        reservationSaleIsActive = !reservationSaleIsActive;
    }
    
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        PROV = provenanceHash;
    }
    
     function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
  
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    
    function withdraw(address payable wallet) public onlyOwner {
        uint balance = address(this).balance;
        wallet.transfer(balance);
    }

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

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

    function whitelist(address[] memory ads, uint[] memory howmany) public onlyOwner {
        for(uint i = 0; i < ads.length; i++) {
            reservations[ads[i]] = howmany[i];
            totalReserved = totalReserved + howmany[i];
        }
    }
    
    function reserve(uint256 howmany) public {
        require(reservationIsActive, "reservation must be active");
        require(howmany <= 5 && howmany >= 1, "can only reserve between 1 and 5");
        require(totalReserved <= 10000, "reservation space is full");
        reservations[msg.sender] = howmany;
        totalReserved = (totalReserved + howmany);
    }
    
    function getReservation(address ad) public view returns (uint256){
        return reservations[ad];
    }

    function getTotalReserved() public view returns (uint256) {
        return totalReserved;
    }
    
    function mintReserved(uint256 totalToMint) public payable {
        require(reservationSaleIsActive, "Reservation sale must be active to mint");
        uint256 res = reservations[msg.sender];
        require(res > 0, "no reservations for your address");
        require(totalToMint <= res, "can only mint upto your reservation");
        require(price.mul(totalToMint) <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < totalToMint; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < maxYakuzas) {
                _safeMint(msg.sender, mintIndex);
            }
        }
        
        reservations[msg.sender] = (res - totalToMint);
    }
    
    function mintPublic(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint");
        require(numberOfTokens <= 5, "Can only mint 5 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= maxYakuzas, "Purchase would exceed max supply");
        require(price.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < maxYakuzas) {
                _safeMint(msg.sender, mintIndex);
            }
        }
    }

    function safeMint(address to, uint256 tokenId) public onlyOwner {
        _safeMint(to, tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"PROV","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipReservationSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReservationState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":"address","name":"ad","type":"address"}],"name":"getReservation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxYakuzas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalToMint","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservationIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservationSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"howmany","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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":"totalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"ads","type":"address[]"},{"internalType":"uint256[]","name":"howmany","type":"uint256[]"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec50000600c55612710600e556000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff0219169083151502179055506000601060026101000a81548160ff0219169083151502179055503480156200007857600080fd5b506040518060400160405280601581526020017f59616b757a6142726f74686572734f66426c6f6f6400000000000000000000008152506040518060400160405280600981526020017f59414b555a41424f4200000000000000000000000000000000000000000000008152508160009080519060200190620000fd92919062000228565b5080600190805190602001906200011692919062000228565b5050506000600a60006101000a81548160ff02191690831515021790555062000154620001486200015a60201b60201c565b6200016260201b60201c565b6200033d565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023690620002d8565b90600052602060002090601f0160209004810192826200025a5760008555620002a6565b82601f106200027557805160ff1916838001178555620002a6565b82800160010185558215620002a6579182015b82811115620002a557825182559160200191906001019062000288565b5b509050620002b59190620002b9565b5090565b5b80821115620002d4576000816000905550600101620002ba565b5090565b60006002820490506001821680620002f157607f821691505b602082108114156200030857620003076200030e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6150b7806200034d6000396000f3fe60806040526004361061025c5760003560e01c80636c0360eb11610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461087b578063cf235743146108b8578063e985e9c5146108e1578063eb8d24441461091e578063efd0cbf914610949578063f2fde38b146109655761025c565b8063a22cb465146107aa578063b2066f80146107d3578063b88d4fde14610810578063c6787bb114610839578063c71b0e1c146108505761025c565b806388400ea21161010857806388400ea2146106b95780638da5cb5b146106e457806395d89b411461070f5780639a5d140b1461073a578063a035b1fe14610756578063a1448194146107815761025c565b80636c0360eb146105fa57806370a0823114610625578063715018a614610662578063819b25ba146106795780638456cb59146106a25761025c565b80632861b9de116101dd5780634d96ca2b116101a15780634d96ca2b146104d85780634f6ccce71461050357806351cff8d91461054057806355f804b3146105695780635c975abb146105925780636352211e146105bd5761025c565b80632861b9de146104195780632f745c591461044457806334918dfd146104815780633f4ba83a1461049857806342842e0e146104af5761025c565b806316b9c33c1161022457806316b9c33c1461035857806318160ddd146103835780631e211910146103ae57806321bfc1aa146103d957806323b872dd146103f05761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613b7d565b61098e565b6040516102959190614774565b60405180910390f35b3480156102aa57600080fd5b506102b36109a0565b6040516102c0919061478f565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c10565b610a32565b6040516102fd919061470d565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613ad5565b610ab7565b005b34801561033b57600080fd5b5061035660048036038101906103519190613bcf565b610bcf565b005b34801561036457600080fd5b5061036d610c65565b60405161037a9190614774565b60405180910390f35b34801561038f57600080fd5b50610398610c78565b6040516103a59190614b71565b60405180910390f35b3480156103ba57600080fd5b506103c3610c85565b6040516103d09190614b71565b60405180910390f35b3480156103e557600080fd5b506103ee610c8b565b005b3480156103fc57600080fd5b50610417600480360381019061041291906139cf565b610d33565b005b34801561042557600080fd5b5061042e610d93565b60405161043b9190614b71565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613ad5565b610d9d565b6040516104789190614b71565b60405180910390f35b34801561048d57600080fd5b50610496610e42565b005b3480156104a457600080fd5b506104ad610eea565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906139cf565b610f70565b005b3480156104e457600080fd5b506104ed610f90565b6040516104fa919061478f565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613c10565b61101e565b6040516105379190614b71565b60405180910390f35b34801561054c57600080fd5b506105676004803603810190610562919061396a565b6110b5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613bcf565b611181565b005b34801561059e57600080fd5b506105a7611217565b6040516105b49190614774565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613c10565b61122e565b6040516105f1919061470d565b60405180910390f35b34801561060657600080fd5b5061060f6112e0565b60405161061c919061478f565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190613941565b61136e565b6040516106599190614b71565b60405180910390f35b34801561066e57600080fd5b50610677611426565b005b34801561068557600080fd5b506106a0600480360381019061069b9190613c10565b6114ae565b005b3480156106ae57600080fd5b506106b76115f0565b005b3480156106c557600080fd5b506106ce611676565b6040516106db9190614774565b60405180910390f35b3480156106f057600080fd5b506106f9611689565b604051610706919061470d565b60405180910390f35b34801561071b57600080fd5b506107246116b3565b604051610731919061478f565b60405180910390f35b610754600480360381019061074f9190613c10565b611745565b005b34801561076257600080fd5b5061076b611950565b6040516107789190614b71565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190613ad5565b611956565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613a99565b6119e0565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613941565b611b61565b6040516108079190614b71565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613a1e565b611baa565b005b34801561084557600080fd5b5061084e611c0c565b005b34801561085c57600080fd5b50610865611cb4565b6040516108729190614b71565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613c10565b611cba565b6040516108af919061478f565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613b11565b611d61565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613993565b611f19565b6040516109159190614774565b60405180910390f35b34801561092a57600080fd5b50610933611fad565b6040516109409190614774565b60405180910390f35b610963600480360381019061095e9190613c10565b611fc0565b005b34801561097157600080fd5b5061098c60048036038101906109879190613941565b612153565b005b60006109998261224b565b9050919050565b6060600080546109af90614e95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90614e95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b5050505050905090565b6000610a3d826122c5565b610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390614a31565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac28261122e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614af1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b52612331565b73ffffffffffffffffffffffffffffffffffffffff161480610b815750610b8081610b7b612331565b611f19565b5b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790614991565b60405180910390fd5b610bca8383612339565b505050565b610bd7612331565b73ffffffffffffffffffffffffffffffffffffffff16610bf5611689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4290614a71565b60405180910390fd5b80600b9080519060200190610c61929190613624565b5050565b601060019054906101000a900460ff1681565b6000600880549050905090565b600e5481565b610c93612331565b73ffffffffffffffffffffffffffffffffffffffff16610cb1611689565b73ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614a71565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610d44610d3e612331565b826123f2565b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90614b11565b60405180910390fd5b610d8e8383836124d0565b505050565b6000600f54905090565b6000610da88361136e565b8210610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614811565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4a612331565b73ffffffffffffffffffffffffffffffffffffffff16610e68611689565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614a71565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b610ef2612331565b73ffffffffffffffffffffffffffffffffffffffff16610f10611689565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614a71565b60405180910390fd5b610f6e61272c565b565b610f8b83838360405180602001604052806000815250611baa565b505050565b600b8054610f9d90614e95565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc990614e95565b80156110165780601f10610feb57610100808354040283529160200191611016565b820191906000526020600020905b815481529060010190602001808311610ff957829003601f168201915b505050505081565b6000611028610c78565b8210611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614b31565b60405180910390fd5b600882815481106110a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110bd612331565b73ffffffffffffffffffffffffffffffffffffffff166110db611689565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890614a71565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561117c573d6000803e3d6000fd5b505050565b611189612331565b73ffffffffffffffffffffffffffffffffffffffff166111a7611689565b73ffffffffffffffffffffffffffffffffffffffff16146111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490614a71565b60405180910390fd5b8060119080519060200190611213929190613624565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce906149d1565b60405180910390fd5b80915050919050565b601180546112ed90614e95565b80601f016020809104026020016040519081016040528092919081815260200182805461131990614e95565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906149b1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61142e612331565b73ffffffffffffffffffffffffffffffffffffffff1661144c611689565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614a71565b60405180910390fd5b6114ac60006127ce565b565b601060019054906101000a900460ff166114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614891565b60405180910390fd5b6005811115801561150f575060018110155b61154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614b51565b60405180910390fd5b612710600f541115611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90614951565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600f546115e79190614cb8565b600f8190555050565b6115f8612331565b73ffffffffffffffffffffffffffffffffffffffff16611616611689565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390614a71565b60405180910390fd5b611674612894565b565b601060029054906101000a900460ff1681565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116c290614e95565b80601f01602080910402602001604051908101604052809291908181526020018280546116ee90614e95565b801561173b5780601f106117105761010080835404028352916020019161173b565b820191906000526020600020905b81548152906001019060200180831161171e57829003601f168201915b5050505050905090565b601060029054906101000a900460ff16611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614a51565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290614a91565b60405180910390fd5b8082111561185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906147b1565b60405180910390fd5b3461187483600c5461293790919063ffffffff16565b11156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906148f1565b60405180910390fd5b60005b828110156118fc5760006118ca610c78565b9050600e546118d7610c78565b10156118e8576118e7338261294d565b5b5080806118f490614ec7565b9150506118b8565b5081816119099190614d99565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600c5481565b61195e612331565b73ffffffffffffffffffffffffffffffffffffffff1661197c611689565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614a71565b60405180910390fd5b6119dc828261294d565b5050565b6119e8612331565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d906148d1565b60405180910390fd5b8060056000611a63612331565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b10612331565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b559190614774565b60405180910390a35050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bbb611bb5612331565b836123f2565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190614b11565b60405180910390fd5b611c068484848461296b565b50505050565b611c14612331565b73ffffffffffffffffffffffffffffffffffffffff16611c32611689565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614a71565b60405180910390fd5b601060029054906101000a900460ff1615601060026101000a81548160ff021916908315150217905550565b600f5481565b6060611cc5826122c5565b611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ad1565b60405180910390fd5b6000611d0e6129c7565b90506000815111611d2e5760405180602001604052806000815250611d59565b80611d3884612a59565b604051602001611d499291906146e9565b6040516020818303038152906040525b915050919050565b611d69612331565b73ffffffffffffffffffffffffffffffffffffffff16611d87611689565b73ffffffffffffffffffffffffffffffffffffffff1614611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614a71565b60405180910390fd5b60005b8251811015611f1457818181518110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600d6000858481518110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818181518110611ee6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f54611efb9190614cb8565b600f819055508080611f0c90614ec7565b915050611de0565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b601060009054906101000a900460ff1661200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614911565b60405180910390fd5b6005811115612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906147f1565b60405180910390fd5b600e5461207082612062610c78565b612c0690919063ffffffff16565b11156120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a8906149f1565b60405180910390fd5b346120c782600c5461293790919063ffffffff16565b1115612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff906148f1565b60405180910390fd5b60005b8181101561214f57600061211d610c78565b9050600e5461212a610c78565b101561213b5761213a338261294d565b5b50808061214790614ec7565b91505061210b565b5050565b61215b612331565b73ffffffffffffffffffffffffffffffffffffffff16612179611689565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c690614a71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614851565b60405180910390fd5b612248816127ce565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122be57506122bd82612c1c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123ac8361122e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123fd826122c5565b61243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243390614931565b60405180910390fd5b60006124478361122e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124b657508373ffffffffffffffffffffffffffffffffffffffff1661249e84610a32565b73ffffffffffffffffffffffffffffffffffffffff16145b806124c757506124c68185611f19565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124f08261122e565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614ab1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad906148b1565b60405180910390fd5b6125c1838383612cfe565b6125cc600082612339565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261c9190614d99565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126739190614cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612734611217565b612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a906147d1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127b7612331565b6040516127c4919061470d565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61289c611217565b156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614971565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612920612331565b60405161292d919061470d565b60405180910390a1565b600081836129459190614d3f565b905092915050565b612967828260405180602001604052806000815250612d56565b5050565b6129768484846124d0565b61298284848484612db1565b6129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614831565b60405180910390fd5b50505050565b6060601180546129d690614e95565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0290614e95565b8015612a4f5780601f10612a2457610100808354040283529160200191612a4f565b820191906000526020600020905b815481529060010190602001808311612a3257829003601f168201915b5050505050905090565b60606000821415612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c01565b600082905060005b60008214612ad3578080612abc90614ec7565b915050600a82612acc9190614d0e565b9150612aa9565b60008167ffffffffffffffff811115612b15577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b475781602001600182028036833780820191505090505b5090505b60008514612bfa57600182612b609190614d99565b9150600a85612b6f9190614f10565b6030612b7b9190614cb8565b60f81b818381518110612bb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bf39190614d0e565b9450612b4b565b8093505050505b919050565b60008183612c149190614cb8565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ce757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cf75750612cf682612f48565b5b9050919050565b612d06611217565b15612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90614971565b60405180910390fd5b612d51838383612fb2565b505050565b612d6083836130c6565b612d6d6000848484612db1565b612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da390614831565b60405180910390fd5b505050565b6000612dd28473ffffffffffffffffffffffffffffffffffffffff16613294565b15612f3b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dfb612331565b8786866040518563ffffffff1660e01b8152600401612e1d9493929190614728565b602060405180830381600087803b158015612e3757600080fd5b505af1925050508015612e6857506040513d601f19601f82011682018060405250810190612e659190613ba6565b60015b612eeb573d8060008114612e98576040519150601f19603f3d011682016040523d82523d6000602084013e612e9d565b606091505b50600081511415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90614831565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f40565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fbd8383836132a7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561300057612ffb816132ac565b61303f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303e5761303d83826132f5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130825761307d81613462565b6130c1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130c0576130bf82826135a5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312d90614a11565b60405180910390fd5b61313f816122c5565b1561317f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317690614871565b60405180910390fd5b61318b60008383612cfe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131db9190614cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133028461136e565b61330c9190614d99565b90506000600760008481526020019081526020016000205490508181146133f1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134769190614d99565b90506000600960008481526020019081526020016000205490506000600883815481106134cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613514577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613589577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135b08361136e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461363090614e95565b90600052602060002090601f0160209004810192826136525760008555613699565b82601f1061366b57805160ff1916838001178555613699565b82800160010185558215613699579182015b8281111561369857825182559160200191906001019061367d565b5b5090506136a691906136aa565b5090565b5b808211156136c35760008160009055506001016136ab565b5090565b60006136da6136d584614bbd565b614b8c565b905080838252602082019050828560208602820111156136f957600080fd5b60005b85811015613729578161370f888261381b565b8452602084019350602083019250506001810190506136fc565b5050509392505050565b600061374661374184614be9565b614b8c565b9050808382526020820190508285602086028201111561376557600080fd5b60005b85811015613795578161377b888261392c565b845260208401935060208301925050600181019050613768565b5050509392505050565b60006137b26137ad84614c15565b614b8c565b9050828152602081018484840111156137ca57600080fd5b6137d5848285614e53565b509392505050565b60006137f06137eb84614c45565b614b8c565b90508281526020810184848401111561380857600080fd5b613813848285614e53565b509392505050565b60008135905061382a8161500e565b92915050565b60008135905061383f81615025565b92915050565b600082601f83011261385657600080fd5b81356138668482602086016136c7565b91505092915050565b600082601f83011261388057600080fd5b8135613890848260208601613733565b91505092915050565b6000813590506138a88161503c565b92915050565b6000813590506138bd81615053565b92915050565b6000815190506138d281615053565b92915050565b600082601f8301126138e957600080fd5b81356138f984826020860161379f565b91505092915050565b600082601f83011261391357600080fd5b81356139238482602086016137dd565b91505092915050565b60008135905061393b8161506a565b92915050565b60006020828403121561395357600080fd5b60006139618482850161381b565b91505092915050565b60006020828403121561397c57600080fd5b600061398a84828501613830565b91505092915050565b600080604083850312156139a657600080fd5b60006139b48582860161381b565b92505060206139c58582860161381b565b9150509250929050565b6000806000606084860312156139e457600080fd5b60006139f28682870161381b565b9350506020613a038682870161381b565b9250506040613a148682870161392c565b9150509250925092565b60008060008060808587031215613a3457600080fd5b6000613a428782880161381b565b9450506020613a538782880161381b565b9350506040613a648782880161392c565b925050606085013567ffffffffffffffff811115613a8157600080fd5b613a8d878288016138d8565b91505092959194509250565b60008060408385031215613aac57600080fd5b6000613aba8582860161381b565b9250506020613acb85828601613899565b9150509250929050565b60008060408385031215613ae857600080fd5b6000613af68582860161381b565b9250506020613b078582860161392c565b9150509250929050565b60008060408385031215613b2457600080fd5b600083013567ffffffffffffffff811115613b3e57600080fd5b613b4a85828601613845565b925050602083013567ffffffffffffffff811115613b6757600080fd5b613b738582860161386f565b9150509250929050565b600060208284031215613b8f57600080fd5b6000613b9d848285016138ae565b91505092915050565b600060208284031215613bb857600080fd5b6000613bc6848285016138c3565b91505092915050565b600060208284031215613be157600080fd5b600082013567ffffffffffffffff811115613bfb57600080fd5b613c0784828501613902565b91505092915050565b600060208284031215613c2257600080fd5b6000613c308482850161392c565b91505092915050565b613c4281614dcd565b82525050565b613c5181614df1565b82525050565b6000613c6282614c75565b613c6c8185614c8b565b9350613c7c818560208601614e62565b613c8581614ffd565b840191505092915050565b6000613c9b82614c80565b613ca58185614c9c565b9350613cb5818560208601614e62565b613cbe81614ffd565b840191505092915050565b6000613cd482614c80565b613cde8185614cad565b9350613cee818560208601614e62565b80840191505092915050565b6000613d07602383614c9c565b91507f63616e206f6e6c79206d696e74207570746f20796f757220726573657276617460008301527f696f6e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d6d601483614c9c565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613dad602083614c9c565b91507f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d656000830152602082019050919050565b6000613ded602b83614c9c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e53603283614c9c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613eb9602683614c9c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f1f601c83614c9c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f5f601a83614c9c565b91507f7265736572766174696f6e206d757374206265206163746976650000000000006000830152602082019050919050565b6000613f9f602483614c9c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614005601983614c9c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614045601f83614c9c565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614085601b83614c9c565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b60006140c5602c83614c9c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061412b601983614c9c565b91507f7265736572766174696f6e2073706163652069732066756c6c000000000000006000830152602082019050919050565b600061416b601083614c9c565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006141ab603883614c9c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614211602a83614c9c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614277602983614c9c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006142dd602083614c9c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061431d602083614c9c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061435d602c83614c9c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143c3602783614c9c565b91507f5265736572766174696f6e2073616c65206d757374206265206163746976652060008301527f746f206d696e74000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614429602083614c9c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614469602083614c9c565b91507f6e6f207265736572766174696f6e7320666f7220796f757220616464726573736000830152602082019050919050565b60006144a9602983614c9c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061450f602f83614c9c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614575602183614c9c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145db603183614c9c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614641602c83614c9c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006146a7602083614c9c565b91507f63616e206f6e6c792072657365727665206265747765656e203120616e6420356000830152602082019050919050565b6146e381614e49565b82525050565b60006146f58285613cc9565b91506147018284613cc9565b91508190509392505050565b60006020820190506147226000830184613c39565b92915050565b600060808201905061473d6000830187613c39565b61474a6020830186613c39565b61475760408301856146da565b81810360608301526147698184613c57565b905095945050505050565b60006020820190506147896000830184613c48565b92915050565b600060208201905081810360008301526147a98184613c90565b905092915050565b600060208201905081810360008301526147ca81613cfa565b9050919050565b600060208201905081810360008301526147ea81613d60565b9050919050565b6000602082019050818103600083015261480a81613da0565b9050919050565b6000602082019050818103600083015261482a81613de0565b9050919050565b6000602082019050818103600083015261484a81613e46565b9050919050565b6000602082019050818103600083015261486a81613eac565b9050919050565b6000602082019050818103600083015261488a81613f12565b9050919050565b600060208201905081810360008301526148aa81613f52565b9050919050565b600060208201905081810360008301526148ca81613f92565b9050919050565b600060208201905081810360008301526148ea81613ff8565b9050919050565b6000602082019050818103600083015261490a81614038565b9050919050565b6000602082019050818103600083015261492a81614078565b9050919050565b6000602082019050818103600083015261494a816140b8565b9050919050565b6000602082019050818103600083015261496a8161411e565b9050919050565b6000602082019050818103600083015261498a8161415e565b9050919050565b600060208201905081810360008301526149aa8161419e565b9050919050565b600060208201905081810360008301526149ca81614204565b9050919050565b600060208201905081810360008301526149ea8161426a565b9050919050565b60006020820190508181036000830152614a0a816142d0565b9050919050565b60006020820190508181036000830152614a2a81614310565b9050919050565b60006020820190508181036000830152614a4a81614350565b9050919050565b60006020820190508181036000830152614a6a816143b6565b9050919050565b60006020820190508181036000830152614a8a8161441c565b9050919050565b60006020820190508181036000830152614aaa8161445c565b9050919050565b60006020820190508181036000830152614aca8161449c565b9050919050565b60006020820190508181036000830152614aea81614502565b9050919050565b60006020820190508181036000830152614b0a81614568565b9050919050565b60006020820190508181036000830152614b2a816145ce565b9050919050565b60006020820190508181036000830152614b4a81614634565b9050919050565b60006020820190508181036000830152614b6a8161469a565b9050919050565b6000602082019050614b8660008301846146da565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614bb357614bb2614fce565b5b8060405250919050565b600067ffffffffffffffff821115614bd857614bd7614fce565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c0457614c03614fce565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c3057614c2f614fce565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614c6057614c5f614fce565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cc382614e49565b9150614cce83614e49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d0357614d02614f41565b5b828201905092915050565b6000614d1982614e49565b9150614d2483614e49565b925082614d3457614d33614f70565b5b828204905092915050565b6000614d4a82614e49565b9150614d5583614e49565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8e57614d8d614f41565b5b828202905092915050565b6000614da482614e49565b9150614daf83614e49565b925082821015614dc257614dc1614f41565b5b828203905092915050565b6000614dd882614e29565b9050919050565b6000614dea82614e29565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e80578082015181840152602081019050614e65565b83811115614e8f576000848401525b50505050565b60006002820490506001821680614ead57607f821691505b60208210811415614ec157614ec0614f9f565b5b50919050565b6000614ed282614e49565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f0557614f04614f41565b5b600182019050919050565b6000614f1b82614e49565b9150614f2683614e49565b925082614f3657614f35614f70565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61501781614dcd565b811461502257600080fd5b50565b61502e81614ddf565b811461503957600080fd5b50565b61504581614df1565b811461505057600080fd5b50565b61505c81614dfd565b811461506757600080fd5b50565b61507381614e49565b811461507e57600080fd5b5056fea2646970667358221220b998b70781023ac08e75c34869ad430147b80faeec1dbe3872f0bcdf237f97ba64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80636c0360eb11610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461087b578063cf235743146108b8578063e985e9c5146108e1578063eb8d24441461091e578063efd0cbf914610949578063f2fde38b146109655761025c565b8063a22cb465146107aa578063b2066f80146107d3578063b88d4fde14610810578063c6787bb114610839578063c71b0e1c146108505761025c565b806388400ea21161010857806388400ea2146106b95780638da5cb5b146106e457806395d89b411461070f5780639a5d140b1461073a578063a035b1fe14610756578063a1448194146107815761025c565b80636c0360eb146105fa57806370a0823114610625578063715018a614610662578063819b25ba146106795780638456cb59146106a25761025c565b80632861b9de116101dd5780634d96ca2b116101a15780634d96ca2b146104d85780634f6ccce71461050357806351cff8d91461054057806355f804b3146105695780635c975abb146105925780636352211e146105bd5761025c565b80632861b9de146104195780632f745c591461044457806334918dfd146104815780633f4ba83a1461049857806342842e0e146104af5761025c565b806316b9c33c1161022457806316b9c33c1461035857806318160ddd146103835780631e211910146103ae57806321bfc1aa146103d957806323b872dd146103f05761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b314610306578063109695231461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613b7d565b61098e565b6040516102959190614774565b60405180910390f35b3480156102aa57600080fd5b506102b36109a0565b6040516102c0919061478f565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613c10565b610a32565b6040516102fd919061470d565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613ad5565b610ab7565b005b34801561033b57600080fd5b5061035660048036038101906103519190613bcf565b610bcf565b005b34801561036457600080fd5b5061036d610c65565b60405161037a9190614774565b60405180910390f35b34801561038f57600080fd5b50610398610c78565b6040516103a59190614b71565b60405180910390f35b3480156103ba57600080fd5b506103c3610c85565b6040516103d09190614b71565b60405180910390f35b3480156103e557600080fd5b506103ee610c8b565b005b3480156103fc57600080fd5b50610417600480360381019061041291906139cf565b610d33565b005b34801561042557600080fd5b5061042e610d93565b60405161043b9190614b71565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613ad5565b610d9d565b6040516104789190614b71565b60405180910390f35b34801561048d57600080fd5b50610496610e42565b005b3480156104a457600080fd5b506104ad610eea565b005b3480156104bb57600080fd5b506104d660048036038101906104d191906139cf565b610f70565b005b3480156104e457600080fd5b506104ed610f90565b6040516104fa919061478f565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190613c10565b61101e565b6040516105379190614b71565b60405180910390f35b34801561054c57600080fd5b506105676004803603810190610562919061396a565b6110b5565b005b34801561057557600080fd5b50610590600480360381019061058b9190613bcf565b611181565b005b34801561059e57600080fd5b506105a7611217565b6040516105b49190614774565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613c10565b61122e565b6040516105f1919061470d565b60405180910390f35b34801561060657600080fd5b5061060f6112e0565b60405161061c919061478f565b60405180910390f35b34801561063157600080fd5b5061064c60048036038101906106479190613941565b61136e565b6040516106599190614b71565b60405180910390f35b34801561066e57600080fd5b50610677611426565b005b34801561068557600080fd5b506106a0600480360381019061069b9190613c10565b6114ae565b005b3480156106ae57600080fd5b506106b76115f0565b005b3480156106c557600080fd5b506106ce611676565b6040516106db9190614774565b60405180910390f35b3480156106f057600080fd5b506106f9611689565b604051610706919061470d565b60405180910390f35b34801561071b57600080fd5b506107246116b3565b604051610731919061478f565b60405180910390f35b610754600480360381019061074f9190613c10565b611745565b005b34801561076257600080fd5b5061076b611950565b6040516107789190614b71565b60405180910390f35b34801561078d57600080fd5b506107a860048036038101906107a39190613ad5565b611956565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190613a99565b6119e0565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190613941565b611b61565b6040516108079190614b71565b60405180910390f35b34801561081c57600080fd5b5061083760048036038101906108329190613a1e565b611baa565b005b34801561084557600080fd5b5061084e611c0c565b005b34801561085c57600080fd5b50610865611cb4565b6040516108729190614b71565b60405180910390f35b34801561088757600080fd5b506108a2600480360381019061089d9190613c10565b611cba565b6040516108af919061478f565b60405180910390f35b3480156108c457600080fd5b506108df60048036038101906108da9190613b11565b611d61565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613993565b611f19565b6040516109159190614774565b60405180910390f35b34801561092a57600080fd5b50610933611fad565b6040516109409190614774565b60405180910390f35b610963600480360381019061095e9190613c10565b611fc0565b005b34801561097157600080fd5b5061098c60048036038101906109879190613941565b612153565b005b60006109998261224b565b9050919050565b6060600080546109af90614e95565b80601f01602080910402602001604051908101604052809291908181526020018280546109db90614e95565b8015610a285780601f106109fd57610100808354040283529160200191610a28565b820191906000526020600020905b815481529060010190602001808311610a0b57829003601f168201915b5050505050905090565b6000610a3d826122c5565b610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390614a31565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac28261122e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614af1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b52612331565b73ffffffffffffffffffffffffffffffffffffffff161480610b815750610b8081610b7b612331565b611f19565b5b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790614991565b60405180910390fd5b610bca8383612339565b505050565b610bd7612331565b73ffffffffffffffffffffffffffffffffffffffff16610bf5611689565b73ffffffffffffffffffffffffffffffffffffffff1614610c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4290614a71565b60405180910390fd5b80600b9080519060200190610c61929190613624565b5050565b601060019054906101000a900460ff1681565b6000600880549050905090565b600e5481565b610c93612331565b73ffffffffffffffffffffffffffffffffffffffff16610cb1611689565b73ffffffffffffffffffffffffffffffffffffffff1614610d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfe90614a71565b60405180910390fd5b601060019054906101000a900460ff1615601060016101000a81548160ff021916908315150217905550565b610d44610d3e612331565b826123f2565b610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90614b11565b60405180910390fd5b610d8e8383836124d0565b505050565b6000600f54905090565b6000610da88361136e565b8210610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614811565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e4a612331565b73ffffffffffffffffffffffffffffffffffffffff16610e68611689565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614a71565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b610ef2612331565b73ffffffffffffffffffffffffffffffffffffffff16610f10611689565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90614a71565b60405180910390fd5b610f6e61272c565b565b610f8b83838360405180602001604052806000815250611baa565b505050565b600b8054610f9d90614e95565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc990614e95565b80156110165780601f10610feb57610100808354040283529160200191611016565b820191906000526020600020905b815481529060010190602001808311610ff957829003601f168201915b505050505081565b6000611028610c78565b8210611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090614b31565b60405180910390fd5b600882815481106110a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6110bd612331565b73ffffffffffffffffffffffffffffffffffffffff166110db611689565b73ffffffffffffffffffffffffffffffffffffffff1614611131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112890614a71565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561117c573d6000803e3d6000fd5b505050565b611189612331565b73ffffffffffffffffffffffffffffffffffffffff166111a7611689565b73ffffffffffffffffffffffffffffffffffffffff16146111fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f490614a71565b60405180910390fd5b8060119080519060200190611213929190613624565b5050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce906149d1565b60405180910390fd5b80915050919050565b601180546112ed90614e95565b80601f016020809104026020016040519081016040528092919081815260200182805461131990614e95565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906149b1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61142e612331565b73ffffffffffffffffffffffffffffffffffffffff1661144c611689565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614a71565b60405180910390fd5b6114ac60006127ce565b565b601060019054906101000a900460ff166114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490614891565b60405180910390fd5b6005811115801561150f575060018110155b61154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590614b51565b60405180910390fd5b612710600f541115611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158c90614951565b60405180910390fd5b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600f546115e79190614cb8565b600f8190555050565b6115f8612331565b73ffffffffffffffffffffffffffffffffffffffff16611616611689565b73ffffffffffffffffffffffffffffffffffffffff161461166c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166390614a71565b60405180910390fd5b611674612894565b565b601060029054906101000a900460ff1681565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116c290614e95565b80601f01602080910402602001604051908101604052809291908181526020018280546116ee90614e95565b801561173b5780601f106117105761010080835404028352916020019161173b565b820191906000526020600020905b81548152906001019060200180831161171e57829003601f168201915b5050505050905090565b601060029054906101000a900460ff16611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614a51565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290614a91565b60405180910390fd5b8082111561185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906147b1565b60405180910390fd5b3461187483600c5461293790919063ffffffff16565b11156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906148f1565b60405180910390fd5b60005b828110156118fc5760006118ca610c78565b9050600e546118d7610c78565b10156118e8576118e7338261294d565b5b5080806118f490614ec7565b9150506118b8565b5081816119099190614d99565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600c5481565b61195e612331565b73ffffffffffffffffffffffffffffffffffffffff1661197c611689565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614a71565b60405180910390fd5b6119dc828261294d565b5050565b6119e8612331565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d906148d1565b60405180910390fd5b8060056000611a63612331565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b10612331565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b559190614774565b60405180910390a35050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bbb611bb5612331565b836123f2565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190614b11565b60405180910390fd5b611c068484848461296b565b50505050565b611c14612331565b73ffffffffffffffffffffffffffffffffffffffff16611c32611689565b73ffffffffffffffffffffffffffffffffffffffff1614611c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7f90614a71565b60405180910390fd5b601060029054906101000a900460ff1615601060026101000a81548160ff021916908315150217905550565b600f5481565b6060611cc5826122c5565b611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90614ad1565b60405180910390fd5b6000611d0e6129c7565b90506000815111611d2e5760405180602001604052806000815250611d59565b80611d3884612a59565b604051602001611d499291906146e9565b6040516020818303038152906040525b915050919050565b611d69612331565b73ffffffffffffffffffffffffffffffffffffffff16611d87611689565b73ffffffffffffffffffffffffffffffffffffffff1614611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490614a71565b60405180910390fd5b60005b8251811015611f1457818181518110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600d6000858481518110611e67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818181518110611ee6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f54611efb9190614cb8565b600f819055508080611f0c90614ec7565b915050611de0565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b601060009054906101000a900460ff1661200f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200690614911565b60405180910390fd5b6005811115612053576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204a906147f1565b60405180910390fd5b600e5461207082612062610c78565b612c0690919063ffffffff16565b11156120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a8906149f1565b60405180910390fd5b346120c782600c5461293790919063ffffffff16565b1115612108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ff906148f1565b60405180910390fd5b60005b8181101561214f57600061211d610c78565b9050600e5461212a610c78565b101561213b5761213a338261294d565b5b50808061214790614ec7565b91505061210b565b5050565b61215b612331565b73ffffffffffffffffffffffffffffffffffffffff16612179611689565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c690614a71565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561223f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223690614851565b60405180910390fd5b612248816127ce565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122be57506122bd82612c1c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123ac8361122e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123fd826122c5565b61243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243390614931565b60405180910390fd5b60006124478361122e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124b657508373ffffffffffffffffffffffffffffffffffffffff1661249e84610a32565b73ffffffffffffffffffffffffffffffffffffffff16145b806124c757506124c68185611f19565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166124f08261122e565b73ffffffffffffffffffffffffffffffffffffffff1614612546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253d90614ab1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ad906148b1565b60405180910390fd5b6125c1838383612cfe565b6125cc600082612339565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261c9190614d99565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126739190614cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612734611217565b612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a906147d1565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6127b7612331565b6040516127c4919061470d565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61289c611217565b156128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d390614971565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612920612331565b60405161292d919061470d565b60405180910390a1565b600081836129459190614d3f565b905092915050565b612967828260405180602001604052806000815250612d56565b5050565b6129768484846124d0565b61298284848484612db1565b6129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b890614831565b60405180910390fd5b50505050565b6060601180546129d690614e95565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0290614e95565b8015612a4f5780601f10612a2457610100808354040283529160200191612a4f565b820191906000526020600020905b815481529060010190602001808311612a3257829003601f168201915b5050505050905090565b60606000821415612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c01565b600082905060005b60008214612ad3578080612abc90614ec7565b915050600a82612acc9190614d0e565b9150612aa9565b60008167ffffffffffffffff811115612b15577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b475781602001600182028036833780820191505090505b5090505b60008514612bfa57600182612b609190614d99565b9150600a85612b6f9190614f10565b6030612b7b9190614cb8565b60f81b818381518110612bb7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bf39190614d0e565b9450612b4b565b8093505050505b919050565b60008183612c149190614cb8565b905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ce757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cf75750612cf682612f48565b5b9050919050565b612d06611217565b15612d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3d90614971565b60405180910390fd5b612d51838383612fb2565b505050565b612d6083836130c6565b612d6d6000848484612db1565b612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da390614831565b60405180910390fd5b505050565b6000612dd28473ffffffffffffffffffffffffffffffffffffffff16613294565b15612f3b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612dfb612331565b8786866040518563ffffffff1660e01b8152600401612e1d9493929190614728565b602060405180830381600087803b158015612e3757600080fd5b505af1925050508015612e6857506040513d601f19601f82011682018060405250810190612e659190613ba6565b60015b612eeb573d8060008114612e98576040519150601f19603f3d011682016040523d82523d6000602084013e612e9d565b606091505b50600081511415612ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda90614831565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f40565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612fbd8383836132a7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561300057612ffb816132ac565b61303f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461303e5761303d83826132f5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130825761307d81613462565b6130c1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130c0576130bf82826135a5565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312d90614a11565b60405180910390fd5b61313f816122c5565b1561317f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317690614871565b60405180910390fd5b61318b60008383612cfe565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131db9190614cb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133028461136e565b61330c9190614d99565b90506000600760008481526020019081526020016000205490508181146133f1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134769190614d99565b90506000600960008481526020019081526020016000205490506000600883815481106134cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613514577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613589577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006135b08361136e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461363090614e95565b90600052602060002090601f0160209004810192826136525760008555613699565b82601f1061366b57805160ff1916838001178555613699565b82800160010185558215613699579182015b8281111561369857825182559160200191906001019061367d565b5b5090506136a691906136aa565b5090565b5b808211156136c35760008160009055506001016136ab565b5090565b60006136da6136d584614bbd565b614b8c565b905080838252602082019050828560208602820111156136f957600080fd5b60005b85811015613729578161370f888261381b565b8452602084019350602083019250506001810190506136fc565b5050509392505050565b600061374661374184614be9565b614b8c565b9050808382526020820190508285602086028201111561376557600080fd5b60005b85811015613795578161377b888261392c565b845260208401935060208301925050600181019050613768565b5050509392505050565b60006137b26137ad84614c15565b614b8c565b9050828152602081018484840111156137ca57600080fd5b6137d5848285614e53565b509392505050565b60006137f06137eb84614c45565b614b8c565b90508281526020810184848401111561380857600080fd5b613813848285614e53565b509392505050565b60008135905061382a8161500e565b92915050565b60008135905061383f81615025565b92915050565b600082601f83011261385657600080fd5b81356138668482602086016136c7565b91505092915050565b600082601f83011261388057600080fd5b8135613890848260208601613733565b91505092915050565b6000813590506138a88161503c565b92915050565b6000813590506138bd81615053565b92915050565b6000815190506138d281615053565b92915050565b600082601f8301126138e957600080fd5b81356138f984826020860161379f565b91505092915050565b600082601f83011261391357600080fd5b81356139238482602086016137dd565b91505092915050565b60008135905061393b8161506a565b92915050565b60006020828403121561395357600080fd5b60006139618482850161381b565b91505092915050565b60006020828403121561397c57600080fd5b600061398a84828501613830565b91505092915050565b600080604083850312156139a657600080fd5b60006139b48582860161381b565b92505060206139c58582860161381b565b9150509250929050565b6000806000606084860312156139e457600080fd5b60006139f28682870161381b565b9350506020613a038682870161381b565b9250506040613a148682870161392c565b9150509250925092565b60008060008060808587031215613a3457600080fd5b6000613a428782880161381b565b9450506020613a538782880161381b565b9350506040613a648782880161392c565b925050606085013567ffffffffffffffff811115613a8157600080fd5b613a8d878288016138d8565b91505092959194509250565b60008060408385031215613aac57600080fd5b6000613aba8582860161381b565b9250506020613acb85828601613899565b9150509250929050565b60008060408385031215613ae857600080fd5b6000613af68582860161381b565b9250506020613b078582860161392c565b9150509250929050565b60008060408385031215613b2457600080fd5b600083013567ffffffffffffffff811115613b3e57600080fd5b613b4a85828601613845565b925050602083013567ffffffffffffffff811115613b6757600080fd5b613b738582860161386f565b9150509250929050565b600060208284031215613b8f57600080fd5b6000613b9d848285016138ae565b91505092915050565b600060208284031215613bb857600080fd5b6000613bc6848285016138c3565b91505092915050565b600060208284031215613be157600080fd5b600082013567ffffffffffffffff811115613bfb57600080fd5b613c0784828501613902565b91505092915050565b600060208284031215613c2257600080fd5b6000613c308482850161392c565b91505092915050565b613c4281614dcd565b82525050565b613c5181614df1565b82525050565b6000613c6282614c75565b613c6c8185614c8b565b9350613c7c818560208601614e62565b613c8581614ffd565b840191505092915050565b6000613c9b82614c80565b613ca58185614c9c565b9350613cb5818560208601614e62565b613cbe81614ffd565b840191505092915050565b6000613cd482614c80565b613cde8185614cad565b9350613cee818560208601614e62565b80840191505092915050565b6000613d07602383614c9c565b91507f63616e206f6e6c79206d696e74207570746f20796f757220726573657276617460008301527f696f6e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d6d601483614c9c565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000613dad602083614c9c565b91507f43616e206f6e6c79206d696e74203520746f6b656e7320617420612074696d656000830152602082019050919050565b6000613ded602b83614c9c565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613e53603283614c9c565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613eb9602683614c9c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f1f601c83614c9c565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613f5f601a83614c9c565b91507f7265736572766174696f6e206d757374206265206163746976650000000000006000830152602082019050919050565b6000613f9f602483614c9c565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614005601983614c9c565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614045601f83614c9c565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614085601b83614c9c565b91507f53616c65206d7573742062652061637469766520746f206d696e7400000000006000830152602082019050919050565b60006140c5602c83614c9c565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061412b601983614c9c565b91507f7265736572766174696f6e2073706163652069732066756c6c000000000000006000830152602082019050919050565b600061416b601083614c9c565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b60006141ab603883614c9c565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614211602a83614c9c565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614277602983614c9c565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006142dd602083614c9c565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b600061431d602083614c9c565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061435d602c83614c9c565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143c3602783614c9c565b91507f5265736572766174696f6e2073616c65206d757374206265206163746976652060008301527f746f206d696e74000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614429602083614c9c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614469602083614c9c565b91507f6e6f207265736572766174696f6e7320666f7220796f757220616464726573736000830152602082019050919050565b60006144a9602983614c9c565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061450f602f83614c9c565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614575602183614c9c565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145db603183614c9c565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614641602c83614c9c565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006146a7602083614c9c565b91507f63616e206f6e6c792072657365727665206265747765656e203120616e6420356000830152602082019050919050565b6146e381614e49565b82525050565b60006146f58285613cc9565b91506147018284613cc9565b91508190509392505050565b60006020820190506147226000830184613c39565b92915050565b600060808201905061473d6000830187613c39565b61474a6020830186613c39565b61475760408301856146da565b81810360608301526147698184613c57565b905095945050505050565b60006020820190506147896000830184613c48565b92915050565b600060208201905081810360008301526147a98184613c90565b905092915050565b600060208201905081810360008301526147ca81613cfa565b9050919050565b600060208201905081810360008301526147ea81613d60565b9050919050565b6000602082019050818103600083015261480a81613da0565b9050919050565b6000602082019050818103600083015261482a81613de0565b9050919050565b6000602082019050818103600083015261484a81613e46565b9050919050565b6000602082019050818103600083015261486a81613eac565b9050919050565b6000602082019050818103600083015261488a81613f12565b9050919050565b600060208201905081810360008301526148aa81613f52565b9050919050565b600060208201905081810360008301526148ca81613f92565b9050919050565b600060208201905081810360008301526148ea81613ff8565b9050919050565b6000602082019050818103600083015261490a81614038565b9050919050565b6000602082019050818103600083015261492a81614078565b9050919050565b6000602082019050818103600083015261494a816140b8565b9050919050565b6000602082019050818103600083015261496a8161411e565b9050919050565b6000602082019050818103600083015261498a8161415e565b9050919050565b600060208201905081810360008301526149aa8161419e565b9050919050565b600060208201905081810360008301526149ca81614204565b9050919050565b600060208201905081810360008301526149ea8161426a565b9050919050565b60006020820190508181036000830152614a0a816142d0565b9050919050565b60006020820190508181036000830152614a2a81614310565b9050919050565b60006020820190508181036000830152614a4a81614350565b9050919050565b60006020820190508181036000830152614a6a816143b6565b9050919050565b60006020820190508181036000830152614a8a8161441c565b9050919050565b60006020820190508181036000830152614aaa8161445c565b9050919050565b60006020820190508181036000830152614aca8161449c565b9050919050565b60006020820190508181036000830152614aea81614502565b9050919050565b60006020820190508181036000830152614b0a81614568565b9050919050565b60006020820190508181036000830152614b2a816145ce565b9050919050565b60006020820190508181036000830152614b4a81614634565b9050919050565b60006020820190508181036000830152614b6a8161469a565b9050919050565b6000602082019050614b8660008301846146da565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614bb357614bb2614fce565b5b8060405250919050565b600067ffffffffffffffff821115614bd857614bd7614fce565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c0457614c03614fce565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614c3057614c2f614fce565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614c6057614c5f614fce565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614cc382614e49565b9150614cce83614e49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d0357614d02614f41565b5b828201905092915050565b6000614d1982614e49565b9150614d2483614e49565b925082614d3457614d33614f70565b5b828204905092915050565b6000614d4a82614e49565b9150614d5583614e49565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d8e57614d8d614f41565b5b828202905092915050565b6000614da482614e49565b9150614daf83614e49565b925082821015614dc257614dc1614f41565b5b828203905092915050565b6000614dd882614e29565b9050919050565b6000614dea82614e29565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e80578082015181840152602081019050614e65565b83811115614e8f576000848401525b50505050565b60006002820490506001821680614ead57607f821691505b60208210811415614ec157614ec0614f9f565b5b50919050565b6000614ed282614e49565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f0557614f04614f41565b5b600182019050919050565b6000614f1b82614e49565b9150614f2683614e49565b925082614f3657614f35614f70565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61501781614dcd565b811461502257600080fd5b50565b61502e81614ddf565b811461503957600080fd5b50565b61504581614df1565b811461505057600080fd5b50565b61505c81614dfd565b811461506757600080fd5b50565b61507381614e49565b811461507e57600080fd5b5056fea2646970667358221220b998b70781023ac08e75c34869ad430147b80faeec1dbe3872f0bcdf237f97ba64736f6c63430008000033

Deployed Bytecode Sourcemap

52270:4468:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56523:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21563:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23122:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22645:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53223:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52657:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35268:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52533:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52967:110;;;;;;;;;;;;;:::i;:::-;;24012:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54621:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34936:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52866:89;;;;;;;;;;;;;:::i;:::-;;53786:65;;;;;;;;;;;;;:::i;:::-;;24422:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52394:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35458:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53560:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53460:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41833:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21257:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52759:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20987:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44651:94;;;;;;;;;;;;;:::i;:::-;;54124:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53717:61;;;;;;;;;;;;;:::i;:::-;;52703:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44000:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21732:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54730:726;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52419:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56105:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23415:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54506:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24678:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53089:122;;;;;;;;;;;;;:::i;:::-;;52573:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21907:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53859:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23781:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52618:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55468:629;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44900:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56523:212;56662:4;56691:36;56715:11;56691:23;:36::i;:::-;56684:43;;56523:212;;;:::o;21563:100::-;21617:13;21650:5;21643:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21563:100;:::o;23122:221::-;23198:7;23226:16;23234:7;23226;:16::i;:::-;23218:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23311:15;:24;23327:7;23311:24;;;;;;;;;;;;;;;;;;;;;23304:31;;23122:221;;;:::o;22645:411::-;22726:13;22742:23;22757:7;22742:14;:23::i;:::-;22726:39;;22790:5;22784:11;;:2;:11;;;;22776:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22884:5;22868:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22893:37;22910:5;22917:12;:10;:12::i;:::-;22893:16;:37::i;:::-;22868:62;22846:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23027:21;23036:2;23040:7;23027:8;:21::i;:::-;22645:411;;;:::o;53223:114::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53315:14:::1;53308:4;:21;;;;;;;;;;;;:::i;:::-;;53223:114:::0;:::o;52657:39::-;;;;;;;;;;;;;:::o;35268:113::-;35329:7;35356:10;:17;;;;35349:24;;35268:113;:::o;52533:33::-;;;;:::o;52967:110::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53050:19:::1;;;;;;;;;;;53049:20;53027:19;;:42;;;;;;;;;;;;;;;;;;52967:110::o:0;24012:339::-;24207:41;24226:12;:10;:12::i;:::-;24240:7;24207:18;:41::i;:::-;24199:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24315:28;24325:4;24331:2;24335:7;24315:9;:28::i;:::-;24012:339;;;:::o;54621:97::-;54670:7;54697:13;;54690:20;;54621:97;:::o;34936:256::-;35033:7;35069:23;35086:5;35069:16;:23::i;:::-;35061:5;:31;35053:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35158:12;:19;35171:5;35158:19;;;;;;;;;;;;;;;:26;35178:5;35158:26;;;;;;;;;;;;35151:33;;34936:256;;;;:::o;52866:89::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52935:12:::1;;;;;;;;;;;52934:13;52919:12;;:28;;;;;;;;;;;;;;;;;;52866:89::o:0;53786:65::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53833:10:::1;:8;:10::i;:::-;53786:65::o:0;24422:185::-;24560:39;24577:4;24583:2;24587:7;24560:39;;;;;;;;;;;;:16;:39::i;:::-;24422:185;;;:::o;52394:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35458:233::-;35533:7;35569:30;:28;:30::i;:::-;35561:5;:38;35553:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35666:10;35677:5;35666:17;;;;;;;;;;;;;;;;;;;;;;;;35659:24;;35458:233;;;:::o;53560:149::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53630:12:::1;53645:21;53630:36;;53677:6;:15;;:24;53693:7;53677:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;44291:1;53560:149:::0;:::o;53460:88::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53537:3:::1;53527:7;:13;;;;;;;;;;;;:::i;:::-;;53460:88:::0;:::o;41833:86::-;41880:4;41904:7;;;;;;;;;;;41897:14;;41833:86;:::o;21257:239::-;21329:7;21349:13;21365:7;:16;21373:7;21365:16;;;;;;;;;;;;;;;;;;;;;21349:32;;21417:1;21400:19;;:5;:19;;;;21392:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21483:5;21476:12;;;21257:239;;;:::o;52759:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20987:208::-;21059:7;21104:1;21087:19;;:5;:19;;;;21079:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21171:9;:16;21181:5;21171:16;;;;;;;;;;;;;;;;21164:23;;20987:208;;;:::o;44651:94::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44716:21:::1;44734:1;44716:9;:21::i;:::-;44651:94::o:0;54124:370::-;54184:19;;;;;;;;;;;54176:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54264:1;54253:7;:12;;:28;;;;;54280:1;54269:7;:12;;54253:28;54245:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54354:5;54337:13;;:22;;54329:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54427:7;54400:12;:24;54413:10;54400:24;;;;;;;;;;;;;;;:34;;;;54478:7;54462:13;;:23;;;;:::i;:::-;54445:13;:41;;;;54124:370;:::o;53717:61::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53762:8:::1;:6;:8::i;:::-;53717:61::o:0;52703:43::-;;;;;;;;;;;;;:::o;44000:87::-;44046:7;44073:6;;;;;;;;;;;44066:13;;44000:87;:::o;21732:104::-;21788:13;21821:7;21814:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21732:104;:::o;54730:726::-;54807:23;;;;;;;;;;;54799:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54885:11;54899:12;:24;54912:10;54899:24;;;;;;;;;;;;;;;;54885:38;;54948:1;54942:3;:7;54934:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55020:3;55005:11;:18;;54997:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55108:9;55082:22;55092:11;55082:5;;:9;;:22;;;;:::i;:::-;:35;;55074:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;55178:6;55174:208;55194:11;55190:1;:15;55174:208;;;55227:14;55244:13;:11;:13::i;:::-;55227:30;;55292:10;;55276:13;:11;:13::i;:::-;:26;55272:99;;;55323:32;55333:10;55345:9;55323;:32::i;:::-;55272:99;55174:208;55207:3;;;;;:::i;:::-;;;;55174:208;;;;55436:11;55430:3;:17;;;;:::i;:::-;55402:12;:24;55415:10;55402:24;;;;;;;;;;;;;;;:46;;;;54730:726;;:::o;52419:40::-;;;;:::o;56105:105::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56180:22:::1;56190:2;56194:7;56180:9;:22::i;:::-;56105:105:::0;;:::o;23415:295::-;23530:12;:10;:12::i;:::-;23518:24;;:8;:24;;;;23510:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23630:8;23585:18;:32;23604:12;:10;:12::i;:::-;23585:32;;;;;;;;;;;;;;;:42;23618:8;23585:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23683:8;23654:48;;23669:12;:10;:12::i;:::-;23654:48;;;23693:8;23654:48;;;;;;:::i;:::-;;;;;;;;23415:295;;:::o;54506:107::-;54563:7;54589:12;:16;54602:2;54589:16;;;;;;;;;;;;;;;;54582:23;;54506:107;;;:::o;24678:328::-;24853:41;24872:12;:10;:12::i;:::-;24886:7;24853:18;:41::i;:::-;24845:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24959:39;24973:4;24979:2;24983:7;24992:5;24959:13;:39::i;:::-;24678:328;;;;:::o;53089:122::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53180:23:::1;;;;;;;;;;;53179:24;53153:23;;:50;;;;;;;;;;;;;;;;;;53089:122::o:0;52573:32::-;;;;:::o;21907:334::-;21980:13;22014:16;22022:7;22014;:16::i;:::-;22006:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22095:21;22119:10;:8;:10::i;:::-;22095:34;;22171:1;22153:7;22147:21;:25;:86;;;;;;;;;;;;;;;;;22199:7;22208:18;:7;:16;:18::i;:::-;22182:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22147:86;22140:93;;;21907:334;;;:::o;53859:253::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53955:6:::1;53951:154;53971:3;:10;53967:1;:14;53951:154;;;54026:7;54034:1;54026:10;;;;;;;;;;;;;;;;;;;;;;54003:12;:20;54016:3;54020:1;54016:6;;;;;;;;;;;;;;;;;;;;;;54003:20;;;;;;;;;;;;;;;:33;;;;54083:7;54091:1;54083:10;;;;;;;;;;;;;;;;;;;;;;54067:13;;:26;;;;:::i;:::-;54051:13;:42;;;;53983:3;;;;;:::i;:::-;;;;53951:154;;;;53859:253:::0;;:::o;23781:164::-;23878:4;23902:18;:25;23921:5;23902:25;;;;;;;;;;;;;;;:35;23928:8;23902:35;;;;;;;;;;;;;;;;;;;;;;;;;23895:42;;23781:164;;;;:::o;52618:32::-;;;;;;;;;;;;;:::o;55468:629::-;55543:12;;;;;;;;;;;55535:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;55624:1;55606:14;:19;;55598:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55718:10;;55681:33;55699:14;55681:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;55673:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;55813:9;55784:25;55794:14;55784:5;;:9;;:25;;;;:::i;:::-;:38;;55776:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55883:6;55879:211;55899:14;55895:1;:18;55879:211;;;55935:14;55952:13;:11;:13::i;:::-;55935:30;;56000:10;;55984:13;:11;:13::i;:::-;:26;55980:99;;;56031:32;56041:10;56053:9;56031;:32::i;:::-;55980:99;55879:211;55915:3;;;;;:::i;:::-;;;;55879:211;;;;55468:629;:::o;44900:192::-;44231:12;:10;:12::i;:::-;44220:23;;:7;:5;:7::i;:::-;:23;;;44212:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45009:1:::1;44989:22;;:8;:22;;;;44981:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45065:19;45075:8;45065:9;:19::i;:::-;44900:192:::0;:::o;34628:224::-;34730:4;34769:35;34754:50;;;:11;:50;;;;:90;;;;34808:36;34832:11;34808:23;:36::i;:::-;34754:90;34747:97;;34628:224;;;:::o;26516:127::-;26581:4;26633:1;26605:30;;:7;:16;26613:7;26605:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26598:37;;26516:127;;;:::o;16089:98::-;16142:7;16169:10;16162:17;;16089:98;:::o;30498:174::-;30600:2;30573:15;:24;30589:7;30573:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30656:7;30652:2;30618:46;;30627:23;30642:7;30627:14;:23::i;:::-;30618:46;;;;;;;;;;;;30498:174;;:::o;26810:348::-;26903:4;26928:16;26936:7;26928;:16::i;:::-;26920:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27004:13;27020:23;27035:7;27020:14;:23::i;:::-;27004:39;;27073:5;27062:16;;:7;:16;;;:51;;;;27106:7;27082:31;;:20;27094:7;27082:11;:20::i;:::-;:31;;;27062:51;:87;;;;27117:32;27134:5;27141:7;27117:16;:32::i;:::-;27062:87;27054:96;;;26810:348;;;;:::o;29802:578::-;29961:4;29934:31;;:23;29949:7;29934:14;:23::i;:::-;:31;;;29926:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30044:1;30030:16;;:2;:16;;;;30022:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30100:39;30121:4;30127:2;30131:7;30100:20;:39::i;:::-;30204:29;30221:1;30225:7;30204:8;:29::i;:::-;30265:1;30246:9;:15;30256:4;30246:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30294:1;30277:9;:13;30287:2;30277:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30325:2;30306:7;:16;30314:7;30306:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30364:7;30360:2;30345:27;;30354:4;30345:27;;;;;;;;;;;;29802:578;;;:::o;42892:120::-;42436:8;:6;:8::i;:::-;42428:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;42961:5:::1;42951:7;;:15;;;;;;;;;;;;;;;;;;42982:22;42991:12;:10;:12::i;:::-;42982:22;;;;;;:::i;:::-;;;;;;;;42892:120::o:0;45100:173::-;45156:16;45175:6;;;;;;;;;;;45156:25;;45201:8;45192:6;;:17;;;;;;;;;;;;;;;;;;45256:8;45225:40;;45246:8;45225:40;;;;;;;;;;;;45100:173;;:::o;42633:118::-;42159:8;:6;:8::i;:::-;42158:9;42150:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42703:4:::1;42693:7;;:14;;;;;;;;;;;;;;;;;;42723:20;42730:12;:10;:12::i;:::-;42723:20;;;;;;:::i;:::-;;;;;;;;42633:118::o:0;48795:98::-;48853:7;48884:1;48880;:5;;;;:::i;:::-;48873:12;;48795:98;;;;:::o;27500:110::-;27576:26;27586:2;27590:7;27576:26;;;;;;;;;;;;:9;:26::i;:::-;27500:110;;:::o;25888:315::-;26045:28;26055:4;26061:2;26065:7;26045:9;:28::i;:::-;26092:48;26115:4;26121:2;26125:7;26134:5;26092:22;:48::i;:::-;26084:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25888:315;;;;:::o;53350:100::-;53402:13;53435:7;53428:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53350:100;:::o;16599:723::-;16655:13;16885:1;16876:5;:10;16872:53;;;16903:10;;;;;;;;;;;;;;;;;;;;;16872:53;16935:12;16950:5;16935:20;;16966:14;16991:78;17006:1;16998:4;:9;16991:78;;17024:8;;;;;:::i;:::-;;;;17055:2;17047:10;;;;;:::i;:::-;;;16991:78;;;17079:19;17111:6;17101:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17079:39;;17129:154;17145:1;17136:5;:10;17129:154;;17173:1;17163:11;;;;;:::i;:::-;;;17240:2;17232:5;:10;;;;:::i;:::-;17219:2;:24;;;;:::i;:::-;17206:39;;17189:6;17196;17189:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17269:2;17260:11;;;;;:::i;:::-;;;17129:154;;;17307:6;17293:21;;;;;16599:723;;;;:::o;48057:98::-;48115:7;48146:1;48142;:5;;;;:::i;:::-;48135:12;;48057:98;;;;:::o;20618:305::-;20720:4;20772:25;20757:40;;;:11;:40;;;;:105;;;;20829:33;20814:48;;;:11;:48;;;;20757:105;:158;;;;20879:36;20903:11;20879:23;:36::i;:::-;20757:158;20737:178;;20618:305;;;:::o;56218:227::-;42159:8;:6;:8::i;:::-;42158:9;42150:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56392:45:::1;56419:4;56425:2;56429:7;56392:26;:45::i;:::-;56218:227:::0;;;:::o;27837:321::-;27967:18;27973:2;27977:7;27967:5;:18::i;:::-;28018:54;28049:1;28053:2;28057:7;28066:5;28018:22;:54::i;:::-;27996:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27837:321;;;:::o;31237:799::-;31392:4;31413:15;:2;:13;;;:15::i;:::-;31409:620;;;31465:2;31449:36;;;31486:12;:10;:12::i;:::-;31500:4;31506:7;31515:5;31449:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31445:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31708:1;31691:6;:13;:18;31687:272;;;31734:60;;;;;;;;;;:::i;:::-;;;;;;;;31687:272;31909:6;31903:13;31894:6;31890:2;31886:15;31879:38;31445:529;31582:41;;;31572:51;;;:6;:51;;;;31565:58;;;;;31409:620;32013:4;32006:11;;31237:799;;;;;;;:::o;19139:157::-;19224:4;19263:25;19248:40;;;:11;:40;;;;19241:47;;19139:157;;;:::o;36304:589::-;36448:45;36475:4;36481:2;36485:7;36448:26;:45::i;:::-;36526:1;36510:18;;:4;:18;;;36506:187;;;36545:40;36577:7;36545:31;:40::i;:::-;36506:187;;;36615:2;36607:10;;:4;:10;;;36603:90;;36634:47;36667:4;36673:7;36634:32;:47::i;:::-;36603:90;36506:187;36721:1;36707:16;;:2;:16;;;36703:183;;;36740:45;36777:7;36740:36;:45::i;:::-;36703:183;;;36813:4;36807:10;;:2;:10;;;36803:83;;36834:40;36862:2;36866:7;36834:27;:40::i;:::-;36803:83;36703:183;36304:589;;;:::o;28494:382::-;28588:1;28574:16;;:2;:16;;;;28566:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28647:16;28655:7;28647;:16::i;:::-;28646:17;28638:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28709:45;28738:1;28742:2;28746:7;28709:20;:45::i;:::-;28784:1;28767:9;:13;28777:2;28767:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28815:2;28796:7;:16;28804:7;28796:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28860:7;28856:2;28835:33;;28852:1;28835:33;;;;;;;;;;;;28494:382;;:::o;8148:387::-;8208:4;8416:12;8483:7;8471:20;8463:28;;8526:1;8519:4;:8;8512:15;;;8148:387;;;:::o;32608:126::-;;;;:::o;37616:164::-;37720:10;:17;;;;37693:15;:24;37709:7;37693:24;;;;;;;;;;;:44;;;;37748:10;37764:7;37748:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37616:164;:::o;38407:988::-;38673:22;38723:1;38698:22;38715:4;38698:16;:22::i;:::-;:26;;;;:::i;:::-;38673:51;;38735:18;38756:17;:26;38774:7;38756:26;;;;;;;;;;;;38735:47;;38903:14;38889:10;:28;38885:328;;38934:19;38956:12;:18;38969:4;38956:18;;;;;;;;;;;;;;;:34;38975:14;38956:34;;;;;;;;;;;;38934:56;;39040:11;39007:12;:18;39020:4;39007:18;;;;;;;;;;;;;;;:30;39026:10;39007:30;;;;;;;;;;;:44;;;;39157:10;39124:17;:30;39142:11;39124:30;;;;;;;;;;;:43;;;;38885:328;;39309:17;:26;39327:7;39309:26;;;;;;;;;;;39302:33;;;39353:12;:18;39366:4;39353:18;;;;;;;;;;;;;;;:34;39372:14;39353:34;;;;;;;;;;;39346:41;;;38407:988;;;;:::o;39690:1079::-;39943:22;39988:1;39968:10;:17;;;;:21;;;;:::i;:::-;39943:46;;40000:18;40021:15;:24;40037:7;40021:24;;;;;;;;;;;;40000:45;;40372:19;40394:10;40405:14;40394:26;;;;;;;;;;;;;;;;;;;;;;;;40372:48;;40458:11;40433:10;40444;40433:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40569:10;40538:15;:28;40554:11;40538:28;;;;;;;;;;;:41;;;;40710:15;:24;40726:7;40710:24;;;;;;;;;;;40703:31;;;40745:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39690:1079;;;;:::o;37194:221::-;37279:14;37296:20;37313:2;37296:16;:20::i;:::-;37279:37;;37354:7;37327:12;:16;37340:2;37327:16;;;;;;;;;;;;;;;:24;37344:6;37327:24;;;;;;;;;;;:34;;;;37401:6;37372:17;:26;37390:7;37372:26;;;;;;;;;;;:35;;;;37194:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2140:155::-;;2232:6;2219:20;2210:29;;2248:41;2283:5;2248:41;:::i;:::-;2200:95;;;;:::o;2318:303::-;;2438:3;2431:4;2423:6;2419:17;2415:27;2405:2;;2456:1;2453;2446:12;2405:2;2496:6;2483:20;2521:94;2611:3;2603:6;2596:4;2588:6;2584:17;2521:94;:::i;:::-;2512:103;;2395:226;;;;;:::o;2644:303::-;;2764:3;2757:4;2749:6;2745:17;2741:27;2731:2;;2782:1;2779;2772:12;2731:2;2822:6;2809:20;2847:94;2937:3;2929:6;2922:4;2914:6;2910:17;2847:94;:::i;:::-;2838:103;;2721:226;;;;;:::o;2953:133::-;;3034:6;3021:20;3012:29;;3050:30;3074:5;3050:30;:::i;:::-;3002:84;;;;:::o;3092:137::-;;3175:6;3162:20;3153:29;;3191:32;3217:5;3191:32;:::i;:::-;3143:86;;;;:::o;3235:141::-;;3322:6;3316:13;3307:22;;3338:32;3364:5;3338:32;:::i;:::-;3297:79;;;;:::o;3395:271::-;;3499:3;3492:4;3484:6;3480:17;3476:27;3466:2;;3517:1;3514;3507:12;3466:2;3557:6;3544:20;3582:78;3656:3;3648:6;3641:4;3633:6;3629:17;3582:78;:::i;:::-;3573:87;;3456:210;;;;;:::o;3686:273::-;;3791:3;3784:4;3776:6;3772:17;3768:27;3758:2;;3809:1;3806;3799:12;3758:2;3849:6;3836:20;3874:79;3949:3;3941:6;3934:4;3926:6;3922:17;3874:79;:::i;:::-;3865:88;;3748:211;;;;;:::o;3965:139::-;;4049:6;4036:20;4027:29;;4065:33;4092:5;4065:33;:::i;:::-;4017:87;;;;:::o;4110:262::-;;4218:2;4206:9;4197:7;4193:23;4189:32;4186:2;;;4234:1;4231;4224:12;4186:2;4277:1;4302:53;4347:7;4338:6;4327:9;4323:22;4302:53;:::i;:::-;4292:63;;4248:117;4176:196;;;;:::o;4378:278::-;;4494:2;4482:9;4473:7;4469:23;4465:32;4462:2;;;4510:1;4507;4500:12;4462:2;4553:1;4578:61;4631:7;4622:6;4611:9;4607:22;4578:61;:::i;:::-;4568:71;;4524:125;4452:204;;;;:::o;4662:407::-;;;4787:2;4775:9;4766:7;4762:23;4758:32;4755:2;;;4803:1;4800;4793:12;4755:2;4846:1;4871:53;4916:7;4907:6;4896:9;4892:22;4871:53;:::i;:::-;4861:63;;4817:117;4973:2;4999:53;5044:7;5035:6;5024:9;5020:22;4999:53;:::i;:::-;4989:63;;4944:118;4745:324;;;;;:::o;5075:552::-;;;;5217:2;5205:9;5196:7;5192:23;5188:32;5185:2;;;5233:1;5230;5223:12;5185:2;5276:1;5301:53;5346:7;5337:6;5326:9;5322:22;5301:53;:::i;:::-;5291:63;;5247:117;5403:2;5429:53;5474:7;5465:6;5454:9;5450:22;5429:53;:::i;:::-;5419:63;;5374:118;5531:2;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5502:118;5175:452;;;;;:::o;5633:809::-;;;;;5801:3;5789:9;5780:7;5776:23;5772:33;5769:2;;;5818:1;5815;5808:12;5769:2;5861:1;5886:53;5931:7;5922:6;5911:9;5907:22;5886:53;:::i;:::-;5876:63;;5832:117;5988:2;6014:53;6059:7;6050:6;6039:9;6035:22;6014:53;:::i;:::-;6004:63;;5959:118;6116:2;6142:53;6187:7;6178:6;6167:9;6163:22;6142:53;:::i;:::-;6132:63;;6087:118;6272:2;6261:9;6257:18;6244:32;6303:18;6295:6;6292:30;6289:2;;;6335:1;6332;6325:12;6289:2;6363:62;6417:7;6408:6;6397:9;6393:22;6363:62;:::i;:::-;6353:72;;6215:220;5759:683;;;;;;;:::o;6448:401::-;;;6570:2;6558:9;6549:7;6545:23;6541:32;6538:2;;;6586:1;6583;6576:12;6538:2;6629:1;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6600:117;6756:2;6782:50;6824:7;6815:6;6804:9;6800:22;6782:50;:::i;:::-;6772:60;;6727:115;6528:321;;;;;:::o;6855:407::-;;;6980:2;6968:9;6959:7;6955:23;6951:32;6948:2;;;6996:1;6993;6986:12;6948:2;7039:1;7064:53;7109:7;7100:6;7089:9;7085:22;7064:53;:::i;:::-;7054:63;;7010:117;7166:2;7192:53;7237:7;7228:6;7217:9;7213:22;7192:53;:::i;:::-;7182:63;;7137:118;6938:324;;;;;:::o;7268:693::-;;;7443:2;7431:9;7422:7;7418:23;7414:32;7411:2;;;7459:1;7456;7449:12;7411:2;7530:1;7519:9;7515:17;7502:31;7560:18;7552:6;7549:30;7546:2;;;7592:1;7589;7582:12;7546:2;7620:78;7690:7;7681:6;7670:9;7666:22;7620:78;:::i;:::-;7610:88;;7473:235;7775:2;7764:9;7760:18;7747:32;7806:18;7798:6;7795:30;7792:2;;;7838:1;7835;7828:12;7792:2;7866:78;7936:7;7927:6;7916:9;7912:22;7866:78;:::i;:::-;7856:88;;7718:236;7401:560;;;;;:::o;7967:260::-;;8074:2;8062:9;8053:7;8049:23;8045:32;8042:2;;;8090:1;8087;8080:12;8042:2;8133:1;8158:52;8202:7;8193:6;8182:9;8178:22;8158:52;:::i;:::-;8148:62;;8104:116;8032:195;;;;:::o;8233:282::-;;8351:2;8339:9;8330:7;8326:23;8322:32;8319:2;;;8367:1;8364;8357:12;8319:2;8410:1;8435:63;8490:7;8481:6;8470:9;8466:22;8435:63;:::i;:::-;8425:73;;8381:127;8309:206;;;;:::o;8521:375::-;;8639:2;8627:9;8618:7;8614:23;8610:32;8607:2;;;8655:1;8652;8645:12;8607:2;8726:1;8715:9;8711:17;8698:31;8756:18;8748:6;8745:30;8742:2;;;8788:1;8785;8778:12;8742:2;8816:63;8871:7;8862:6;8851:9;8847:22;8816:63;:::i;:::-;8806:73;;8669:220;8597:299;;;;:::o;8902:262::-;;9010:2;8998:9;8989:7;8985:23;8981:32;8978:2;;;9026:1;9023;9016:12;8978:2;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8968:196;;;;:::o;9170:118::-;9257:24;9275:5;9257:24;:::i;:::-;9252:3;9245:37;9235:53;;:::o;9294:109::-;9375:21;9390:5;9375:21;:::i;:::-;9370:3;9363:34;9353:50;;:::o;9409:360::-;;9523:38;9555:5;9523:38;:::i;:::-;9577:70;9640:6;9635:3;9577:70;:::i;:::-;9570:77;;9656:52;9701:6;9696:3;9689:4;9682:5;9678:16;9656:52;:::i;:::-;9733:29;9755:6;9733:29;:::i;:::-;9728:3;9724:39;9717:46;;9499:270;;;;;:::o;9775:364::-;;9891:39;9924:5;9891:39;:::i;:::-;9946:71;10010:6;10005:3;9946:71;:::i;:::-;9939:78;;10026:52;10071:6;10066:3;10059:4;10052:5;10048:16;10026:52;:::i;:::-;10103:29;10125:6;10103:29;:::i;:::-;10098:3;10094:39;10087:46;;9867:272;;;;;:::o;10145:377::-;;10279:39;10312:5;10279:39;:::i;:::-;10334:89;10416:6;10411:3;10334:89;:::i;:::-;10327:96;;10432:52;10477:6;10472:3;10465:4;10458:5;10454:16;10432:52;:::i;:::-;10509:6;10504:3;10500:16;10493:23;;10255:267;;;;;:::o;10528:367::-;;10691:67;10755:2;10750:3;10691:67;:::i;:::-;10684:74;;10788:34;10784:1;10779:3;10775:11;10768:55;10854:5;10849:2;10844:3;10840:12;10833:27;10886:2;10881:3;10877:12;10870:19;;10674:221;;;:::o;10901:318::-;;11064:67;11128:2;11123:3;11064:67;:::i;:::-;11057:74;;11161:22;11157:1;11152:3;11148:11;11141:43;11210:2;11205:3;11201:12;11194:19;;11047:172;;;:::o;11225:330::-;;11388:67;11452:2;11447:3;11388:67;:::i;:::-;11381:74;;11485:34;11481:1;11476:3;11472:11;11465:55;11546:2;11541:3;11537:12;11530:19;;11371:184;;;:::o;11561:375::-;;11724:67;11788:2;11783:3;11724:67;:::i;:::-;11717:74;;11821:34;11817:1;11812:3;11808:11;11801:55;11887:13;11882:2;11877:3;11873:12;11866:35;11927:2;11922:3;11918:12;11911:19;;11707:229;;;:::o;11942:382::-;;12105:67;12169:2;12164:3;12105:67;:::i;:::-;12098:74;;12202:34;12198:1;12193:3;12189:11;12182:55;12268:20;12263:2;12258:3;12254:12;12247:42;12315:2;12310:3;12306:12;12299:19;;12088:236;;;:::o;12330:370::-;;12493:67;12557:2;12552:3;12493:67;:::i;:::-;12486:74;;12590:34;12586:1;12581:3;12577:11;12570:55;12656:8;12651:2;12646:3;12642:12;12635:30;12691:2;12686:3;12682:12;12675:19;;12476:224;;;:::o;12706:326::-;;12869:67;12933:2;12928:3;12869:67;:::i;:::-;12862:74;;12966:30;12962:1;12957:3;12953:11;12946:51;13023:2;13018:3;13014:12;13007:19;;12852:180;;;:::o;13038:324::-;;13201:67;13265:2;13260:3;13201:67;:::i;:::-;13194:74;;13298:28;13294:1;13289:3;13285:11;13278:49;13353:2;13348:3;13344:12;13337:19;;13184:178;;;:::o;13368:368::-;;13531:67;13595:2;13590:3;13531:67;:::i;:::-;13524:74;;13628:34;13624:1;13619:3;13615:11;13608:55;13694:6;13689:2;13684:3;13680:12;13673:28;13727:2;13722:3;13718:12;13711:19;;13514:222;;;:::o;13742:323::-;;13905:67;13969:2;13964:3;13905:67;:::i;:::-;13898:74;;14002:27;13998:1;13993:3;13989:11;13982:48;14056:2;14051:3;14047:12;14040:19;;13888:177;;;:::o;14071:329::-;;14234:67;14298:2;14293:3;14234:67;:::i;:::-;14227:74;;14331:33;14327:1;14322:3;14318:11;14311:54;14391:2;14386:3;14382:12;14375:19;;14217:183;;;:::o;14406:325::-;;14569:67;14633:2;14628:3;14569:67;:::i;:::-;14562:74;;14666:29;14662:1;14657:3;14653:11;14646:50;14722:2;14717:3;14713:12;14706:19;;14552:179;;;:::o;14737:376::-;;14900:67;14964:2;14959:3;14900:67;:::i;:::-;14893:74;;14997:34;14993:1;14988:3;14984:11;14977:55;15063:14;15058:2;15053:3;15049:12;15042:36;15104:2;15099:3;15095:12;15088:19;;14883:230;;;:::o;15119:323::-;;15282:67;15346:2;15341:3;15282:67;:::i;:::-;15275:74;;15379:27;15375:1;15370:3;15366:11;15359:48;15433:2;15428:3;15424:12;15417:19;;15265:177;;;:::o;15448:314::-;;15611:67;15675:2;15670:3;15611:67;:::i;:::-;15604:74;;15708:18;15704:1;15699:3;15695:11;15688:39;15753:2;15748:3;15744:12;15737:19;;15594:168;;;:::o;15768:388::-;;15931:67;15995:2;15990:3;15931:67;:::i;:::-;15924:74;;16028:34;16024:1;16019:3;16015:11;16008:55;16094:26;16089:2;16084:3;16080:12;16073:48;16147:2;16142:3;16138:12;16131:19;;15914:242;;;:::o;16162:374::-;;16325:67;16389:2;16384:3;16325:67;:::i;:::-;16318:74;;16422:34;16418:1;16413:3;16409:11;16402:55;16488:12;16483:2;16478:3;16474:12;16467:34;16527:2;16522:3;16518:12;16511:19;;16308:228;;;:::o;16542:373::-;;16705:67;16769:2;16764:3;16705:67;:::i;:::-;16698:74;;16802:34;16798:1;16793:3;16789:11;16782:55;16868:11;16863:2;16858:3;16854:12;16847:33;16906:2;16901:3;16897:12;16890:19;;16688:227;;;:::o;16921:330::-;;17084:67;17148:2;17143:3;17084:67;:::i;:::-;17077:74;;17181:34;17177:1;17172:3;17168:11;17161:55;17242:2;17237:3;17233:12;17226:19;;17067:184;;;:::o;17257:330::-;;17420:67;17484:2;17479:3;17420:67;:::i;:::-;17413:74;;17517:34;17513:1;17508:3;17504:11;17497:55;17578:2;17573:3;17569:12;17562:19;;17403:184;;;:::o;17593:376::-;;17756:67;17820:2;17815:3;17756:67;:::i;:::-;17749:74;;17853:34;17849:1;17844:3;17840:11;17833:55;17919:14;17914:2;17909:3;17905:12;17898:36;17960:2;17955:3;17951:12;17944:19;;17739:230;;;:::o;17975:371::-;;18138:67;18202:2;18197:3;18138:67;:::i;:::-;18131:74;;18235:34;18231:1;18226:3;18222:11;18215:55;18301:9;18296:2;18291:3;18287:12;18280:31;18337:2;18332:3;18328:12;18321:19;;18121:225;;;:::o;18352:330::-;;18515:67;18579:2;18574:3;18515:67;:::i;:::-;18508:74;;18612:34;18608:1;18603:3;18599:11;18592:55;18673:2;18668:3;18664:12;18657:19;;18498:184;;;:::o;18688:330::-;;18851:67;18915:2;18910:3;18851:67;:::i;:::-;18844:74;;18948:34;18944:1;18939:3;18935:11;18928:55;19009:2;19004:3;19000:12;18993:19;;18834:184;;;:::o;19024:373::-;;19187:67;19251:2;19246:3;19187:67;:::i;:::-;19180:74;;19284:34;19280:1;19275:3;19271:11;19264:55;19350:11;19345:2;19340:3;19336:12;19329:33;19388:2;19383:3;19379:12;19372:19;;19170:227;;;:::o;19403:379::-;;19566:67;19630:2;19625:3;19566:67;:::i;:::-;19559:74;;19663:34;19659:1;19654:3;19650:11;19643:55;19729:17;19724:2;19719:3;19715:12;19708:39;19773:2;19768:3;19764:12;19757:19;;19549:233;;;:::o;19788:365::-;;19951:67;20015:2;20010:3;19951:67;:::i;:::-;19944:74;;20048:34;20044:1;20039:3;20035:11;20028:55;20114:3;20109:2;20104:3;20100:12;20093:25;20144:2;20139:3;20135:12;20128:19;;19934:219;;;:::o;20159:381::-;;20322:67;20386:2;20381:3;20322:67;:::i;:::-;20315:74;;20419:34;20415:1;20410:3;20406:11;20399:55;20485:19;20480:2;20475:3;20471:12;20464:41;20531:2;20526:3;20522:12;20515:19;;20305:235;;;:::o;20546:376::-;;20709:67;20773:2;20768:3;20709:67;:::i;:::-;20702:74;;20806:34;20802:1;20797:3;20793:11;20786:55;20872:14;20867:2;20862:3;20858:12;20851:36;20913:2;20908:3;20904:12;20897:19;;20692:230;;;:::o;20928:330::-;;21091:67;21155:2;21150:3;21091:67;:::i;:::-;21084:74;;21188:34;21184:1;21179:3;21175:11;21168:55;21249:2;21244:3;21240:12;21233:19;;21074:184;;;:::o;21264:118::-;21351:24;21369:5;21351:24;:::i;:::-;21346:3;21339:37;21329:53;;:::o;21388:435::-;;21590:95;21681:3;21672:6;21590:95;:::i;:::-;21583:102;;21702:95;21793:3;21784:6;21702:95;:::i;:::-;21695:102;;21814:3;21807:10;;21572:251;;;;;:::o;21829:222::-;;21960:2;21949:9;21945:18;21937:26;;21973:71;22041:1;22030:9;22026:17;22017:6;21973:71;:::i;:::-;21927:124;;;;:::o;22057:640::-;;22290:3;22279:9;22275:19;22267:27;;22304:71;22372:1;22361:9;22357:17;22348:6;22304:71;:::i;:::-;22385:72;22453:2;22442:9;22438:18;22429:6;22385:72;:::i;:::-;22467;22535:2;22524:9;22520:18;22511:6;22467:72;:::i;:::-;22586:9;22580:4;22576:20;22571:2;22560:9;22556:18;22549:48;22614:76;22685:4;22676:6;22614:76;:::i;:::-;22606:84;;22257:440;;;;;;;:::o;22703:210::-;;22828:2;22817:9;22813:18;22805:26;;22841:65;22903:1;22892:9;22888:17;22879:6;22841:65;:::i;:::-;22795:118;;;;:::o;22919:313::-;;23070:2;23059:9;23055:18;23047:26;;23119:9;23113:4;23109:20;23105:1;23094:9;23090:17;23083:47;23147:78;23220:4;23211:6;23147:78;:::i;:::-;23139:86;;23037:195;;;;:::o;23238:419::-;;23442:2;23431:9;23427:18;23419:26;;23491:9;23485:4;23481:20;23477:1;23466:9;23462:17;23455:47;23519:131;23645:4;23519:131;:::i;:::-;23511:139;;23409:248;;;:::o;23663:419::-;;23867:2;23856:9;23852:18;23844:26;;23916:9;23910:4;23906:20;23902:1;23891:9;23887:17;23880:47;23944:131;24070:4;23944:131;:::i;:::-;23936:139;;23834:248;;;:::o;24088:419::-;;24292:2;24281:9;24277:18;24269:26;;24341:9;24335:4;24331:20;24327:1;24316:9;24312:17;24305:47;24369:131;24495:4;24369:131;:::i;:::-;24361:139;;24259:248;;;:::o;24513:419::-;;24717:2;24706:9;24702:18;24694:26;;24766:9;24760:4;24756:20;24752:1;24741:9;24737:17;24730:47;24794:131;24920:4;24794:131;:::i;:::-;24786:139;;24684:248;;;:::o;24938:419::-;;25142:2;25131:9;25127:18;25119:26;;25191:9;25185:4;25181:20;25177:1;25166:9;25162:17;25155:47;25219:131;25345:4;25219:131;:::i;:::-;25211:139;;25109:248;;;:::o;25363:419::-;;25567:2;25556:9;25552:18;25544:26;;25616:9;25610:4;25606:20;25602:1;25591:9;25587:17;25580:47;25644:131;25770:4;25644:131;:::i;:::-;25636:139;;25534:248;;;:::o;25788:419::-;;25992:2;25981:9;25977:18;25969:26;;26041:9;26035:4;26031:20;26027:1;26016:9;26012:17;26005:47;26069:131;26195:4;26069:131;:::i;:::-;26061:139;;25959:248;;;:::o;26213:419::-;;26417:2;26406:9;26402:18;26394:26;;26466:9;26460:4;26456:20;26452:1;26441:9;26437:17;26430:47;26494:131;26620:4;26494:131;:::i;:::-;26486:139;;26384:248;;;:::o;26638:419::-;;26842:2;26831:9;26827:18;26819:26;;26891:9;26885:4;26881:20;26877:1;26866:9;26862:17;26855:47;26919:131;27045:4;26919:131;:::i;:::-;26911:139;;26809:248;;;:::o;27063:419::-;;27267:2;27256:9;27252:18;27244:26;;27316:9;27310:4;27306:20;27302:1;27291:9;27287:17;27280:47;27344:131;27470:4;27344:131;:::i;:::-;27336:139;;27234:248;;;:::o;27488:419::-;;27692:2;27681:9;27677:18;27669:26;;27741:9;27735:4;27731:20;27727:1;27716:9;27712:17;27705:47;27769:131;27895:4;27769:131;:::i;:::-;27761:139;;27659:248;;;:::o;27913:419::-;;28117:2;28106:9;28102:18;28094:26;;28166:9;28160:4;28156:20;28152:1;28141:9;28137:17;28130:47;28194:131;28320:4;28194:131;:::i;:::-;28186:139;;28084:248;;;:::o;28338:419::-;;28542:2;28531:9;28527:18;28519:26;;28591:9;28585:4;28581:20;28577:1;28566:9;28562:17;28555:47;28619:131;28745:4;28619:131;:::i;:::-;28611:139;;28509:248;;;:::o;28763:419::-;;28967:2;28956:9;28952:18;28944:26;;29016:9;29010:4;29006:20;29002:1;28991:9;28987:17;28980:47;29044:131;29170:4;29044:131;:::i;:::-;29036:139;;28934:248;;;:::o;29188:419::-;;29392:2;29381:9;29377:18;29369:26;;29441:9;29435:4;29431:20;29427:1;29416:9;29412:17;29405:47;29469:131;29595:4;29469:131;:::i;:::-;29461:139;;29359:248;;;:::o;29613:419::-;;29817:2;29806:9;29802:18;29794:26;;29866:9;29860:4;29856:20;29852:1;29841:9;29837:17;29830:47;29894:131;30020:4;29894:131;:::i;:::-;29886:139;;29784:248;;;:::o;30038:419::-;;30242:2;30231:9;30227:18;30219:26;;30291:9;30285:4;30281:20;30277:1;30266:9;30262:17;30255:47;30319:131;30445:4;30319:131;:::i;:::-;30311:139;;30209:248;;;:::o;30463:419::-;;30667:2;30656:9;30652:18;30644:26;;30716:9;30710:4;30706:20;30702:1;30691:9;30687:17;30680:47;30744:131;30870:4;30744:131;:::i;:::-;30736:139;;30634:248;;;:::o;30888:419::-;;31092:2;31081:9;31077:18;31069:26;;31141:9;31135:4;31131:20;31127:1;31116:9;31112:17;31105:47;31169:131;31295:4;31169:131;:::i;:::-;31161:139;;31059:248;;;:::o;31313:419::-;;31517:2;31506:9;31502:18;31494:26;;31566:9;31560:4;31556:20;31552:1;31541:9;31537:17;31530:47;31594:131;31720:4;31594:131;:::i;:::-;31586:139;;31484:248;;;:::o;31738:419::-;;31942:2;31931:9;31927:18;31919:26;;31991:9;31985:4;31981:20;31977:1;31966:9;31962:17;31955:47;32019:131;32145:4;32019:131;:::i;:::-;32011:139;;31909:248;;;:::o;32163:419::-;;32367:2;32356:9;32352:18;32344:26;;32416:9;32410:4;32406:20;32402:1;32391:9;32387:17;32380:47;32444:131;32570:4;32444:131;:::i;:::-;32436:139;;32334:248;;;:::o;32588:419::-;;32792:2;32781:9;32777:18;32769:26;;32841:9;32835:4;32831:20;32827:1;32816:9;32812:17;32805:47;32869:131;32995:4;32869:131;:::i;:::-;32861:139;;32759:248;;;:::o;33013:419::-;;33217:2;33206:9;33202:18;33194:26;;33266:9;33260:4;33256:20;33252:1;33241:9;33237:17;33230:47;33294:131;33420:4;33294:131;:::i;:::-;33286:139;;33184:248;;;:::o;33438:419::-;;33642:2;33631:9;33627:18;33619:26;;33691:9;33685:4;33681:20;33677:1;33666:9;33662:17;33655:47;33719:131;33845:4;33719:131;:::i;:::-;33711:139;;33609:248;;;:::o;33863:419::-;;34067:2;34056:9;34052:18;34044:26;;34116:9;34110:4;34106:20;34102:1;34091:9;34087:17;34080:47;34144:131;34270:4;34144:131;:::i;:::-;34136:139;;34034:248;;;:::o;34288:419::-;;34492:2;34481:9;34477:18;34469:26;;34541:9;34535:4;34531:20;34527:1;34516:9;34512:17;34505:47;34569:131;34695:4;34569:131;:::i;:::-;34561:139;;34459:248;;;:::o;34713:419::-;;34917:2;34906:9;34902:18;34894:26;;34966:9;34960:4;34956:20;34952:1;34941:9;34937:17;34930:47;34994:131;35120:4;34994:131;:::i;:::-;34986:139;;34884:248;;;:::o;35138:419::-;;35342:2;35331:9;35327:18;35319:26;;35391:9;35385:4;35381:20;35377:1;35366:9;35362:17;35355:47;35419:131;35545:4;35419:131;:::i;:::-;35411:139;;35309:248;;;:::o;35563:419::-;;35767:2;35756:9;35752:18;35744:26;;35816:9;35810:4;35806:20;35802:1;35791:9;35787:17;35780:47;35844:131;35970:4;35844:131;:::i;:::-;35836:139;;35734:248;;;:::o;35988:222::-;;36119:2;36108:9;36104:18;36096:26;;36132:71;36200:1;36189:9;36185:17;36176:6;36132:71;:::i;:::-;36086:124;;;;:::o;36216:283::-;;36282:2;36276:9;36266:19;;36324:4;36316:6;36312:17;36431:6;36419:10;36416:22;36395:18;36383:10;36380:34;36377:62;36374:2;;;36442:18;;:::i;:::-;36374:2;36482:10;36478:2;36471:22;36256:243;;;;:::o;36505:311::-;;36672:18;36664:6;36661:30;36658:2;;;36694:18;;:::i;:::-;36658:2;36744:4;36736:6;36732:17;36724:25;;36804:4;36798;36794:15;36786:23;;36587:229;;;:::o;36822:311::-;;36989:18;36981:6;36978:30;36975:2;;;37011:18;;:::i;:::-;36975:2;37061:4;37053:6;37049:17;37041:25;;37121:4;37115;37111:15;37103:23;;36904:229;;;:::o;37139:331::-;;37290:18;37282:6;37279:30;37276:2;;;37312:18;;:::i;:::-;37276:2;37397:4;37393:9;37386:4;37378:6;37374:17;37370:33;37362:41;;37458:4;37452;37448:15;37440:23;;37205:265;;;:::o;37476:332::-;;37628:18;37620:6;37617:30;37614:2;;;37650:18;;:::i;:::-;37614:2;37735:4;37731:9;37724:4;37716:6;37712:17;37708:33;37700:41;;37796:4;37790;37786:15;37778:23;;37543:265;;;:::o;37814:98::-;;37899:5;37893:12;37883:22;;37872:40;;;:::o;37918:99::-;;38004:5;37998:12;37988:22;;37977:40;;;:::o;38023:168::-;;38140:6;38135:3;38128:19;38180:4;38175:3;38171:14;38156:29;;38118:73;;;;:::o;38197:169::-;;38315:6;38310:3;38303:19;38355:4;38350:3;38346:14;38331:29;;38293:73;;;;:::o;38372:148::-;;38511:3;38496:18;;38486:34;;;;:::o;38526:305::-;;38585:20;38603:1;38585:20;:::i;:::-;38580:25;;38619:20;38637:1;38619:20;:::i;:::-;38614:25;;38773:1;38705:66;38701:74;38698:1;38695:81;38692:2;;;38779:18;;:::i;:::-;38692:2;38823:1;38820;38816:9;38809:16;;38570:261;;;;:::o;38837:185::-;;38894:20;38912:1;38894:20;:::i;:::-;38889:25;;38928:20;38946:1;38928:20;:::i;:::-;38923:25;;38967:1;38957:2;;38972:18;;:::i;:::-;38957:2;39014:1;39011;39007:9;39002:14;;38879:143;;;;:::o;39028:348::-;;39091:20;39109:1;39091:20;:::i;:::-;39086:25;;39125:20;39143:1;39125:20;:::i;:::-;39120:25;;39313:1;39245:66;39241:74;39238:1;39235:81;39230:1;39223:9;39216:17;39212:105;39209:2;;;39320:18;;:::i;:::-;39209:2;39368:1;39365;39361:9;39350:20;;39076:300;;;;:::o;39382:191::-;;39442:20;39460:1;39442:20;:::i;:::-;39437:25;;39476:20;39494:1;39476:20;:::i;:::-;39471:25;;39515:1;39512;39509:8;39506:2;;;39520:18;;:::i;:::-;39506:2;39565:1;39562;39558:9;39550:17;;39427:146;;;;:::o;39579:96::-;;39645:24;39663:5;39645:24;:::i;:::-;39634:35;;39624:51;;;:::o;39681:104::-;;39755:24;39773:5;39755:24;:::i;:::-;39744:35;;39734:51;;;:::o;39791:90::-;;39868:5;39861:13;39854:21;39843:32;;39833:48;;;:::o;39887:149::-;;39963:66;39956:5;39952:78;39941:89;;39931:105;;;:::o;40042:126::-;;40119:42;40112:5;40108:54;40097:65;;40087:81;;;:::o;40174:77::-;;40240:5;40229:16;;40219:32;;;:::o;40257:154::-;40341:6;40336:3;40331;40318:30;40403:1;40394:6;40389:3;40385:16;40378:27;40308:103;;;:::o;40417:307::-;40485:1;40495:113;40509:6;40506:1;40503:13;40495:113;;;40594:1;40589:3;40585:11;40579:18;40575:1;40570:3;40566:11;40559:39;40531:2;40528:1;40524:10;40519:15;;40495:113;;;40626:6;40623:1;40620:13;40617:2;;;40706:1;40697:6;40692:3;40688:16;40681:27;40617:2;40466:258;;;;:::o;40730:320::-;;40811:1;40805:4;40801:12;40791:22;;40858:1;40852:4;40848:12;40879:18;40869:2;;40935:4;40927:6;40923:17;40913:27;;40869:2;40997;40989:6;40986:14;40966:18;40963:38;40960:2;;;41016:18;;:::i;:::-;40960:2;40781:269;;;;:::o;41056:233::-;;41118:24;41136:5;41118:24;:::i;:::-;41109:33;;41164:66;41157:5;41154:77;41151:2;;;41234:18;;:::i;:::-;41151:2;41281:1;41274:5;41270:13;41263:20;;41099:190;;;:::o;41295:176::-;;41344:20;41362:1;41344:20;:::i;:::-;41339:25;;41378:20;41396:1;41378:20;:::i;:::-;41373:25;;41417:1;41407:2;;41422:18;;:::i;:::-;41407:2;41463:1;41460;41456:9;41451:14;;41329:142;;;;:::o;41477:180::-;41525:77;41522:1;41515:88;41622:4;41619:1;41612:15;41646:4;41643:1;41636:15;41663:180;41711:77;41708:1;41701:88;41808:4;41805:1;41798:15;41832:4;41829:1;41822:15;41849:180;41897:77;41894:1;41887:88;41994:4;41991:1;41984:15;42018:4;42015:1;42008:15;42035:180;42083:77;42080:1;42073:88;42180:4;42177:1;42170:15;42204:4;42201:1;42194:15;42221:102;;42313:2;42309:7;42304:2;42297:5;42293:14;42289:28;42279:38;;42269:54;;;:::o;42329:122::-;42402:24;42420:5;42402:24;:::i;:::-;42395:5;42392:35;42382:2;;42441:1;42438;42431:12;42382:2;42372:79;:::o;42457:138::-;42538:32;42564:5;42538:32;:::i;:::-;42531:5;42528:43;42518:2;;42585:1;42582;42575:12;42518:2;42508:87;:::o;42601:116::-;42671:21;42686:5;42671:21;:::i;:::-;42664:5;42661:32;42651:2;;42707:1;42704;42697:12;42651:2;42641:76;:::o;42723:120::-;42795:23;42812:5;42795:23;:::i;:::-;42788:5;42785:34;42775:2;;42833:1;42830;42823:12;42775:2;42765:78;:::o;42849:122::-;42922:24;42940:5;42922:24;:::i;:::-;42915:5;42912:35;42902:2;;42961:1;42958;42951:12;42902:2;42892:79;:::o

Swarm Source

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