Token Big Bad Wolves - Monkey of Anarkey

Overview CRC721

Total Supply:
37 BBW-MOA

Holders:
33 addresses
Balance
1 BBW-MOA
0x634a5dc4cda63ea8d0699d9387cdcfffc6408b84
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BBW_MOA

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-06-08
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev 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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

// 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 generally not needed starting with Solidity 0.8, since 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;
    }
    }
}

contract BBW_MOA is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;

    string private baseURI;
    bool public sameURIForAll = true;

    constructor() ERC721("Big Bad Wolves - Monkey of Anarkey", "BBW-MOA") {

    }

    function airdrop(uint256 numberOfMints, address wallet) public onlyOwner {
        uint256 supply = totalSupply();
        for (uint256 i = 0; i < numberOfMints; i++) {
            _safeMint(wallet, supply + 1 + i);
        }
    }

    function airdrops(uint256 numberOfMints, address[] calldata wallets) public onlyOwner {
        uint256 supply = totalSupply();
        for (uint256 j = 0; j < wallets.length; j++) {
            for (uint256 i = 0; i < numberOfMints; i++) {
                _safeMint(wallets[j], supply + 1 + i + j * numberOfMints);
            }
        }
    }

    function mint(uint256 numberOfMints) public onlyOwner {
        uint256 supply = totalSupply();
        for (uint256 i = 0; i < numberOfMints; i++) {
            _safeMint(msg.sender, supply + 1 + i);
        }
    }

    function walletOfOwner(address owner) external view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokensId;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function setSameURIForAll(bool newSameURIForAll) public onlyOwner {
        sameURIForAll = newSameURIForAll;
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory base = _baseURI();
        if (sameURIForAll){
            return bytes(base).length > 0 ? string(abi.encodePacked(base)) : "";
        }
        return bytes(base).length > 0 ? string(abi.encodePacked(base, uint2str(tokenId), ".json")) : "";
    }

    function uint2str(uint _i) private pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"airdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sameURIForAll","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":"bool","name":"newSameURIForAll","type":"bool"}],"name":"setSameURIForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60806040526001600c60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051806060016040528060228152602001620040b5602291396040518060400160405280600781526020017f4242572d4d4f4100000000000000000000000000000000000000000000000000815250816000908051906020019062000095929190620001a5565b508060019080519060200190620000ae929190620001a5565b505050620000d1620000c5620000d760201b60201c565b620000df60201b60201c565b620002ba565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b39062000255565b90600052602060002090601f016020900481019282620001d7576000855562000223565b82601f10620001f257805160ff191683800117855562000223565b8280016001018555821562000223579182015b828111156200022257825182559160200191906001019062000205565b5b50905062000232919062000236565b5090565b5b808211156200025157600081600090555060010162000237565b5090565b600060028204905060018216806200026e57607f821691505b602082108114156200028557620002846200028b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613deb80620002ca6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a22cb46511610097578063c06fd11b11610071578063c06fd11b1461047f578063c87b56dd1461049b578063e985e9c5146104cb578063f2fde38b146104fb5761018e565b8063a22cb4651461042b578063b88d4fde14610447578063bc63f02e146104635761018e565b806370a082311461037d578063715018a6146103ad5780638c47e88a146103b75780638da5cb5b146103d357806395d89b41146103f1578063a0712d681461040f5761018e565b80632f745c591161014b5780634f135b38116101255780634f135b38146102e35780634f6ccce71461030157806355f804b3146103315780636352211e1461034d5761018e565b80632f745c591461026757806342842e0e14610297578063438b6300146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190612a6e565b610517565b6040516101ba919061309b565b60405180910390f35b6101cb610591565b6040516101d891906130b6565b60405180910390f35b6101fb60048036038101906101f69190612b11565b610623565b6040516102089190613012565b60405180910390f35b61022b60048036038101906102269190612a01565b6106a8565b005b6102356107c0565b6040516102429190613318565b60405180910390f35b610265600480360381019061026091906128eb565b6107cd565b005b610281600480360381019061027c9190612a01565b61082d565b60405161028e9190613318565b60405180910390f35b6102b160048036038101906102ac91906128eb565b6108d2565b005b6102cd60048036038101906102c8919061287e565b6108f2565b6040516102da9190613079565b60405180910390f35b6102eb6109a0565b6040516102f8919061309b565b60405180910390f35b61031b60048036038101906103169190612b11565b6109b3565b6040516103289190613318565b60405180910390f35b61034b60048036038101906103469190612ac8565b610a24565b005b61036760048036038101906103629190612b11565b610aba565b6040516103749190613012565b60405180910390f35b6103976004803603810190610392919061287e565b610b6c565b6040516103a49190613318565b60405180910390f35b6103b5610c24565b005b6103d160048036038101906103cc9190612a41565b610cac565b005b6103db610d45565b6040516103e89190613012565b60405180910390f35b6103f9610d6f565b60405161040691906130b6565b60405180910390f35b61042960048036038101906104249190612b11565b610e01565b005b610445600480360381019061044091906129c1565b610ecd565b005b610461600480360381019061045c919061293e565b610ee3565b005b61047d60048036038101906104789190612b3e565b610f45565b005b61049960048036038101906104949190612b7e565b611012565b005b6104b560048036038101906104b09190612b11565b61113f565b6040516104c291906130b6565b60405180910390f35b6104e560048036038101906104e091906128ab565b611243565b6040516104f2919061309b565b60405180910390f35b6105156004803603810190610510919061287e565b6112d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058a5750610589826113cf565b5b9050919050565b6060600080546105a090613645565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc90613645565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600061062e826114b1565b61066d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066490613238565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b382610aba565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071b906132b8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074361151d565b73ffffffffffffffffffffffffffffffffffffffff16148061077257506107718161076c61151d565b611243565b5b6107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a8906131b8565b60405180910390fd5b6107bb8383611525565b505050565b6000600880549050905090565b6107de6107d861151d565b826115de565b61081d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610814906132d8565b60405180910390fd5b6108288383836116bc565b505050565b600061083883610b6c565b8210610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906130d8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108ed83838360405180602001604052806000815250610ee3565b505050565b606060006108ff83610b6c565b905060008167ffffffffffffffff81111561091d5761091c6137dc565b5b60405190808252806020026020018201604052801561094b5781602001602082028036833780820191505090505b50905060005b8281101561099557610963858261082d565b828281518110610976576109756137ad565b5b602002602001018181525050808061098d906136a8565b915050610951565b508092505050919050565b600c60009054906101000a900460ff1681565b60006109bd6107c0565b82106109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906132f8565b60405180910390fd5b60088281548110610a1257610a116137ad565b5b90600052602060002001549050919050565b610a2c61151d565b73ffffffffffffffffffffffffffffffffffffffff16610a4a610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790613258565b60405180910390fd5b80600b9080519060200190610ab692919061263c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906131f8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd4906131d8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2c61151d565b73ffffffffffffffffffffffffffffffffffffffff16610c4a610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613258565b60405180910390fd5b610caa6000611918565b565b610cb461151d565b73ffffffffffffffffffffffffffffffffffffffff16610cd2610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613258565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d7e90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610daa90613645565b8015610df75780601f10610dcc57610100808354040283529160200191610df7565b820191906000526020600020905b815481529060010190602001808311610dda57829003601f168201915b5050505050905090565b610e0961151d565b73ffffffffffffffffffffffffffffffffffffffff16610e27610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7490613258565b60405180910390fd5b6000610e876107c0565b905060005b82811015610ec857610eb53382600185610ea69190613436565b610eb09190613436565b6119de565b8080610ec0906136a8565b915050610e8c565b505050565b610edf610ed861151d565b83836119fc565b5050565b610ef4610eee61151d565b836115de565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a906132d8565b60405180910390fd5b610f3f84848484611b69565b50505050565b610f4d61151d565b73ffffffffffffffffffffffffffffffffffffffff16610f6b610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890613258565b60405180910390fd5b6000610fcb6107c0565b905060005b8381101561100c57610ff98382600185610fea9190613436565b610ff49190613436565b6119de565b8080611004906136a8565b915050610fd0565b50505050565b61101a61151d565b73ffffffffffffffffffffffffffffffffffffffff16611038610d45565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590613258565b60405180910390fd5b60006110986107c0565b905060005b838390508110156111385760005b85811015611124576111118585848181106110c9576110c86137ad565b5b90506020020160208101906110de919061287e565b87846110ea91906134f4565b836001876110f89190613436565b6111029190613436565b61110c9190613436565b6119de565b808061111c906136a8565b9150506110ab565b508080611130906136a8565b91505061109d565b5050505050565b606061114a826114b1565b611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613298565b60405180910390fd5b6000611193611bc5565b9050600c60009054906101000a900460ff16156111f15760008151116111c857604051806020016040528060008152506111e9565b806040516020016111d99190612fcc565b6040516020818303038152906040525b91505061123e565b600081511161120f576040518060200160405280600081525061123a565b8061121984611c57565b60405160200161122a929190612fe3565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112df61151d565b73ffffffffffffffffffffffffffffffffffffffff166112fd610d45565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90613258565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613118565b60405180910390fd5b6113cc81611918565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061149a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806114aa57506114a982611de0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661159883610aba565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115e9826114b1565b611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613198565b60405180910390fd5b600061163383610aba565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116a257508373ffffffffffffffffffffffffffffffffffffffff1661168a84610623565b73ffffffffffffffffffffffffffffffffffffffff16145b806116b357506116b28185611243565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116dc82610aba565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613278565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613158565b60405180910390fd5b6117ad838383611e4a565b6117b8600082611525565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611808919061354e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461185f9190613436565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119f8828260405180602001604052806000815250611f5e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290613178565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5c919061309b565b60405180910390a3505050565b611b748484846116bc565b611b8084848484611fb9565b611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb6906130f8565b60405180910390fd5b50505050565b6060600b8054611bd490613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0090613645565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b5050505050905090565b60606000821415611c9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ddb565b600082905060005b60008214611cd1578080611cba906136a8565b915050600a82611cca91906134c3565b9150611ca7565b60008167ffffffffffffffff811115611ced57611cec6137dc565b5b6040519080825280601f01601f191660200182016040528015611d1f5781602001600182028036833780820191505090505b50905060008290505b60008614611dd357600181611d3d919061354e565b90506000600a8088611d4f91906134c3565b611d5991906134f4565b87611d64919061354e565b6030611d70919061348c565b905060008160f81b905080848481518110611d8e57611d8d6137ad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611dca91906134c3565b97505050611d28565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e55838383612150565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e9857611e9381612155565b611ed7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ed657611ed5838261219e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f1a57611f158161230b565b611f59565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f5857611f5782826123dc565b5b5b505050565b611f68838361245b565b611f756000848484611fb9565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906130f8565b60405180910390fd5b505050565b6000611fda8473ffffffffffffffffffffffffffffffffffffffff16612629565b15612143578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200361151d565b8786866040518563ffffffff1660e01b8152600401612025949392919061302d565b602060405180830381600087803b15801561203f57600080fd5b505af192505050801561207057506040513d601f19601f8201168201806040525081019061206d9190612a9b565b60015b6120f3573d80600081146120a0576040519150601f19603f3d011682016040523d82523d6000602084013e6120a5565b606091505b506000815114156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906130f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612148565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121ab84610b6c565b6121b5919061354e565b905060006007600084815260200190815260200160002054905081811461229a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061231f919061354e565b905060006009600084815260200190815260200160002054905060006008838154811061234f5761234e6137ad565b5b906000526020600020015490508060088381548110612371576123706137ad565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123c0576123bf61377e565b5b6001900381819060005260206000200160009055905550505050565b60006123e783610b6c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c290613218565b60405180910390fd5b6124d4816114b1565b15612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613138565b60405180910390fd5b61252060008383611e4a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125709190613436565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461264890613645565b90600052602060002090601f01602090048101928261266a57600085556126b1565b82601f1061268357805160ff19168380011785556126b1565b828001600101855582156126b1579182015b828111156126b0578251825591602001919060010190612695565b5b5090506126be91906126c2565b5090565b5b808211156126db5760008160009055506001016126c3565b5090565b60006126f26126ed84613358565b613333565b90508281526020810184848401111561270e5761270d61381a565b5b612719848285613603565b509392505050565b600061273461272f84613389565b613333565b9050828152602081018484840111156127505761274f61381a565b5b61275b848285613603565b509392505050565b60008135905061277281613d59565b92915050565b60008083601f84011261278e5761278d613810565b5b8235905067ffffffffffffffff8111156127ab576127aa61380b565b5b6020830191508360208202830111156127c7576127c6613815565b5b9250929050565b6000813590506127dd81613d70565b92915050565b6000813590506127f281613d87565b92915050565b60008151905061280781613d87565b92915050565b600082601f83011261282257612821613810565b5b81356128328482602086016126df565b91505092915050565b600082601f8301126128505761284f613810565b5b8135612860848260208601612721565b91505092915050565b60008135905061287881613d9e565b92915050565b60006020828403121561289457612893613824565b5b60006128a284828501612763565b91505092915050565b600080604083850312156128c2576128c1613824565b5b60006128d085828601612763565b92505060206128e185828601612763565b9150509250929050565b60008060006060848603121561290457612903613824565b5b600061291286828701612763565b935050602061292386828701612763565b925050604061293486828701612869565b9150509250925092565b6000806000806080858703121561295857612957613824565b5b600061296687828801612763565b945050602061297787828801612763565b935050604061298887828801612869565b925050606085013567ffffffffffffffff8111156129a9576129a861381f565b5b6129b58782880161280d565b91505092959194509250565b600080604083850312156129d8576129d7613824565b5b60006129e685828601612763565b92505060206129f7858286016127ce565b9150509250929050565b60008060408385031215612a1857612a17613824565b5b6000612a2685828601612763565b9250506020612a3785828601612869565b9150509250929050565b600060208284031215612a5757612a56613824565b5b6000612a65848285016127ce565b91505092915050565b600060208284031215612a8457612a83613824565b5b6000612a92848285016127e3565b91505092915050565b600060208284031215612ab157612ab0613824565b5b6000612abf848285016127f8565b91505092915050565b600060208284031215612ade57612add613824565b5b600082013567ffffffffffffffff811115612afc57612afb61381f565b5b612b088482850161283b565b91505092915050565b600060208284031215612b2757612b26613824565b5b6000612b3584828501612869565b91505092915050565b60008060408385031215612b5557612b54613824565b5b6000612b6385828601612869565b9250506020612b7485828601612763565b9150509250929050565b600080600060408486031215612b9757612b96613824565b5b6000612ba586828701612869565b935050602084013567ffffffffffffffff811115612bc657612bc561381f565b5b612bd286828701612778565b92509250509250925092565b6000612bea8383612fae565b60208301905092915050565b612bff81613582565b82525050565b6000612c10826133ca565b612c1a81856133f8565b9350612c25836133ba565b8060005b83811015612c56578151612c3d8882612bde565b9750612c48836133eb565b925050600181019050612c29565b5085935050505092915050565b612c6c81613594565b82525050565b6000612c7d826133d5565b612c878185613409565b9350612c97818560208601613612565b612ca081613829565b840191505092915050565b6000612cb6826133e0565b612cc0818561341a565b9350612cd0818560208601613612565b612cd981613829565b840191505092915050565b6000612cef826133e0565b612cf9818561342b565b9350612d09818560208601613612565b80840191505092915050565b6000612d22602b8361341a565b9150612d2d8261383a565b604082019050919050565b6000612d4560328361341a565b9150612d5082613889565b604082019050919050565b6000612d6860268361341a565b9150612d73826138d8565b604082019050919050565b6000612d8b601c8361341a565b9150612d9682613927565b602082019050919050565b6000612dae60248361341a565b9150612db982613950565b604082019050919050565b6000612dd160198361341a565b9150612ddc8261399f565b602082019050919050565b6000612df4602c8361341a565b9150612dff826139c8565b604082019050919050565b6000612e1760388361341a565b9150612e2282613a17565b604082019050919050565b6000612e3a602a8361341a565b9150612e4582613a66565b604082019050919050565b6000612e5d60298361341a565b9150612e6882613ab5565b604082019050919050565b6000612e8060208361341a565b9150612e8b82613b04565b602082019050919050565b6000612ea3602c8361341a565b9150612eae82613b2d565b604082019050919050565b6000612ec660058361342b565b9150612ed182613b7c565b600582019050919050565b6000612ee960208361341a565b9150612ef482613ba5565b602082019050919050565b6000612f0c60298361341a565b9150612f1782613bce565b604082019050919050565b6000612f2f602f8361341a565b9150612f3a82613c1d565b604082019050919050565b6000612f5260218361341a565b9150612f5d82613c6c565b604082019050919050565b6000612f7560318361341a565b9150612f8082613cbb565b604082019050919050565b6000612f98602c8361341a565b9150612fa382613d0a565b604082019050919050565b612fb7816135ec565b82525050565b612fc6816135ec565b82525050565b6000612fd88284612ce4565b915081905092915050565b6000612fef8285612ce4565b9150612ffb8284612ce4565b915061300682612eb9565b91508190509392505050565b60006020820190506130276000830184612bf6565b92915050565b60006080820190506130426000830187612bf6565b61304f6020830186612bf6565b61305c6040830185612fbd565b818103606083015261306e8184612c72565b905095945050505050565b600060208201905081810360008301526130938184612c05565b905092915050565b60006020820190506130b06000830184612c63565b92915050565b600060208201905081810360008301526130d08184612cab565b905092915050565b600060208201905081810360008301526130f181612d15565b9050919050565b6000602082019050818103600083015261311181612d38565b9050919050565b6000602082019050818103600083015261313181612d5b565b9050919050565b6000602082019050818103600083015261315181612d7e565b9050919050565b6000602082019050818103600083015261317181612da1565b9050919050565b6000602082019050818103600083015261319181612dc4565b9050919050565b600060208201905081810360008301526131b181612de7565b9050919050565b600060208201905081810360008301526131d181612e0a565b9050919050565b600060208201905081810360008301526131f181612e2d565b9050919050565b6000602082019050818103600083015261321181612e50565b9050919050565b6000602082019050818103600083015261323181612e73565b9050919050565b6000602082019050818103600083015261325181612e96565b9050919050565b6000602082019050818103600083015261327181612edc565b9050919050565b6000602082019050818103600083015261329181612eff565b9050919050565b600060208201905081810360008301526132b181612f22565b9050919050565b600060208201905081810360008301526132d181612f45565b9050919050565b600060208201905081810360008301526132f181612f68565b9050919050565b6000602082019050818103600083015261331181612f8b565b9050919050565b600060208201905061332d6000830184612fbd565b92915050565b600061333d61334e565b90506133498282613677565b919050565b6000604051905090565b600067ffffffffffffffff821115613373576133726137dc565b5b61337c82613829565b9050602081019050919050565b600067ffffffffffffffff8211156133a4576133a36137dc565b5b6133ad82613829565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613441826135ec565b915061344c836135ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613481576134806136f1565b5b828201905092915050565b6000613497826135f6565b91506134a2836135f6565b92508260ff038211156134b8576134b76136f1565b5b828201905092915050565b60006134ce826135ec565b91506134d9836135ec565b9250826134e9576134e8613720565b5b828204905092915050565b60006134ff826135ec565b915061350a836135ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613543576135426136f1565b5b828202905092915050565b6000613559826135ec565b9150613564836135ec565b925082821015613577576135766136f1565b5b828203905092915050565b600061358d826135cc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613630578082015181840152602081019050613615565b8381111561363f576000848401525b50505050565b6000600282049050600182168061365d57607f821691505b602082108114156136715761367061374f565b5b50919050565b61368082613829565b810181811067ffffffffffffffff8211171561369f5761369e6137dc565b5b80604052505050565b60006136b3826135ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136e6576136e56136f1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613d6281613582565b8114613d6d57600080fd5b50565b613d7981613594565b8114613d8457600080fd5b50565b613d90816135a0565b8114613d9b57600080fd5b50565b613da7816135ec565b8114613db257600080fd5b5056fea2646970667358221220eeda6046fef58eb0ac8d66c01e1c8aa9a265af22efe34e18780c3801f9da721d64736f6c634300080700334269672042616420576f6c766573202d204d6f6e6b6579206f6620416e61726b6579

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063a22cb46511610097578063c06fd11b11610071578063c06fd11b1461047f578063c87b56dd1461049b578063e985e9c5146104cb578063f2fde38b146104fb5761018e565b8063a22cb4651461042b578063b88d4fde14610447578063bc63f02e146104635761018e565b806370a082311461037d578063715018a6146103ad5780638c47e88a146103b75780638da5cb5b146103d357806395d89b41146103f1578063a0712d681461040f5761018e565b80632f745c591161014b5780634f135b38116101255780634f135b38146102e35780634f6ccce71461030157806355f804b3146103315780636352211e1461034d5761018e565b80632f745c591461026757806342842e0e14610297578063438b6300146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190612a6e565b610517565b6040516101ba919061309b565b60405180910390f35b6101cb610591565b6040516101d891906130b6565b60405180910390f35b6101fb60048036038101906101f69190612b11565b610623565b6040516102089190613012565b60405180910390f35b61022b60048036038101906102269190612a01565b6106a8565b005b6102356107c0565b6040516102429190613318565b60405180910390f35b610265600480360381019061026091906128eb565b6107cd565b005b610281600480360381019061027c9190612a01565b61082d565b60405161028e9190613318565b60405180910390f35b6102b160048036038101906102ac91906128eb565b6108d2565b005b6102cd60048036038101906102c8919061287e565b6108f2565b6040516102da9190613079565b60405180910390f35b6102eb6109a0565b6040516102f8919061309b565b60405180910390f35b61031b60048036038101906103169190612b11565b6109b3565b6040516103289190613318565b60405180910390f35b61034b60048036038101906103469190612ac8565b610a24565b005b61036760048036038101906103629190612b11565b610aba565b6040516103749190613012565b60405180910390f35b6103976004803603810190610392919061287e565b610b6c565b6040516103a49190613318565b60405180910390f35b6103b5610c24565b005b6103d160048036038101906103cc9190612a41565b610cac565b005b6103db610d45565b6040516103e89190613012565b60405180910390f35b6103f9610d6f565b60405161040691906130b6565b60405180910390f35b61042960048036038101906104249190612b11565b610e01565b005b610445600480360381019061044091906129c1565b610ecd565b005b610461600480360381019061045c919061293e565b610ee3565b005b61047d60048036038101906104789190612b3e565b610f45565b005b61049960048036038101906104949190612b7e565b611012565b005b6104b560048036038101906104b09190612b11565b61113f565b6040516104c291906130b6565b60405180910390f35b6104e560048036038101906104e091906128ab565b611243565b6040516104f2919061309b565b60405180910390f35b6105156004803603810190610510919061287e565b6112d7565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058a5750610589826113cf565b5b9050919050565b6060600080546105a090613645565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc90613645565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600061062e826114b1565b61066d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066490613238565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106b382610aba565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071b906132b8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661074361151d565b73ffffffffffffffffffffffffffffffffffffffff16148061077257506107718161076c61151d565b611243565b5b6107b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a8906131b8565b60405180910390fd5b6107bb8383611525565b505050565b6000600880549050905090565b6107de6107d861151d565b826115de565b61081d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610814906132d8565b60405180910390fd5b6108288383836116bc565b505050565b600061083883610b6c565b8210610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906130d8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108ed83838360405180602001604052806000815250610ee3565b505050565b606060006108ff83610b6c565b905060008167ffffffffffffffff81111561091d5761091c6137dc565b5b60405190808252806020026020018201604052801561094b5781602001602082028036833780820191505090505b50905060005b8281101561099557610963858261082d565b828281518110610976576109756137ad565b5b602002602001018181525050808061098d906136a8565b915050610951565b508092505050919050565b600c60009054906101000a900460ff1681565b60006109bd6107c0565b82106109fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f5906132f8565b60405180910390fd5b60088281548110610a1257610a116137ad565b5b90600052602060002001549050919050565b610a2c61151d565b73ffffffffffffffffffffffffffffffffffffffff16610a4a610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9790613258565b60405180910390fd5b80600b9080519060200190610ab692919061263c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906131f8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd4906131d8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c2c61151d565b73ffffffffffffffffffffffffffffffffffffffff16610c4a610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790613258565b60405180910390fd5b610caa6000611918565b565b610cb461151d565b73ffffffffffffffffffffffffffffffffffffffff16610cd2610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90613258565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610d7e90613645565b80601f0160208091040260200160405190810160405280929190818152602001828054610daa90613645565b8015610df75780601f10610dcc57610100808354040283529160200191610df7565b820191906000526020600020905b815481529060010190602001808311610dda57829003601f168201915b5050505050905090565b610e0961151d565b73ffffffffffffffffffffffffffffffffffffffff16610e27610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7490613258565b60405180910390fd5b6000610e876107c0565b905060005b82811015610ec857610eb53382600185610ea69190613436565b610eb09190613436565b6119de565b8080610ec0906136a8565b915050610e8c565b505050565b610edf610ed861151d565b83836119fc565b5050565b610ef4610eee61151d565b836115de565b610f33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2a906132d8565b60405180910390fd5b610f3f84848484611b69565b50505050565b610f4d61151d565b73ffffffffffffffffffffffffffffffffffffffff16610f6b610d45565b73ffffffffffffffffffffffffffffffffffffffff1614610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb890613258565b60405180910390fd5b6000610fcb6107c0565b905060005b8381101561100c57610ff98382600185610fea9190613436565b610ff49190613436565b6119de565b8080611004906136a8565b915050610fd0565b50505050565b61101a61151d565b73ffffffffffffffffffffffffffffffffffffffff16611038610d45565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590613258565b60405180910390fd5b60006110986107c0565b905060005b838390508110156111385760005b85811015611124576111118585848181106110c9576110c86137ad565b5b90506020020160208101906110de919061287e565b87846110ea91906134f4565b836001876110f89190613436565b6111029190613436565b61110c9190613436565b6119de565b808061111c906136a8565b9150506110ab565b508080611130906136a8565b91505061109d565b5050505050565b606061114a826114b1565b611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613298565b60405180910390fd5b6000611193611bc5565b9050600c60009054906101000a900460ff16156111f15760008151116111c857604051806020016040528060008152506111e9565b806040516020016111d99190612fcc565b6040516020818303038152906040525b91505061123e565b600081511161120f576040518060200160405280600081525061123a565b8061121984611c57565b60405160200161122a929190612fe3565b6040516020818303038152906040525b9150505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112df61151d565b73ffffffffffffffffffffffffffffffffffffffff166112fd610d45565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90613258565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba90613118565b60405180910390fd5b6113cc81611918565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061149a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806114aa57506114a982611de0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661159883610aba565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006115e9826114b1565b611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90613198565b60405180910390fd5b600061163383610aba565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806116a257508373ffffffffffffffffffffffffffffffffffffffff1661168a84610623565b73ffffffffffffffffffffffffffffffffffffffff16145b806116b357506116b28185611243565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116dc82610aba565b73ffffffffffffffffffffffffffffffffffffffff1614611732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172990613278565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179990613158565b60405180910390fd5b6117ad838383611e4a565b6117b8600082611525565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611808919061354e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461185f9190613436565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6119f8828260405180602001604052806000815250611f5e565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290613178565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5c919061309b565b60405180910390a3505050565b611b748484846116bc565b611b8084848484611fb9565b611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb6906130f8565b60405180910390fd5b50505050565b6060600b8054611bd490613645565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0090613645565b8015611c4d5780601f10611c2257610100808354040283529160200191611c4d565b820191906000526020600020905b815481529060010190602001808311611c3057829003601f168201915b5050505050905090565b60606000821415611c9f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ddb565b600082905060005b60008214611cd1578080611cba906136a8565b915050600a82611cca91906134c3565b9150611ca7565b60008167ffffffffffffffff811115611ced57611cec6137dc565b5b6040519080825280601f01601f191660200182016040528015611d1f5781602001600182028036833780820191505090505b50905060008290505b60008614611dd357600181611d3d919061354e565b90506000600a8088611d4f91906134c3565b611d5991906134f4565b87611d64919061354e565b6030611d70919061348c565b905060008160f81b905080848481518110611d8e57611d8d6137ad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88611dca91906134c3565b97505050611d28565b819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e55838383612150565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e9857611e9381612155565b611ed7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ed657611ed5838261219e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f1a57611f158161230b565b611f59565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f5857611f5782826123dc565b5b5b505050565b611f68838361245b565b611f756000848484611fb9565b611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab906130f8565b60405180910390fd5b505050565b6000611fda8473ffffffffffffffffffffffffffffffffffffffff16612629565b15612143578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261200361151d565b8786866040518563ffffffff1660e01b8152600401612025949392919061302d565b602060405180830381600087803b15801561203f57600080fd5b505af192505050801561207057506040513d601f19601f8201168201806040525081019061206d9190612a9b565b60015b6120f3573d80600081146120a0576040519150601f19603f3d011682016040523d82523d6000602084013e6120a5565b606091505b506000815114156120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906130f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612148565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016121ab84610b6c565b6121b5919061354e565b905060006007600084815260200190815260200160002054905081811461229a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061231f919061354e565b905060006009600084815260200190815260200160002054905060006008838154811061234f5761234e6137ad565b5b906000526020600020015490508060088381548110612371576123706137ad565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806123c0576123bf61377e565b5b6001900381819060005260206000200160009055905550505050565b60006123e783610b6c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c290613218565b60405180910390fd5b6124d4816114b1565b15612514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250b90613138565b60405180910390fd5b61252060008383611e4a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125709190613436565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461264890613645565b90600052602060002090601f01602090048101928261266a57600085556126b1565b82601f1061268357805160ff19168380011785556126b1565b828001600101855582156126b1579182015b828111156126b0578251825591602001919060010190612695565b5b5090506126be91906126c2565b5090565b5b808211156126db5760008160009055506001016126c3565b5090565b60006126f26126ed84613358565b613333565b90508281526020810184848401111561270e5761270d61381a565b5b612719848285613603565b509392505050565b600061273461272f84613389565b613333565b9050828152602081018484840111156127505761274f61381a565b5b61275b848285613603565b509392505050565b60008135905061277281613d59565b92915050565b60008083601f84011261278e5761278d613810565b5b8235905067ffffffffffffffff8111156127ab576127aa61380b565b5b6020830191508360208202830111156127c7576127c6613815565b5b9250929050565b6000813590506127dd81613d70565b92915050565b6000813590506127f281613d87565b92915050565b60008151905061280781613d87565b92915050565b600082601f83011261282257612821613810565b5b81356128328482602086016126df565b91505092915050565b600082601f8301126128505761284f613810565b5b8135612860848260208601612721565b91505092915050565b60008135905061287881613d9e565b92915050565b60006020828403121561289457612893613824565b5b60006128a284828501612763565b91505092915050565b600080604083850312156128c2576128c1613824565b5b60006128d085828601612763565b92505060206128e185828601612763565b9150509250929050565b60008060006060848603121561290457612903613824565b5b600061291286828701612763565b935050602061292386828701612763565b925050604061293486828701612869565b9150509250925092565b6000806000806080858703121561295857612957613824565b5b600061296687828801612763565b945050602061297787828801612763565b935050604061298887828801612869565b925050606085013567ffffffffffffffff8111156129a9576129a861381f565b5b6129b58782880161280d565b91505092959194509250565b600080604083850312156129d8576129d7613824565b5b60006129e685828601612763565b92505060206129f7858286016127ce565b9150509250929050565b60008060408385031215612a1857612a17613824565b5b6000612a2685828601612763565b9250506020612a3785828601612869565b9150509250929050565b600060208284031215612a5757612a56613824565b5b6000612a65848285016127ce565b91505092915050565b600060208284031215612a8457612a83613824565b5b6000612a92848285016127e3565b91505092915050565b600060208284031215612ab157612ab0613824565b5b6000612abf848285016127f8565b91505092915050565b600060208284031215612ade57612add613824565b5b600082013567ffffffffffffffff811115612afc57612afb61381f565b5b612b088482850161283b565b91505092915050565b600060208284031215612b2757612b26613824565b5b6000612b3584828501612869565b91505092915050565b60008060408385031215612b5557612b54613824565b5b6000612b6385828601612869565b9250506020612b7485828601612763565b9150509250929050565b600080600060408486031215612b9757612b96613824565b5b6000612ba586828701612869565b935050602084013567ffffffffffffffff811115612bc657612bc561381f565b5b612bd286828701612778565b92509250509250925092565b6000612bea8383612fae565b60208301905092915050565b612bff81613582565b82525050565b6000612c10826133ca565b612c1a81856133f8565b9350612c25836133ba565b8060005b83811015612c56578151612c3d8882612bde565b9750612c48836133eb565b925050600181019050612c29565b5085935050505092915050565b612c6c81613594565b82525050565b6000612c7d826133d5565b612c878185613409565b9350612c97818560208601613612565b612ca081613829565b840191505092915050565b6000612cb6826133e0565b612cc0818561341a565b9350612cd0818560208601613612565b612cd981613829565b840191505092915050565b6000612cef826133e0565b612cf9818561342b565b9350612d09818560208601613612565b80840191505092915050565b6000612d22602b8361341a565b9150612d2d8261383a565b604082019050919050565b6000612d4560328361341a565b9150612d5082613889565b604082019050919050565b6000612d6860268361341a565b9150612d73826138d8565b604082019050919050565b6000612d8b601c8361341a565b9150612d9682613927565b602082019050919050565b6000612dae60248361341a565b9150612db982613950565b604082019050919050565b6000612dd160198361341a565b9150612ddc8261399f565b602082019050919050565b6000612df4602c8361341a565b9150612dff826139c8565b604082019050919050565b6000612e1760388361341a565b9150612e2282613a17565b604082019050919050565b6000612e3a602a8361341a565b9150612e4582613a66565b604082019050919050565b6000612e5d60298361341a565b9150612e6882613ab5565b604082019050919050565b6000612e8060208361341a565b9150612e8b82613b04565b602082019050919050565b6000612ea3602c8361341a565b9150612eae82613b2d565b604082019050919050565b6000612ec660058361342b565b9150612ed182613b7c565b600582019050919050565b6000612ee960208361341a565b9150612ef482613ba5565b602082019050919050565b6000612f0c60298361341a565b9150612f1782613bce565b604082019050919050565b6000612f2f602f8361341a565b9150612f3a82613c1d565b604082019050919050565b6000612f5260218361341a565b9150612f5d82613c6c565b604082019050919050565b6000612f7560318361341a565b9150612f8082613cbb565b604082019050919050565b6000612f98602c8361341a565b9150612fa382613d0a565b604082019050919050565b612fb7816135ec565b82525050565b612fc6816135ec565b82525050565b6000612fd88284612ce4565b915081905092915050565b6000612fef8285612ce4565b9150612ffb8284612ce4565b915061300682612eb9565b91508190509392505050565b60006020820190506130276000830184612bf6565b92915050565b60006080820190506130426000830187612bf6565b61304f6020830186612bf6565b61305c6040830185612fbd565b818103606083015261306e8184612c72565b905095945050505050565b600060208201905081810360008301526130938184612c05565b905092915050565b60006020820190506130b06000830184612c63565b92915050565b600060208201905081810360008301526130d08184612cab565b905092915050565b600060208201905081810360008301526130f181612d15565b9050919050565b6000602082019050818103600083015261311181612d38565b9050919050565b6000602082019050818103600083015261313181612d5b565b9050919050565b6000602082019050818103600083015261315181612d7e565b9050919050565b6000602082019050818103600083015261317181612da1565b9050919050565b6000602082019050818103600083015261319181612dc4565b9050919050565b600060208201905081810360008301526131b181612de7565b9050919050565b600060208201905081810360008301526131d181612e0a565b9050919050565b600060208201905081810360008301526131f181612e2d565b9050919050565b6000602082019050818103600083015261321181612e50565b9050919050565b6000602082019050818103600083015261323181612e73565b9050919050565b6000602082019050818103600083015261325181612e96565b9050919050565b6000602082019050818103600083015261327181612edc565b9050919050565b6000602082019050818103600083015261329181612eff565b9050919050565b600060208201905081810360008301526132b181612f22565b9050919050565b600060208201905081810360008301526132d181612f45565b9050919050565b600060208201905081810360008301526132f181612f68565b9050919050565b6000602082019050818103600083015261331181612f8b565b9050919050565b600060208201905061332d6000830184612fbd565b92915050565b600061333d61334e565b90506133498282613677565b919050565b6000604051905090565b600067ffffffffffffffff821115613373576133726137dc565b5b61337c82613829565b9050602081019050919050565b600067ffffffffffffffff8211156133a4576133a36137dc565b5b6133ad82613829565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613441826135ec565b915061344c836135ec565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613481576134806136f1565b5b828201905092915050565b6000613497826135f6565b91506134a2836135f6565b92508260ff038211156134b8576134b76136f1565b5b828201905092915050565b60006134ce826135ec565b91506134d9836135ec565b9250826134e9576134e8613720565b5b828204905092915050565b60006134ff826135ec565b915061350a836135ec565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613543576135426136f1565b5b828202905092915050565b6000613559826135ec565b9150613564836135ec565b925082821015613577576135766136f1565b5b828203905092915050565b600061358d826135cc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613630578082015181840152602081019050613615565b8381111561363f576000848401525b50505050565b6000600282049050600182168061365d57607f821691505b602082108114156136715761367061374f565b5b50919050565b61368082613829565b810181811067ffffffffffffffff8211171561369f5761369e6137dc565b5b80604052505050565b60006136b3826135ec565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136e6576136e56136f1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613d6281613582565b8114613d6d57600080fd5b50565b613d7981613594565b8114613d8457600080fd5b50565b613d90816135a0565b8114613d9b57600080fd5b50565b613da7816135ec565b8114613db257600080fd5b5056fea2646970667358221220eeda6046fef58eb0ac8d66c01e1c8aa9a265af22efe34e18780c3801f9da721d64736f6c63430008070033

Deployed ByteCode Sourcemap

49218:2827:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33959:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20774:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22333:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21856:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34599:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23083:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34267:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23493:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50329:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49367:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34789:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50678:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20468:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20198:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41677:103;;;:::i;:::-;;50774:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41026:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20943:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50100:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22626:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23749:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49496:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49740:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51007:455;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22852:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41935:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33959:224;34061:4;34100:35;34085:50;;;:11;:50;;;;:90;;;;34139:36;34163:11;34139:23;:36::i;:::-;34085:90;34078:97;;33959:224;;;:::o;20774:100::-;20828:13;20861:5;20854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20774:100;:::o;22333:221::-;22409:7;22437:16;22445:7;22437;:16::i;:::-;22429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22522:15;:24;22538:7;22522:24;;;;;;;;;;;;;;;;;;;;;22515:31;;22333:221;;;:::o;21856:411::-;21937:13;21953:23;21968:7;21953:14;:23::i;:::-;21937:39;;22001:5;21995:11;;:2;:11;;;;21987:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22095:5;22079:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22104:37;22121:5;22128:12;:10;:12::i;:::-;22104:16;:37::i;:::-;22079:62;22057:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22238:21;22247:2;22251:7;22238:8;:21::i;:::-;21926:341;21856:411;;:::o;34599:113::-;34660:7;34687:10;:17;;;;34680:24;;34599:113;:::o;23083:339::-;23278:41;23297:12;:10;:12::i;:::-;23311:7;23278:18;:41::i;:::-;23270:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23386:28;23396:4;23402:2;23406:7;23386:9;:28::i;:::-;23083:339;;;:::o;34267:256::-;34364:7;34400:23;34417:5;34400:16;:23::i;:::-;34392:5;:31;34384:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34489:12;:19;34502:5;34489:19;;;;;;;;;;;;;;;:26;34509:5;34489:26;;;;;;;;;;;;34482:33;;34267:256;;;;:::o;23493:185::-;23631:39;23648:4;23654:2;23658:7;23631:39;;;;;;;;;;;;:16;:39::i;:::-;23493:185;;;:::o;50329:341::-;50389:16;50418:18;50439:16;50449:5;50439:9;:16::i;:::-;50418:37;;50468:25;50510:10;50496:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50468:53;;50536:9;50532:105;50551:10;50547:1;:14;50532:105;;;50596:29;50616:5;50623:1;50596:19;:29::i;:::-;50582:8;50591:1;50582:11;;;;;;;;:::i;:::-;;;;;;;:43;;;;;50563:3;;;;;:::i;:::-;;;;50532:105;;;;50654:8;50647:15;;;;50329:341;;;:::o;49367:32::-;;;;;;;;;;;;;:::o;34789:233::-;34864:7;34900:30;:28;:30::i;:::-;34892:5;:38;34884:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34997:10;35008:5;34997:17;;;;;;;;:::i;:::-;;;;;;;;;;34990:24;;34789:233;;;:::o;50678:88::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50755:3:::1;50745:7;:13;;;;;;;;;;;;:::i;:::-;;50678:88:::0;:::o;20468:239::-;20540:7;20560:13;20576:7;:16;20584:7;20576:16;;;;;;;;;;;;;;;;;;;;;20560:32;;20628:1;20611:19;;:5;:19;;;;20603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20694:5;20687:12;;;20468:239;;;:::o;20198:208::-;20270:7;20315:1;20298:19;;:5;:19;;;;20290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20382:9;:16;20392:5;20382:16;;;;;;;;;;;;;;;;20375:23;;20198:208;;;:::o;41677:103::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41742:30:::1;41769:1;41742:18;:30::i;:::-;41677:103::o:0;50774:117::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50867:16:::1;50851:13;;:32;;;;;;;;;;;;;;;;;;50774:117:::0;:::o;41026:87::-;41072:7;41099:6;;;;;;;;;;;41092:13;;41026:87;:::o;20943:104::-;20999:13;21032:7;21025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20943:104;:::o;50100:221::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50165:14:::1;50182:13;:11;:13::i;:::-;50165:30;;50211:9;50206:108;50230:13;50226:1;:17;50206:108;;;50265:37;50275:10;50300:1;50296;50287:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;50265:9;:37::i;:::-;50245:3;;;;;:::i;:::-;;;;50206:108;;;;50154:167;50100:221:::0;:::o;22626:155::-;22721:52;22740:12;:10;:12::i;:::-;22754:8;22764;22721:18;:52::i;:::-;22626:155;;:::o;23749:328::-;23924:41;23943:12;:10;:12::i;:::-;23957:7;23924:18;:41::i;:::-;23916:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24030:39;24044:4;24050:2;24054:7;24063:5;24030:13;:39::i;:::-;23749:328;;;;:::o;49496:236::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49580:14:::1;49597:13;:11;:13::i;:::-;49580:30;;49626:9;49621:104;49645:13;49641:1;:17;49621:104;;;49680:33;49690:6;49711:1;49707;49698:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;49680:9;:33::i;:::-;49660:3;;;;;:::i;:::-;;;;49621:104;;;;49569:163;49496:236:::0;;:::o;49740:352::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49837:14:::1;49854:13;:11;:13::i;:::-;49837:30;;49883:9;49878:207;49902:7;;:14;;49898:1;:18;49878:207;;;49943:9;49938:136;49962:13;49958:1;:17;49938:136;;;50001:57;50011:7;;50019:1;50011:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50044:13;50040:1;:17;;;;:::i;:::-;50036:1;50032;50023:6;:10;;;;:::i;:::-;:14;;;;:::i;:::-;:34;;;;:::i;:::-;50001:9;:57::i;:::-;49977:3;;;;;:::i;:::-;;;;49938:136;;;;49918:3;;;;;:::i;:::-;;;;49878:207;;;;49826:266;49740:352:::0;;;:::o;51007:455::-;51080:13;51114:16;51122:7;51114;:16::i;:::-;51106:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51195:18;51216:10;:8;:10::i;:::-;51195:31;;51241:13;;;;;;;;;;;51237:112;;;51298:1;51283:4;51277:18;:22;:60;;;;;;;;;;;;;;;;;51326:4;51309:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;51277:60;51270:67;;;;;51237:112;51387:1;51372:4;51366:18;:22;:88;;;;;;;;;;;;;;;;;51415:4;51421:17;51430:7;51421:8;:17::i;:::-;51398:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51366:88;51359:95;;;51007:455;;;;:::o;22852:164::-;22949:4;22973:18;:25;22992:5;22973:25;;;;;;;;;;;;;;;:35;22999:8;22973:35;;;;;;;;;;;;;;;;;;;;;;;;;22966:42;;22852:164;;;;:::o;41935:201::-;41257:12;:10;:12::i;:::-;41246:23;;:7;:5;:7::i;:::-;:23;;;41238:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42044:1:::1;42024:22;;:8;:22;;;;42016:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42100:28;42119:8;42100:18;:28::i;:::-;41935:201:::0;:::o;19841:293::-;19943:4;19991:25;19976:40;;;:11;:40;;;;:101;;;;20044:33;20029:48;;;:11;:48;;;;19976:101;:150;;;;20090:36;20114:11;20090:23;:36::i;:::-;19976:150;19960:166;;19841:293;;;:::o;25587:127::-;25652:4;25704:1;25676:30;;:7;:16;25684:7;25676:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25669:37;;25587:127;;;:::o;15553:98::-;15606:7;15633:10;15626:17;;15553:98;:::o;29569:174::-;29671:2;29644:15;:24;29660:7;29644:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29727:7;29723:2;29689:46;;29698:23;29713:7;29698:14;:23::i;:::-;29689:46;;;;;;;;;;;;29569:174;;:::o;25881:348::-;25974:4;25999:16;26007:7;25999;:16::i;:::-;25991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26075:13;26091:23;26106:7;26091:14;:23::i;:::-;26075:39;;26144:5;26133:16;;:7;:16;;;:51;;;;26177:7;26153:31;;:20;26165:7;26153:11;:20::i;:::-;:31;;;26133:51;:87;;;;26188:32;26205:5;26212:7;26188:16;:32::i;:::-;26133:87;26125:96;;;25881:348;;;;:::o;28873:578::-;29032:4;29005:31;;:23;29020:7;29005:14;:23::i;:::-;:31;;;28997:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29115:1;29101:16;;:2;:16;;;;29093:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29171:39;29192:4;29198:2;29202:7;29171:20;:39::i;:::-;29275:29;29292:1;29296:7;29275:8;:29::i;:::-;29336:1;29317:9;:15;29327:4;29317:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29365:1;29348:9;:13;29358:2;29348:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29396:2;29377:7;:16;29385:7;29377:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29435:7;29431:2;29416:27;;29425:4;29416:27;;;;;;;;;;;;28873:578;;;:::o;42296:191::-;42370:16;42389:6;;;;;;;;;;;42370:25;;42415:8;42406:6;;:17;;;;;;;;;;;;;;;;;;42470:8;42439:40;;42460:8;42439:40;;;;;;;;;;;;42359:128;42296:191;:::o;26571:110::-;26647:26;26657:2;26661:7;26647:26;;;;;;;;;;;;:9;:26::i;:::-;26571:110;;:::o;29885:315::-;30040:8;30031:17;;:5;:17;;;;30023:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;30127:8;30089:18;:25;30108:5;30089:25;;;;;;;;;;;;;;;:35;30115:8;30089:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30173:8;30151:41;;30166:5;30151:41;;;30183:8;30151:41;;;;;;:::i;:::-;;;;;;;;29885:315;;;:::o;24959:::-;25116:28;25126:4;25132:2;25136:7;25116:9;:28::i;:::-;25163:48;25186:4;25192:2;25196:7;25205:5;25163:22;:48::i;:::-;25155:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24959:315;;;;:::o;50899:100::-;50951:13;50984:7;50977:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50899:100;:::o;51470:572::-;51519:27;51569:1;51563:2;:7;51559:50;;;51587:10;;;;;;;;;;;;;;;;;;;;;51559:50;51619:6;51628:2;51619:11;;51641:8;51660:69;51672:1;51667;:6;51660:69;;51690:5;;;;;:::i;:::-;;;;51715:2;51710:7;;;;;:::i;:::-;;;51660:69;;;51739:17;51769:3;51759:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51739:34;;51784:6;51793:3;51784:12;;51807:198;51820:1;51814:2;:7;51807:198;;51844:1;51842;:3;;;;:::i;:::-;51838:7;;51860:10;51900:2;51895;51890;:7;;;;:::i;:::-;:12;;;;:::i;:::-;51885:2;:17;;;;:::i;:::-;51874:2;:29;;;;:::i;:::-;51860:44;;51919:9;51938:4;51931:12;;51919:24;;51968:2;51958:4;51963:1;51958:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;51991:2;51985:8;;;;;:::i;:::-;;;51823:182;;51807:198;;;52029:4;52015:19;;;;;;51470:572;;;;:::o;18450:157::-;18535:4;18574:25;18559:40;;;:11;:40;;;;18552:47;;18450:157;;;:::o;35635:589::-;35779:45;35806:4;35812:2;35816:7;35779:26;:45::i;:::-;35857:1;35841:18;;:4;:18;;;35837:187;;;35876:40;35908:7;35876:31;:40::i;:::-;35837:187;;;35946:2;35938:10;;:4;:10;;;35934:90;;35965:47;35998:4;36004:7;35965:32;:47::i;:::-;35934:90;35837:187;36052:1;36038:16;;:2;:16;;;36034:183;;;36071:45;36108:7;36071:36;:45::i;:::-;36034:183;;;36144:4;36138:10;;:2;:10;;;36134:83;;36165:40;36193:2;36197:7;36165:27;:40::i;:::-;36134:83;36034:183;35635:589;;;:::o;26908:321::-;27038:18;27044:2;27048:7;27038:5;:18::i;:::-;27089:54;27120:1;27124:2;27128:7;27137:5;27089:22;:54::i;:::-;27067:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26908:321;;;:::o;30765:799::-;30920:4;30941:15;:2;:13;;;:15::i;:::-;30937:620;;;30993:2;30977:36;;;31014:12;:10;:12::i;:::-;31028:4;31034:7;31043:5;30977:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30973:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31236:1;31219:6;:13;:18;31215:272;;;31262:60;;;;;;;;;;:::i;:::-;;;;;;;;31215:272;31437:6;31431:13;31422:6;31418:2;31414:15;31407:38;30973:529;31110:41;;;31100:51;;;:6;:51;;;;31093:58;;;;;30937:620;31541:4;31534:11;;30765:799;;;;;;;:::o;32136:126::-;;;;:::o;36947:164::-;37051:10;:17;;;;37024:15;:24;37040:7;37024:24;;;;;;;;;;;:44;;;;37079:10;37095:7;37079:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36947:164;:::o;37738:988::-;38004:22;38054:1;38029:22;38046:4;38029:16;:22::i;:::-;:26;;;;:::i;:::-;38004:51;;38066:18;38087:17;:26;38105:7;38087:26;;;;;;;;;;;;38066:47;;38234:14;38220:10;:28;38216:328;;38265:19;38287:12;:18;38300:4;38287:18;;;;;;;;;;;;;;;:34;38306:14;38287:34;;;;;;;;;;;;38265:56;;38371:11;38338:12;:18;38351:4;38338:18;;;;;;;;;;;;;;;:30;38357:10;38338:30;;;;;;;;;;;:44;;;;38488:10;38455:17;:30;38473:11;38455:30;;;;;;;;;;;:43;;;;38250:294;38216:328;38640:17;:26;38658:7;38640:26;;;;;;;;;;;38633:33;;;38684:12;:18;38697:4;38684:18;;;;;;;;;;;;;;;:34;38703:14;38684:34;;;;;;;;;;;38677:41;;;37819:907;;37738:988;;:::o;39021:1079::-;39274:22;39319:1;39299:10;:17;;;;:21;;;;:::i;:::-;39274:46;;39331:18;39352:15;:24;39368:7;39352:24;;;;;;;;;;;;39331:45;;39703:19;39725:10;39736:14;39725:26;;;;;;;;:::i;:::-;;;;;;;;;;39703:48;;39789:11;39764:10;39775;39764:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;39900:10;39869:15;:28;39885:11;39869:28;;;;;;;;;;;:41;;;;40041:15;:24;40057:7;40041:24;;;;;;;;;;;40034:31;;;40076:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39092:1008;;;39021:1079;:::o;36525:221::-;36610:14;36627:20;36644:2;36627:16;:20::i;:::-;36610:37;;36685:7;36658:12;:16;36671:2;36658:16;;;;;;;;;;;;;;;:24;36675:6;36658:24;;;;;;;;;;;:34;;;;36732:6;36703:17;:26;36721:7;36703:26;;;;;;;;;;;:35;;;;36599:147;36525:221;;:::o;27565:382::-;27659:1;27645:16;;:2;:16;;;;27637:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27718:16;27726:7;27718;:16::i;:::-;27717:17;27709:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27780:45;27809:1;27813:2;27817:7;27780:20;:45::i;:::-;27855:1;27838:9;:13;27848:2;27838:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27886:2;27867:7;:16;27875:7;27867:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27931:7;27927:2;27906:33;;27923:1;27906:33;;;;;;;;;;;;27565:382;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:323::-;6267:6;6316:2;6304:9;6295:7;6291:23;6287:32;6284:119;;;6322:79;;:::i;:::-;6284:119;6442:1;6467:50;6509:7;6500:6;6489:9;6485:22;6467:50;:::i;:::-;6457:60;;6413:114;6211:323;;;;:::o;6540:327::-;6598:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:119;;;6653:79;;:::i;:::-;6615:119;6773:1;6798:52;6842:7;6833:6;6822:9;6818:22;6798:52;:::i;:::-;6788:62;;6744:116;6540:327;;;;:::o;6873:349::-;6942:6;6991:2;6979:9;6970:7;6966:23;6962:32;6959:119;;;6997:79;;:::i;:::-;6959:119;7117:1;7142:63;7197:7;7188:6;7177:9;7173:22;7142:63;:::i;:::-;7132:73;;7088:127;6873:349;;;;:::o;7228:509::-;7297:6;7346:2;7334:9;7325:7;7321:23;7317:32;7314:119;;;7352:79;;:::i;:::-;7314:119;7500:1;7489:9;7485:17;7472:31;7530:18;7522:6;7519:30;7516:117;;;7552:79;;:::i;:::-;7516:117;7657:63;7712:7;7703:6;7692:9;7688:22;7657:63;:::i;:::-;7647:73;;7443:287;7228:509;;;;:::o;7743:329::-;7802:6;7851:2;7839:9;7830:7;7826:23;7822:32;7819:119;;;7857:79;;:::i;:::-;7819:119;7977:1;8002:53;8047:7;8038:6;8027:9;8023:22;8002:53;:::i;:::-;7992:63;;7948:117;7743:329;;;;:::o;8078:474::-;8146:6;8154;8203:2;8191:9;8182:7;8178:23;8174:32;8171:119;;;8209:79;;:::i;:::-;8171:119;8329:1;8354:53;8399:7;8390:6;8379:9;8375:22;8354:53;:::i;:::-;8344:63;;8300:117;8456:2;8482:53;8527:7;8518:6;8507:9;8503:22;8482:53;:::i;:::-;8472:63;;8427:118;8078:474;;;;;:::o;8558:704::-;8653:6;8661;8669;8718:2;8706:9;8697:7;8693:23;8689:32;8686:119;;;8724:79;;:::i;:::-;8686:119;8844:1;8869:53;8914:7;8905:6;8894:9;8890:22;8869:53;:::i;:::-;8859:63;;8815:117;8999:2;8988:9;8984:18;8971:32;9030:18;9022:6;9019:30;9016:117;;;9052:79;;:::i;:::-;9016:117;9165:80;9237:7;9228:6;9217:9;9213:22;9165:80;:::i;:::-;9147:98;;;;8942:313;8558:704;;;;;:::o;9268:179::-;9337:10;9358:46;9400:3;9392:6;9358:46;:::i;:::-;9436:4;9431:3;9427:14;9413:28;;9268:179;;;;:::o;9453:118::-;9540:24;9558:5;9540:24;:::i;:::-;9535:3;9528:37;9453:118;;:::o;9607:732::-;9726:3;9755:54;9803:5;9755:54;:::i;:::-;9825:86;9904:6;9899:3;9825:86;:::i;:::-;9818:93;;9935:56;9985:5;9935:56;:::i;:::-;10014:7;10045:1;10030:284;10055:6;10052:1;10049:13;10030:284;;;10131:6;10125:13;10158:63;10217:3;10202:13;10158:63;:::i;:::-;10151:70;;10244:60;10297:6;10244:60;:::i;:::-;10234:70;;10090:224;10077:1;10074;10070:9;10065:14;;10030:284;;;10034:14;10330:3;10323:10;;9731:608;;;9607:732;;;;:::o;10345:109::-;10426:21;10441:5;10426:21;:::i;:::-;10421:3;10414:34;10345:109;;:::o;10460:360::-;10546:3;10574:38;10606:5;10574:38;:::i;:::-;10628:70;10691:6;10686:3;10628:70;:::i;:::-;10621:77;;10707:52;10752:6;10747:3;10740:4;10733:5;10729:16;10707:52;:::i;:::-;10784:29;10806:6;10784:29;:::i;:::-;10779:3;10775:39;10768:46;;10550:270;10460:360;;;;:::o;10826:364::-;10914:3;10942:39;10975:5;10942:39;:::i;:::-;10997:71;11061:6;11056:3;10997:71;:::i;:::-;10990:78;;11077:52;11122:6;11117:3;11110:4;11103:5;11099:16;11077:52;:::i;:::-;11154:29;11176:6;11154:29;:::i;:::-;11149:3;11145:39;11138:46;;10918:272;10826:364;;;;:::o;11196:377::-;11302:3;11330:39;11363:5;11330:39;:::i;:::-;11385:89;11467:6;11462:3;11385:89;:::i;:::-;11378:96;;11483:52;11528:6;11523:3;11516:4;11509:5;11505:16;11483:52;:::i;:::-;11560:6;11555:3;11551:16;11544:23;;11306:267;11196:377;;;;:::o;11579:366::-;11721:3;11742:67;11806:2;11801:3;11742:67;:::i;:::-;11735:74;;11818:93;11907:3;11818:93;:::i;:::-;11936:2;11931:3;11927:12;11920:19;;11579:366;;;:::o;11951:::-;12093:3;12114:67;12178:2;12173:3;12114:67;:::i;:::-;12107:74;;12190:93;12279:3;12190:93;:::i;:::-;12308:2;12303:3;12299:12;12292:19;;11951:366;;;:::o;12323:::-;12465:3;12486:67;12550:2;12545:3;12486:67;:::i;:::-;12479:74;;12562:93;12651:3;12562:93;:::i;:::-;12680:2;12675:3;12671:12;12664:19;;12323:366;;;:::o;12695:::-;12837:3;12858:67;12922:2;12917:3;12858:67;:::i;:::-;12851:74;;12934:93;13023:3;12934:93;:::i;:::-;13052:2;13047:3;13043:12;13036:19;;12695:366;;;:::o;13067:::-;13209:3;13230:67;13294:2;13289:3;13230:67;:::i;:::-;13223:74;;13306:93;13395:3;13306:93;:::i;:::-;13424:2;13419:3;13415:12;13408:19;;13067:366;;;:::o;13439:::-;13581:3;13602:67;13666:2;13661:3;13602:67;:::i;:::-;13595:74;;13678:93;13767:3;13678:93;:::i;:::-;13796:2;13791:3;13787:12;13780:19;;13439:366;;;:::o;13811:::-;13953:3;13974:67;14038:2;14033:3;13974:67;:::i;:::-;13967:74;;14050:93;14139:3;14050:93;:::i;:::-;14168:2;14163:3;14159:12;14152:19;;13811:366;;;:::o;14183:::-;14325:3;14346:67;14410:2;14405:3;14346:67;:::i;:::-;14339:74;;14422:93;14511:3;14422:93;:::i;:::-;14540:2;14535:3;14531:12;14524:19;;14183:366;;;:::o;14555:::-;14697:3;14718:67;14782:2;14777:3;14718:67;:::i;:::-;14711:74;;14794:93;14883:3;14794:93;:::i;:::-;14912:2;14907:3;14903:12;14896:19;;14555:366;;;:::o;14927:::-;15069:3;15090:67;15154:2;15149:3;15090:67;:::i;:::-;15083:74;;15166:93;15255:3;15166:93;:::i;:::-;15284:2;15279:3;15275:12;15268:19;;14927:366;;;:::o;15299:::-;15441:3;15462:67;15526:2;15521:3;15462:67;:::i;:::-;15455:74;;15538:93;15627:3;15538:93;:::i;:::-;15656:2;15651:3;15647:12;15640:19;;15299:366;;;:::o;15671:::-;15813:3;15834:67;15898:2;15893:3;15834:67;:::i;:::-;15827:74;;15910:93;15999:3;15910:93;:::i;:::-;16028:2;16023:3;16019:12;16012:19;;15671:366;;;:::o;16043:400::-;16203:3;16224:84;16306:1;16301:3;16224:84;:::i;:::-;16217:91;;16317:93;16406:3;16317:93;:::i;:::-;16435:1;16430:3;16426:11;16419:18;;16043:400;;;:::o;16449:366::-;16591:3;16612:67;16676:2;16671:3;16612:67;:::i;:::-;16605:74;;16688:93;16777:3;16688:93;:::i;:::-;16806:2;16801:3;16797:12;16790:19;;16449:366;;;:::o;16821:::-;16963:3;16984:67;17048:2;17043:3;16984:67;:::i;:::-;16977:74;;17060:93;17149:3;17060:93;:::i;:::-;17178:2;17173:3;17169:12;17162:19;;16821:366;;;:::o;17193:::-;17335:3;17356:67;17420:2;17415:3;17356:67;:::i;:::-;17349:74;;17432:93;17521:3;17432:93;:::i;:::-;17550:2;17545:3;17541:12;17534:19;;17193:366;;;:::o;17565:::-;17707:3;17728:67;17792:2;17787:3;17728:67;:::i;:::-;17721:74;;17804:93;17893:3;17804:93;:::i;:::-;17922:2;17917:3;17913:12;17906:19;;17565:366;;;:::o;17937:::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:::-;18451:3;18472:67;18536:2;18531:3;18472:67;:::i;:::-;18465:74;;18548:93;18637:3;18548:93;:::i;:::-;18666:2;18661:3;18657:12;18650:19;;18309:366;;;:::o;18681:108::-;18758:24;18776:5;18758:24;:::i;:::-;18753:3;18746:37;18681:108;;:::o;18795:118::-;18882:24;18900:5;18882:24;:::i;:::-;18877:3;18870:37;18795:118;;:::o;18919:275::-;19051:3;19073:95;19164:3;19155:6;19073:95;:::i;:::-;19066:102;;19185:3;19178:10;;18919:275;;;;:::o;19200:701::-;19481:3;19503:95;19594:3;19585:6;19503:95;:::i;:::-;19496:102;;19615:95;19706:3;19697:6;19615:95;:::i;:::-;19608:102;;19727:148;19871:3;19727:148;:::i;:::-;19720:155;;19892:3;19885:10;;19200:701;;;;;:::o;19907:222::-;20000:4;20038:2;20027:9;20023:18;20015:26;;20051:71;20119:1;20108:9;20104:17;20095:6;20051:71;:::i;:::-;19907:222;;;;:::o;20135:640::-;20330:4;20368:3;20357:9;20353:19;20345:27;;20382:71;20450:1;20439:9;20435:17;20426:6;20382:71;:::i;:::-;20463:72;20531:2;20520:9;20516:18;20507:6;20463:72;:::i;:::-;20545;20613:2;20602:9;20598:18;20589:6;20545:72;:::i;:::-;20664:9;20658:4;20654:20;20649:2;20638:9;20634:18;20627:48;20692:76;20763:4;20754:6;20692:76;:::i;:::-;20684:84;;20135:640;;;;;;;:::o;20781:373::-;20924:4;20962:2;20951:9;20947:18;20939:26;;21011:9;21005:4;21001:20;20997:1;20986:9;20982:17;20975:47;21039:108;21142:4;21133:6;21039:108;:::i;:::-;21031:116;;20781:373;;;;:::o;21160:210::-;21247:4;21285:2;21274:9;21270:18;21262:26;;21298:65;21360:1;21349:9;21345:17;21336:6;21298:65;:::i;:::-;21160:210;;;;:::o;21376:313::-;21489:4;21527:2;21516:9;21512:18;21504:26;;21576:9;21570:4;21566:20;21562:1;21551:9;21547:17;21540:47;21604:78;21677:4;21668:6;21604:78;:::i;:::-;21596:86;;21376:313;;;;:::o;21695:419::-;21861:4;21899:2;21888:9;21884:18;21876:26;;21948:9;21942:4;21938:20;21934:1;21923:9;21919:17;21912:47;21976:131;22102:4;21976:131;:::i;:::-;21968:139;;21695:419;;;:::o;22120:::-;22286:4;22324:2;22313:9;22309:18;22301:26;;22373:9;22367:4;22363:20;22359:1;22348:9;22344:17;22337:47;22401:131;22527:4;22401:131;:::i;:::-;22393:139;;22120:419;;;:::o;22545:::-;22711:4;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22545:419;;;:::o;22970:::-;23136:4;23174:2;23163:9;23159:18;23151:26;;23223:9;23217:4;23213:20;23209:1;23198:9;23194:17;23187:47;23251:131;23377:4;23251:131;:::i;:::-;23243:139;;22970:419;;;:::o;23395:::-;23561:4;23599:2;23588:9;23584:18;23576:26;;23648:9;23642:4;23638:20;23634:1;23623:9;23619:17;23612:47;23676:131;23802:4;23676:131;:::i;:::-;23668:139;;23395:419;;;:::o;23820:::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24073:9;24067:4;24063:20;24059:1;24048:9;24044:17;24037:47;24101:131;24227:4;24101:131;:::i;:::-;24093:139;;23820:419;;;:::o;24245:::-;24411:4;24449:2;24438:9;24434:18;24426:26;;24498:9;24492:4;24488:20;24484:1;24473:9;24469:17;24462:47;24526:131;24652:4;24526:131;:::i;:::-;24518:139;;24245:419;;;:::o;24670:::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:131;25077:4;24951:131;:::i;:::-;24943:139;;24670:419;;;:::o;25095:::-;25261:4;25299:2;25288:9;25284:18;25276:26;;25348:9;25342:4;25338:20;25334:1;25323:9;25319:17;25312:47;25376:131;25502:4;25376:131;:::i;:::-;25368:139;;25095:419;;;:::o;25520:::-;25686:4;25724:2;25713:9;25709:18;25701:26;;25773:9;25767:4;25763:20;25759:1;25748:9;25744:17;25737:47;25801:131;25927:4;25801:131;:::i;:::-;25793:139;;25520:419;;;:::o;25945:::-;26111:4;26149:2;26138:9;26134:18;26126:26;;26198:9;26192:4;26188:20;26184:1;26173:9;26169:17;26162:47;26226:131;26352:4;26226:131;:::i;:::-;26218:139;;25945:419;;;:::o;26370:::-;26536:4;26574:2;26563:9;26559:18;26551:26;;26623:9;26617:4;26613:20;26609:1;26598:9;26594:17;26587:47;26651:131;26777:4;26651:131;:::i;:::-;26643:139;;26370:419;;;:::o;26795:::-;26961:4;26999:2;26988:9;26984:18;26976:26;;27048:9;27042:4;27038:20;27034:1;27023:9;27019:17;27012:47;27076:131;27202:4;27076:131;:::i;:::-;27068:139;;26795:419;;;:::o;27220:::-;27386:4;27424:2;27413:9;27409:18;27401:26;;27473:9;27467:4;27463:20;27459:1;27448:9;27444:17;27437:47;27501:131;27627:4;27501:131;:::i;:::-;27493:139;;27220:419;;;:::o;27645:::-;27811:4;27849:2;27838:9;27834:18;27826:26;;27898:9;27892:4;27888:20;27884:1;27873:9;27869:17;27862:47;27926:131;28052:4;27926:131;:::i;:::-;27918:139;;27645:419;;;:::o;28070:::-;28236:4;28274:2;28263:9;28259:18;28251:26;;28323:9;28317:4;28313:20;28309:1;28298:9;28294:17;28287:47;28351:131;28477:4;28351:131;:::i;:::-;28343:139;;28070:419;;;:::o;28495:::-;28661:4;28699:2;28688:9;28684:18;28676:26;;28748:9;28742:4;28738:20;28734:1;28723:9;28719:17;28712:47;28776:131;28902:4;28776:131;:::i;:::-;28768:139;;28495:419;;;:::o;28920:::-;29086:4;29124:2;29113:9;29109:18;29101:26;;29173:9;29167:4;29163:20;29159:1;29148:9;29144:17;29137:47;29201:131;29327:4;29201:131;:::i;:::-;29193:139;;28920:419;;;:::o;29345:222::-;29438:4;29476:2;29465:9;29461:18;29453:26;;29489:71;29557:1;29546:9;29542:17;29533:6;29489:71;:::i;:::-;29345:222;;;;:::o;29573:129::-;29607:6;29634:20;;:::i;:::-;29624:30;;29663:33;29691:4;29683:6;29663:33;:::i;:::-;29573:129;;;:::o;29708:75::-;29741:6;29774:2;29768:9;29758:19;;29708:75;:::o;29789:307::-;29850:4;29940:18;29932:6;29929:30;29926:56;;;29962:18;;:::i;:::-;29926:56;30000:29;30022:6;30000:29;:::i;:::-;29992:37;;30084:4;30078;30074:15;30066:23;;29789:307;;;:::o;30102:308::-;30164:4;30254:18;30246:6;30243:30;30240:56;;;30276:18;;:::i;:::-;30240:56;30314:29;30336:6;30314:29;:::i;:::-;30306:37;;30398:4;30392;30388:15;30380:23;;30102:308;;;:::o;30416:132::-;30483:4;30506:3;30498:11;;30536:4;30531:3;30527:14;30519:22;;30416:132;;;:::o;30554:114::-;30621:6;30655:5;30649:12;30639:22;;30554:114;;;:::o;30674:98::-;30725:6;30759:5;30753:12;30743:22;;30674:98;;;:::o;30778:99::-;30830:6;30864:5;30858:12;30848:22;;30778:99;;;:::o;30883:113::-;30953:4;30985;30980:3;30976:14;30968:22;;30883:113;;;:::o;31002:184::-;31101:11;31135:6;31130:3;31123:19;31175:4;31170:3;31166:14;31151:29;;31002:184;;;;:::o;31192:168::-;31275:11;31309:6;31304:3;31297:19;31349:4;31344:3;31340:14;31325:29;;31192:168;;;;:::o;31366:169::-;31450:11;31484:6;31479:3;31472:19;31524:4;31519:3;31515:14;31500:29;;31366:169;;;;:::o;31541:148::-;31643:11;31680:3;31665:18;;31541:148;;;;:::o;31695:305::-;31735:3;31754:20;31772:1;31754:20;:::i;:::-;31749:25;;31788:20;31806:1;31788:20;:::i;:::-;31783:25;;31942:1;31874:66;31870:74;31867:1;31864:81;31861:107;;;31948:18;;:::i;:::-;31861:107;31992:1;31989;31985:9;31978:16;;31695:305;;;;:::o;32006:237::-;32044:3;32063:18;32079:1;32063:18;:::i;:::-;32058:23;;32095:18;32111:1;32095:18;:::i;:::-;32090:23;;32185:1;32179:4;32175:12;32172:1;32169:19;32166:45;;;32191:18;;:::i;:::-;32166:45;32235:1;32232;32228:9;32221:16;;32006:237;;;;:::o;32249:185::-;32289:1;32306:20;32324:1;32306:20;:::i;:::-;32301:25;;32340:20;32358:1;32340:20;:::i;:::-;32335:25;;32379:1;32369:35;;32384:18;;:::i;:::-;32369:35;32426:1;32423;32419:9;32414:14;;32249:185;;;;:::o;32440:348::-;32480:7;32503:20;32521:1;32503:20;:::i;:::-;32498:25;;32537:20;32555:1;32537:20;:::i;:::-;32532:25;;32725:1;32657:66;32653:74;32650:1;32647:81;32642:1;32635:9;32628:17;32624:105;32621:131;;;32732:18;;:::i;:::-;32621:131;32780:1;32777;32773:9;32762:20;;32440:348;;;;:::o;32794:191::-;32834:4;32854:20;32872:1;32854:20;:::i;:::-;32849:25;;32888:20;32906:1;32888:20;:::i;:::-;32883:25;;32927:1;32924;32921:8;32918:34;;;32932:18;;:::i;:::-;32918:34;32977:1;32974;32970:9;32962:17;;32794:191;;;;:::o;32991:96::-;33028:7;33057:24;33075:5;33057:24;:::i;:::-;33046:35;;32991:96;;;:::o;33093:90::-;33127:7;33170:5;33163:13;33156:21;33145:32;;33093:90;;;:::o;33189:149::-;33225:7;33265:66;33258:5;33254:78;33243:89;;33189:149;;;:::o;33344:126::-;33381:7;33421:42;33414:5;33410:54;33399:65;;33344:126;;;:::o;33476:77::-;33513:7;33542:5;33531:16;;33476:77;;;:::o;33559:86::-;33594:7;33634:4;33627:5;33623:16;33612:27;;33559:86;;;:::o;33651:154::-;33735:6;33730:3;33725;33712:30;33797:1;33788:6;33783:3;33779:16;33772:27;33651:154;;;:::o;33811:307::-;33879:1;33889:113;33903:6;33900:1;33897:13;33889:113;;;33988:1;33983:3;33979:11;33973:18;33969:1;33964:3;33960:11;33953:39;33925:2;33922:1;33918:10;33913:15;;33889:113;;;34020:6;34017:1;34014:13;34011:101;;;34100:1;34091:6;34086:3;34082:16;34075:27;34011:101;33860:258;33811:307;;;:::o;34124:320::-;34168:6;34205:1;34199:4;34195:12;34185:22;;34252:1;34246:4;34242:12;34273:18;34263:81;;34329:4;34321:6;34317:17;34307:27;;34263:81;34391:2;34383:6;34380:14;34360:18;34357:38;34354:84;;;34410:18;;:::i;:::-;34354:84;34175:269;34124:320;;;:::o;34450:281::-;34533:27;34555:4;34533:27;:::i;:::-;34525:6;34521:40;34663:6;34651:10;34648:22;34627:18;34615:10;34612:34;34609:62;34606:88;;;34674:18;;:::i;:::-;34606:88;34714:10;34710:2;34703:22;34493:238;34450:281;;:::o;34737:233::-;34776:3;34799:24;34817:5;34799:24;:::i;:::-;34790:33;;34845:66;34838:5;34835:77;34832:103;;;34915:18;;:::i;:::-;34832:103;34962:1;34955:5;34951:13;34944:20;;34737:233;;;:::o;34976:180::-;35024:77;35021:1;35014:88;35121:4;35118:1;35111:15;35145:4;35142:1;35135:15;35162:180;35210:77;35207:1;35200:88;35307:4;35304:1;35297:15;35331:4;35328:1;35321:15;35348:180;35396:77;35393:1;35386:88;35493:4;35490:1;35483:15;35517:4;35514:1;35507:15;35534:180;35582:77;35579:1;35572:88;35679:4;35676:1;35669:15;35703:4;35700:1;35693:15;35720:180;35768:77;35765:1;35758:88;35865:4;35862:1;35855:15;35889:4;35886:1;35879:15;35906:180;35954:77;35951:1;35944:88;36051:4;36048:1;36041:15;36075:4;36072:1;36065:15;36092:117;36201:1;36198;36191:12;36215:117;36324:1;36321;36314:12;36338:117;36447:1;36444;36437:12;36461:117;36570:1;36567;36560:12;36584:117;36693:1;36690;36683:12;36707:117;36816:1;36813;36806:12;36830:102;36871:6;36922:2;36918:7;36913:2;36906:5;36902:14;36898:28;36888:38;;36830:102;;;:::o;36938:230::-;37078:34;37074:1;37066:6;37062:14;37055:58;37147:13;37142:2;37134:6;37130:15;37123:38;36938:230;:::o;37174:237::-;37314:34;37310:1;37302:6;37298:14;37291:58;37383:20;37378:2;37370:6;37366:15;37359:45;37174:237;:::o;37417:225::-;37557:34;37553:1;37545:6;37541:14;37534:58;37626:8;37621:2;37613:6;37609:15;37602:33;37417:225;:::o;37648:178::-;37788:30;37784:1;37776:6;37772:14;37765:54;37648:178;:::o;37832:223::-;37972:34;37968:1;37960:6;37956:14;37949:58;38041:6;38036:2;38028:6;38024:15;38017:31;37832:223;:::o;38061:175::-;38201:27;38197:1;38189:6;38185:14;38178:51;38061:175;:::o;38242:231::-;38382:34;38378:1;38370:6;38366:14;38359:58;38451:14;38446:2;38438:6;38434:15;38427:39;38242:231;:::o;38479:243::-;38619:34;38615:1;38607:6;38603:14;38596:58;38688:26;38683:2;38675:6;38671:15;38664:51;38479:243;:::o;38728:229::-;38868:34;38864:1;38856:6;38852:14;38845:58;38937:12;38932:2;38924:6;38920:15;38913:37;38728:229;:::o;38963:228::-;39103:34;39099:1;39091:6;39087:14;39080:58;39172:11;39167:2;39159:6;39155:15;39148:36;38963:228;:::o;39197:182::-;39337:34;39333:1;39325:6;39321:14;39314:58;39197:182;:::o;39385:231::-;39525:34;39521:1;39513:6;39509:14;39502:58;39594:14;39589:2;39581:6;39577:15;39570:39;39385:231;:::o;39622:155::-;39762:7;39758:1;39750:6;39746:14;39739:31;39622:155;:::o;39783:182::-;39923:34;39919:1;39911:6;39907:14;39900:58;39783:182;:::o;39971:228::-;40111:34;40107:1;40099:6;40095:14;40088:58;40180:11;40175:2;40167:6;40163:15;40156:36;39971:228;:::o;40205:234::-;40345:34;40341:1;40333:6;40329:14;40322:58;40414:17;40409:2;40401:6;40397:15;40390:42;40205:234;:::o;40445:220::-;40585:34;40581:1;40573:6;40569:14;40562:58;40654:3;40649:2;40641:6;40637:15;40630:28;40445:220;:::o;40671:236::-;40811:34;40807:1;40799:6;40795:14;40788:58;40880:19;40875:2;40867:6;40863:15;40856:44;40671:236;:::o;40913:231::-;41053:34;41049:1;41041:6;41037:14;41030:58;41122:14;41117:2;41109:6;41105:15;41098:39;40913:231;:::o;41150:122::-;41223:24;41241:5;41223:24;:::i;:::-;41216:5;41213:35;41203:63;;41262:1;41259;41252:12;41203:63;41150:122;:::o;41278:116::-;41348:21;41363:5;41348:21;:::i;:::-;41341:5;41338:32;41328:60;;41384:1;41381;41374:12;41328:60;41278:116;:::o;41400:120::-;41472:23;41489:5;41472:23;:::i;:::-;41465:5;41462:34;41452:62;;41510:1;41507;41500:12;41452:62;41400:120;:::o;41526:122::-;41599:24;41617:5;41599:24;:::i;:::-;41592:5;41589:35;41579:63;;41638:1;41635;41628:12;41579:63;41526:122;:::o

Swarm Source

ipfs://eeda6046fef58eb0ac8d66c01e1c8aa9a265af22efe34e18780c3801f9da721d
Loading