ETH Price: $3,714.68 (+3.37%)

Token

Fat Punks (FATTY)
 

Overview

Max Total Supply

999 FATTY

Holders

451

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FATTY
0xa13bf3555194c8a65c2ac6324731852d6ecf2638
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A collection of 999 concerningly overweight punks. Originally minted for free on September 3rd 2021.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FatPunks

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.8.0;

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol

pragma solidity ^0.8.0;

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.8.0;

/**
 * @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}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract FatPunks is ERC721Enumerable, Ownable {
    
    using Strings for uint256;
    
    string _baseTokenURI;
    uint256 private _maxMint = 3;
    uint256 private _price = 3 * 10**16; //0.03 ETH;
    bool public _paused = true;
    uint public constant MAX_ENTRIES = 1000;
    
    constructor(string memory baseURI) ERC721("Fat Punks", "FATTY")  {
        setBaseURI(baseURI);
        
        // Mint first 15 fat punks to owner
         mint(msg.sender, 15);
    }
    
    function mint(address _to, uint256 num) public payable {
        uint256 supply = totalSupply();
        
        if(msg.sender != owner()) {
          require(!_paused, "Sale Paused");
          require(balanceOf(msg.sender) + num < 4, "Exceeds maximum fatties minted per wallet.");
          require( num < (4),"You can mint a max of 3 fatties." );
          require( msg.value >= _price,"Ether sent is not correct" );
        }
        
        require( supply + num < MAX_ENTRIES,"Exceeds maximum supply" );
        for(uint256 i; i < num; i++){
          _safeMint( _to, supply + i );
        }
    }
    
    function walletOfOwner(address _owner) public 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 getPrice() public view returns (uint256){
        if(msg.sender == owner()) {
            return 0;
        }
        return _price;
    }
    
    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }
    
    function getMaxMint() public view returns (uint256){
        return _maxMint;
    }
    
    function setMaxMint(uint256 _newMaxMint) public onlyOwner() {
        _maxMint = _newMaxMint;
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }
    
    function pause(bool val) public onlyOwner {
        _paused = val;
    }
    
    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526003600c55666a94d74f430000600d556001600e60006101000a81548160ff0219169083151502179055503480156200003c57600080fd5b5060405162005c3538038062005c358339818101604052810190620000629190620010b8565b6040518060400160405280600981526020017f4661742050756e6b7300000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f46415454590000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e692919062000f53565b508060019080519060200190620000ff92919062000f53565b505050600062000114620001de60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001c481620001e660201b60201c565b620001d733600f6200029160201b60201c565b50620019d0565b600033905090565b620001f6620001de60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200021c620004c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000275576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026c9062001428565b60405180910390fd5b80600b90805190602001906200028d92919062000f53565b5050565b6000620002a3620004f260201b60201c565b9050620002b5620004c860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200042d57600e60009054906101000a900460ff16156200033b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033290620013e4565b60405180910390fd5b6004826200034f33620004ff60201b60201c565b6200035b91906200151a565b106200039e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003959062001406565b60405180910390fd5b60048210620003e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003db90620013a0565b60405180910390fd5b600d543410156200042c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000423906200146c565b60405180910390fd5b5b6103e882826200043e91906200151a565b1062000481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000478906200144a565b60405180910390fd5b60005b82811015620004c257620004ac848284620004a091906200151a565b620005ba60201b60201c565b8080620004b990620016be565b91505062000484565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600880549050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000573576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200056a906200137e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b620005dc828260405180602001604052806000815250620005e060201b60201c565b5050565b620005f283836200064e60201b60201c565b6200060760008484846200083460201b60201c565b62000649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000640906200133a565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006b890620013c2565b60405180910390fd5b620006d281620009ee60201b60201c565b1562000715576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070c906200135c565b60405180910390fd5b620007296000838362000a5a60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200077b91906200151a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008628473ffffffffffffffffffffffffffffffffffffffff1662000ba160201b62001a251760201c565b15620009e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000894620001de60201b60201c565b8786866040518563ffffffff1660e01b8152600401620008b89493929190620012e6565b602060405180830381600087803b158015620008d357600080fd5b505af19250505080156200090757506040513d601f19601f820116820180604052508101906200090491906200108c565b60015b62000990573d80600081146200093a576040519150601f19603f3d011682016040523d82523d6000602084013e6200093f565b606091505b5060008151141562000988576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200097f906200133a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620009e6565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000a7283838362000bb460201b62001a381760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000abf5762000ab98162000bb960201b60201c565b62000b07565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b065762000b05838262000c0260201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b545762000b4e8162000d7f60201b60201c565b62000b9c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000b9b5762000b9a828262000ec760201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000c1c84620004ff60201b620011131760201c565b62000c28919062001577565b905060006007600084815260200190815260200160002054905081811462000d0e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000d95919062001577565b905060006009600084815260200190815260200160002054905060006008838154811062000dec577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811062000e35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000eab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600062000edf83620004ff60201b620011131760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805462000f619062001652565b90600052602060002090601f01602090048101928262000f85576000855562000fd1565b82601f1062000fa057805160ff191683800117855562000fd1565b8280016001018555821562000fd1579182015b8281111562000fd057825182559160200191906001019062000fb3565b5b50905062000fe0919062000fe4565b5090565b5b8082111562000fff57600081600090555060010162000fe5565b5090565b60006200101a6200101484620014b7565b6200148e565b9050828152602081018484840111156200103357600080fd5b620010408482856200161c565b509392505050565b6000815190506200105981620019b6565b92915050565b600082601f8301126200107157600080fd5b81516200108384826020860162001003565b91505092915050565b6000602082840312156200109f57600080fd5b6000620010af8482850162001048565b91505092915050565b600060208284031215620010cb57600080fd5b600082015167ffffffffffffffff811115620010e657600080fd5b620010f4848285016200105f565b91505092915050565b6200110881620015b2565b82525050565b60006200111b82620014ed565b620011278185620014f8565b9350620011398185602086016200161c565b620011448162001799565b840191505092915050565b60006200115e60328362001509565b91506200116b82620017aa565b604082019050919050565b600062001185601c8362001509565b91506200119282620017f9565b602082019050919050565b6000620011ac602a8362001509565b9150620011b98262001822565b604082019050919050565b6000620011d360208362001509565b9150620011e08262001871565b602082019050919050565b6000620011fa60208362001509565b915062001207826200189a565b602082019050919050565b600062001221600b8362001509565b91506200122e82620018c3565b602082019050919050565b600062001248602a8362001509565b91506200125582620018ec565b604082019050919050565b60006200126f60208362001509565b91506200127c826200193b565b602082019050919050565b60006200129660168362001509565b9150620012a38262001964565b602082019050919050565b6000620012bd60198362001509565b9150620012ca826200198d565b602082019050919050565b620012e08162001612565b82525050565b6000608082019050620012fd6000830187620010fd565b6200130c6020830186620010fd565b6200131b6040830185620012d5565b81810360608301526200132f81846200110e565b905095945050505050565b6000602082019050818103600083015262001355816200114f565b9050919050565b60006020820190508181036000830152620013778162001176565b9050919050565b6000602082019050818103600083015262001399816200119d565b9050919050565b60006020820190508181036000830152620013bb81620011c4565b9050919050565b60006020820190508181036000830152620013dd81620011eb565b9050919050565b60006020820190508181036000830152620013ff8162001212565b9050919050565b60006020820190508181036000830152620014218162001239565b9050919050565b60006020820190508181036000830152620014438162001260565b9050919050565b60006020820190508181036000830152620014658162001287565b9050919050565b600060208201905081810360008301526200148781620012ae565b9050919050565b60006200149a620014ad565b9050620014a8828262001688565b919050565b6000604051905090565b600067ffffffffffffffff821115620014d557620014d46200176a565b5b620014e08262001799565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620015278262001612565b9150620015348362001612565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200156c576200156b6200170c565b5b828201905092915050565b6000620015848262001612565b9150620015918362001612565b925082821015620015a757620015a66200170c565b5b828203905092915050565b6000620015bf82620015f2565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200163c5780820151818401526020810190506200161f565b838111156200164c576000848401525b50505050565b600060028204905060018216806200166b57607f821691505b602082108114156200168257620016816200173b565b5b50919050565b620016938262001799565b810181811067ffffffffffffffff82111715620016b557620016b46200176a565b5b80604052505050565b6000620016cb8262001612565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200170157620017006200170c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178206f66203320666174746965732e600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b7f45786365656473206d6178696d756d2066617474696573206d696e746564207060008201527f65722077616c6c65742e00000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b620019c181620015c6565b8114620019cd57600080fd5b50565b61425580620019e06000396000f3fe6080604052600436106101cd5760003560e01c806355f804b3116100f757806391b7f5ed11610095578063b88d4fde11610064578063b88d4fde1461065a578063c87b56dd14610683578063e985e9c5146106c0578063f2fde38b146106fd576101cd565b806391b7f5ed146105b257806395d89b41146105db57806398d5fdca14610606578063a22cb46514610631576101cd565b8063715018a6116100d1578063715018a61461053b5780637d4cb96414610552578063853828b61461057d5780638da5cb5b14610587576101cd565b806355f804b3146104985780636352211e146104c157806370a08231146104fe576101cd565b80631f46452f1161016f57806342842e0e1161013e57806342842e0e146103cc578063438b6300146103f55780634f6ccce714610432578063547520fe1461046f576101cd565b80631f46452f1461031f57806323b872dd1461034a5780632f745c591461037357806340c10f19146103b0576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c61ccc146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806302329a291461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ea1565b610726565b6040516102069190613484565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612e78565b6107a0565b005b34801561024457600080fd5b5061024d610839565b60405161025a919061349f565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612f34565b6108cb565b60405161029791906133fb565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612e3c565b610950565b005b3480156102d557600080fd5b506102de610a68565b6040516102eb9190613484565b60405180910390f35b34801561030057600080fd5b50610309610a7b565b60405161031691906137a1565b60405180910390f35b34801561032b57600080fd5b50610334610a88565b60405161034191906137a1565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612d36565b610a92565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612e3c565b610af2565b6040516103a791906137a1565b60405180910390f35b6103ca60048036038101906103c59190612e3c565b610b97565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612d36565b610d94565b005b34801561040157600080fd5b5061041c60048036038101906104179190612cd1565b610db4565b6040516104299190613462565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612f34565b610eae565b60405161046691906137a1565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612f34565b610f45565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612ef3565b610fcb565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612f34565b611061565b6040516104f591906133fb565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612cd1565b611113565b60405161053291906137a1565b60405180910390f35b34801561054757600080fd5b506105506111cb565b005b34801561055e57600080fd5b50610567611308565b60405161057491906137a1565b60405180910390f35b61058561130e565b005b34801561059357600080fd5b5061059c6113ca565b6040516105a991906133fb565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612f34565b6113f4565b005b3480156105e757600080fd5b506105f061147a565b6040516105fd919061349f565b60405180910390f35b34801561061257600080fd5b5061061b61150c565b60405161062891906137a1565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612e00565b61155b565b005b34801561066657600080fd5b50610681600480360381019061067c9190612d85565b6116dc565b005b34801561068f57600080fd5b506106aa60048036038101906106a59190612f34565b61173e565b6040516106b7919061349f565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190612cfa565b6117e5565b6040516106f49190613484565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612cd1565b611879565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882611a3d565b5b9050919050565b6107a8611b1f565b73ffffffffffffffffffffffffffffffffffffffff166107c66113ca565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906136a1565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606000805461084890613a30565b80601f016020809104026020016040519081016040528092919081815260200182805461087490613a30565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b60006108d682611b27565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c90613681565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095b82611061565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c390613701565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109eb611b1f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1a5750610a1981610a14611b1f565b6117e5565b5b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906135a1565b60405180910390fd5b610a638383611b93565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b6000600c54905090565b610aa3610a9d611b1f565b82611c4c565b610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613761565b60405180910390fd5b610aed838383611d2a565b505050565b6000610afd83611113565b8210610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b35906134c1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ba1610a7b565b9050610bab6113ca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d0c57600e60009054906101000a900460ff1615610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613641565b60405180910390fd5b600482610c3933611113565b610c4391906138bf565b10610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90613661565b60405180910390fd5b60048210610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90613601565b60405180910390fd5b600d54341015610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290613741565b60405180910390fd5b5b6103e88282610d1b91906138bf565b10610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613721565b60405180910390fd5b60005b82811015610d8e57610d7b848284610d7691906138bf565b611f86565b8080610d8690613a93565b915050610d5e565b50505050565b610daf838383604051806020016040528060008152506116dc565b505050565b60606000610dc183611113565b905060008167ffffffffffffffff811115610e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e335781602001602082028036833780820191505090505b50905060005b82811015610ea357610e4b8582610af2565b828281518110610e84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610e9b90613a93565b915050610e39565b508092505050919050565b6000610eb8610a7b565b8210610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613781565b60405180910390fd5b60088281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f4d611b1f565b73ffffffffffffffffffffffffffffffffffffffff16610f6b6113ca565b73ffffffffffffffffffffffffffffffffffffffff1614610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb8906136a1565b60405180910390fd5b80600c8190555050565b610fd3611b1f565b73ffffffffffffffffffffffffffffffffffffffff16610ff16113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906136a1565b60405180910390fd5b80600b908051906020019061105d929190612af5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561110a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611101906135e1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b906135c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d3611b1f565b73ffffffffffffffffffffffffffffffffffffffff166111f16113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6103e881565b611316611b1f565b73ffffffffffffffffffffffffffffffffffffffff166113346113ca565b73ffffffffffffffffffffffffffffffffffffffff161461138a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611381906136a1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113c857600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113fc611b1f565b73ffffffffffffffffffffffffffffffffffffffff1661141a6113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611467906136a1565b60405180910390fd5b80600d8190555050565b60606001805461148990613a30565b80601f01602080910402602001604051908101604052809291908181526020018280546114b590613a30565b80156115025780601f106114d757610100808354040283529160200191611502565b820191906000526020600020905b8154815290600101906020018083116114e557829003601f168201915b5050505050905090565b60006115166113ca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156115525760009050611558565b600d5490505b90565b611563611b1f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890613561565b60405180910390fd5b80600560006115de611b1f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b611b1f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d09190613484565b60405180910390a35050565b6116ed6116e7611b1f565b83611c4c565b61172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613761565b60405180910390fd5b61173884848484611fa4565b50505050565b606061174982611b27565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906136e1565b60405180910390fd5b6000611792612000565b905060008151116117b257604051806020016040528060008152506117dd565b806117bc84612092565b6040516020016117cd9291906133d7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611881611b1f565b73ffffffffffffffffffffffffffffffffffffffff1661189f6113ca565b73ffffffffffffffffffffffffffffffffffffffff16146118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613501565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b185750611b178261223f565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c0683611061565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c5782611b27565b611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613581565b60405180910390fd5b6000611ca183611061565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1057508373ffffffffffffffffffffffffffffffffffffffff16611cf8846108cb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d215750611d2081856117e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d4a82611061565b73ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906136c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790613541565b60405180910390fd5b611e1b8383836122a9565b611e26600082611b93565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e769190613946565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecd91906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fa08282604051806020016040528060008152506123bd565b5050565b611faf848484611d2a565b611fbb84848484612418565b611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff1906134e1565b60405180910390fd5b50505050565b6060600b805461200f90613a30565b80601f016020809104026020016040519081016040528092919081815260200182805461203b90613a30565b80156120885780601f1061205d57610100808354040283529160200191612088565b820191906000526020600020905b81548152906001019060200180831161206b57829003601f168201915b5050505050905090565b606060008214156120da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061223a565b600082905060005b6000821461210c5780806120f590613a93565b915050600a826121059190613915565b91506120e2565b60008167ffffffffffffffff81111561214e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121805781602001600182028036833780820191505090505b5090505b60008514612233576001826121999190613946565b9150600a856121a89190613adc565b60306121b491906138bf565b60f81b8183815181106121f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561222c9190613915565b9450612184565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122b4838383611a38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122f7576122f2816125af565b612336565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123355761233483826125f8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123795761237481612765565b6123b8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123b7576123b682826128a8565b5b5b505050565b6123c78383612927565b6123d46000848484612418565b612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240a906134e1565b60405180910390fd5b505050565b60006124398473ffffffffffffffffffffffffffffffffffffffff16611a25565b156125a2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612462611b1f565b8786866040518563ffffffff1660e01b81526004016124849493929190613416565b602060405180830381600087803b15801561249e57600080fd5b505af19250505080156124cf57506040513d601f19601f820116820180604052508101906124cc9190612eca565b60015b612552573d80600081146124ff576040519150601f19603f3d011682016040523d82523d6000602084013e612504565b606091505b5060008151141561254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906134e1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125a7565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161260584611113565b61260f9190613946565b90506000600760008481526020019081526020016000205490508181146126f4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127799190613946565b90506000600960008481526020019081526020016000205490506000600883815481106127cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612817577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128b383611113565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90613621565b60405180910390fd5b6129a081611b27565b156129e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d790613521565b60405180910390fd5b6129ec600083836122a9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3c91906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b0190613a30565b90600052602060002090601f016020900481019282612b235760008555612b6a565b82601f10612b3c57805160ff1916838001178555612b6a565b82800160010185558215612b6a579182015b82811115612b69578251825591602001919060010190612b4e565b5b509050612b779190612b7b565b5090565b5b80821115612b94576000816000905550600101612b7c565b5090565b6000612bab612ba6846137e1565b6137bc565b905082815260208101848484011115612bc357600080fd5b612bce8482856139ee565b509392505050565b6000612be9612be484613812565b6137bc565b905082815260208101848484011115612c0157600080fd5b612c0c8482856139ee565b509392505050565b600081359050612c23816141c3565b92915050565b600081359050612c38816141da565b92915050565b600081359050612c4d816141f1565b92915050565b600081519050612c62816141f1565b92915050565b600082601f830112612c7957600080fd5b8135612c89848260208601612b98565b91505092915050565b600082601f830112612ca357600080fd5b8135612cb3848260208601612bd6565b91505092915050565b600081359050612ccb81614208565b92915050565b600060208284031215612ce357600080fd5b6000612cf184828501612c14565b91505092915050565b60008060408385031215612d0d57600080fd5b6000612d1b85828601612c14565b9250506020612d2c85828601612c14565b9150509250929050565b600080600060608486031215612d4b57600080fd5b6000612d5986828701612c14565b9350506020612d6a86828701612c14565b9250506040612d7b86828701612cbc565b9150509250925092565b60008060008060808587031215612d9b57600080fd5b6000612da987828801612c14565b9450506020612dba87828801612c14565b9350506040612dcb87828801612cbc565b925050606085013567ffffffffffffffff811115612de857600080fd5b612df487828801612c68565b91505092959194509250565b60008060408385031215612e1357600080fd5b6000612e2185828601612c14565b9250506020612e3285828601612c29565b9150509250929050565b60008060408385031215612e4f57600080fd5b6000612e5d85828601612c14565b9250506020612e6e85828601612cbc565b9150509250929050565b600060208284031215612e8a57600080fd5b6000612e9884828501612c29565b91505092915050565b600060208284031215612eb357600080fd5b6000612ec184828501612c3e565b91505092915050565b600060208284031215612edc57600080fd5b6000612eea84828501612c53565b91505092915050565b600060208284031215612f0557600080fd5b600082013567ffffffffffffffff811115612f1f57600080fd5b612f2b84828501612c92565b91505092915050565b600060208284031215612f4657600080fd5b6000612f5484828501612cbc565b91505092915050565b6000612f6983836133b9565b60208301905092915050565b612f7e8161397a565b82525050565b6000612f8f82613853565b612f998185613881565b9350612fa483613843565b8060005b83811015612fd5578151612fbc8882612f5d565b9750612fc783613874565b925050600181019050612fa8565b5085935050505092915050565b612feb8161398c565b82525050565b6000612ffc8261385e565b6130068185613892565b93506130168185602086016139fd565b61301f81613bc9565b840191505092915050565b600061303582613869565b61303f81856138a3565b935061304f8185602086016139fd565b61305881613bc9565b840191505092915050565b600061306e82613869565b61307881856138b4565b93506130888185602086016139fd565b80840191505092915050565b60006130a1602b836138a3565b91506130ac82613bda565b604082019050919050565b60006130c46032836138a3565b91506130cf82613c29565b604082019050919050565b60006130e76026836138a3565b91506130f282613c78565b604082019050919050565b600061310a601c836138a3565b915061311582613cc7565b602082019050919050565b600061312d6024836138a3565b915061313882613cf0565b604082019050919050565b60006131506019836138a3565b915061315b82613d3f565b602082019050919050565b6000613173602c836138a3565b915061317e82613d68565b604082019050919050565b60006131966038836138a3565b91506131a182613db7565b604082019050919050565b60006131b9602a836138a3565b91506131c482613e06565b604082019050919050565b60006131dc6029836138a3565b91506131e782613e55565b604082019050919050565b60006131ff6020836138a3565b915061320a82613ea4565b602082019050919050565b60006132226020836138a3565b915061322d82613ecd565b602082019050919050565b6000613245600b836138a3565b915061325082613ef6565b602082019050919050565b6000613268602a836138a3565b915061327382613f1f565b604082019050919050565b600061328b602c836138a3565b915061329682613f6e565b604082019050919050565b60006132ae6020836138a3565b91506132b982613fbd565b602082019050919050565b60006132d16029836138a3565b91506132dc82613fe6565b604082019050919050565b60006132f4602f836138a3565b91506132ff82614035565b604082019050919050565b60006133176021836138a3565b915061332282614084565b604082019050919050565b600061333a6016836138a3565b9150613345826140d3565b602082019050919050565b600061335d6019836138a3565b9150613368826140fc565b602082019050919050565b60006133806031836138a3565b915061338b82614125565b604082019050919050565b60006133a3602c836138a3565b91506133ae82614174565b604082019050919050565b6133c2816139e4565b82525050565b6133d1816139e4565b82525050565b60006133e38285613063565b91506133ef8284613063565b91508190509392505050565b60006020820190506134106000830184612f75565b92915050565b600060808201905061342b6000830187612f75565b6134386020830186612f75565b61344560408301856133c8565b81810360608301526134578184612ff1565b905095945050505050565b6000602082019050818103600083015261347c8184612f84565b905092915050565b60006020820190506134996000830184612fe2565b92915050565b600060208201905081810360008301526134b9818461302a565b905092915050565b600060208201905081810360008301526134da81613094565b9050919050565b600060208201905081810360008301526134fa816130b7565b9050919050565b6000602082019050818103600083015261351a816130da565b9050919050565b6000602082019050818103600083015261353a816130fd565b9050919050565b6000602082019050818103600083015261355a81613120565b9050919050565b6000602082019050818103600083015261357a81613143565b9050919050565b6000602082019050818103600083015261359a81613166565b9050919050565b600060208201905081810360008301526135ba81613189565b9050919050565b600060208201905081810360008301526135da816131ac565b9050919050565b600060208201905081810360008301526135fa816131cf565b9050919050565b6000602082019050818103600083015261361a816131f2565b9050919050565b6000602082019050818103600083015261363a81613215565b9050919050565b6000602082019050818103600083015261365a81613238565b9050919050565b6000602082019050818103600083015261367a8161325b565b9050919050565b6000602082019050818103600083015261369a8161327e565b9050919050565b600060208201905081810360008301526136ba816132a1565b9050919050565b600060208201905081810360008301526136da816132c4565b9050919050565b600060208201905081810360008301526136fa816132e7565b9050919050565b6000602082019050818103600083015261371a8161330a565b9050919050565b6000602082019050818103600083015261373a8161332d565b9050919050565b6000602082019050818103600083015261375a81613350565b9050919050565b6000602082019050818103600083015261377a81613373565b9050919050565b6000602082019050818103600083015261379a81613396565b9050919050565b60006020820190506137b660008301846133c8565b92915050565b60006137c66137d7565b90506137d28282613a62565b919050565b6000604051905090565b600067ffffffffffffffff8211156137fc576137fb613b9a565b5b61380582613bc9565b9050602081019050919050565b600067ffffffffffffffff82111561382d5761382c613b9a565b5b61383682613bc9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ca826139e4565b91506138d5836139e4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390a57613909613b0d565b5b828201905092915050565b6000613920826139e4565b915061392b836139e4565b92508261393b5761393a613b3c565b5b828204905092915050565b6000613951826139e4565b915061395c836139e4565b92508282101561396f5761396e613b0d565b5b828203905092915050565b6000613985826139c4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a1b578082015181840152602081019050613a00565b83811115613a2a576000848401525b50505050565b60006002820490506001821680613a4857607f821691505b60208210811415613a5c57613a5b613b6b565b5b50919050565b613a6b82613bc9565b810181811067ffffffffffffffff82111715613a8a57613a89613b9a565b5b80604052505050565b6000613a9e826139e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad157613ad0613b0d565b5b600182019050919050565b6000613ae7826139e4565b9150613af2836139e4565b925082613b0257613b01613b3c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178206f66203320666174746965732e600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b7f45786365656473206d6178696d756d2066617474696573206d696e746564207060008201527f65722077616c6c65742e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141cc8161397a565b81146141d757600080fd5b50565b6141e38161398c565b81146141ee57600080fd5b50565b6141fa81613998565b811461420557600080fd5b50565b614211816139e4565b811461421c57600080fd5b5056fea2646970667358221220b7295b863b88efcb5807b293cdf5f128c7fc3abd875352e304726b757c23d5de64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000035442440000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806355f804b3116100f757806391b7f5ed11610095578063b88d4fde11610064578063b88d4fde1461065a578063c87b56dd14610683578063e985e9c5146106c0578063f2fde38b146106fd576101cd565b806391b7f5ed146105b257806395d89b41146105db57806398d5fdca14610606578063a22cb46514610631576101cd565b8063715018a6116100d1578063715018a61461053b5780637d4cb96414610552578063853828b61461057d5780638da5cb5b14610587576101cd565b806355f804b3146104985780636352211e146104c157806370a08231146104fe576101cd565b80631f46452f1161016f57806342842e0e1161013e57806342842e0e146103cc578063438b6300146103f55780634f6ccce714610432578063547520fe1461046f576101cd565b80631f46452f1461031f57806323b872dd1461034a5780632f745c591461037357806340c10f19146103b0576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c61ccc146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806302329a291461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612ea1565b610726565b6040516102069190613484565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612e78565b6107a0565b005b34801561024457600080fd5b5061024d610839565b60405161025a919061349f565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612f34565b6108cb565b60405161029791906133fb565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612e3c565b610950565b005b3480156102d557600080fd5b506102de610a68565b6040516102eb9190613484565b60405180910390f35b34801561030057600080fd5b50610309610a7b565b60405161031691906137a1565b60405180910390f35b34801561032b57600080fd5b50610334610a88565b60405161034191906137a1565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612d36565b610a92565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612e3c565b610af2565b6040516103a791906137a1565b60405180910390f35b6103ca60048036038101906103c59190612e3c565b610b97565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612d36565b610d94565b005b34801561040157600080fd5b5061041c60048036038101906104179190612cd1565b610db4565b6040516104299190613462565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612f34565b610eae565b60405161046691906137a1565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612f34565b610f45565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612ef3565b610fcb565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612f34565b611061565b6040516104f591906133fb565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612cd1565b611113565b60405161053291906137a1565b60405180910390f35b34801561054757600080fd5b506105506111cb565b005b34801561055e57600080fd5b50610567611308565b60405161057491906137a1565b60405180910390f35b61058561130e565b005b34801561059357600080fd5b5061059c6113ca565b6040516105a991906133fb565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612f34565b6113f4565b005b3480156105e757600080fd5b506105f061147a565b6040516105fd919061349f565b60405180910390f35b34801561061257600080fd5b5061061b61150c565b60405161062891906137a1565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612e00565b61155b565b005b34801561066657600080fd5b50610681600480360381019061067c9190612d85565b6116dc565b005b34801561068f57600080fd5b506106aa60048036038101906106a59190612f34565b61173e565b6040516106b7919061349f565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190612cfa565b6117e5565b6040516106f49190613484565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612cd1565b611879565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882611a3d565b5b9050919050565b6107a8611b1f565b73ffffffffffffffffffffffffffffffffffffffff166107c66113ca565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610813906136a1565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b60606000805461084890613a30565b80601f016020809104026020016040519081016040528092919081815260200182805461087490613a30565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b60006108d682611b27565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c90613681565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095b82611061565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c390613701565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109eb611b1f565b73ffffffffffffffffffffffffffffffffffffffff161480610a1a5750610a1981610a14611b1f565b6117e5565b5b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906135a1565b60405180910390fd5b610a638383611b93565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b6000600c54905090565b610aa3610a9d611b1f565b82611c4c565b610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613761565b60405180910390fd5b610aed838383611d2a565b505050565b6000610afd83611113565b8210610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b35906134c1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ba1610a7b565b9050610bab6113ca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d0c57600e60009054906101000a900460ff1615610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613641565b60405180910390fd5b600482610c3933611113565b610c4391906138bf565b10610c83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7a90613661565b60405180910390fd5b60048210610cc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbd90613601565b60405180910390fd5b600d54341015610d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0290613741565b60405180910390fd5b5b6103e88282610d1b91906138bf565b10610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613721565b60405180910390fd5b60005b82811015610d8e57610d7b848284610d7691906138bf565b611f86565b8080610d8690613a93565b915050610d5e565b50505050565b610daf838383604051806020016040528060008152506116dc565b505050565b60606000610dc183611113565b905060008167ffffffffffffffff811115610e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e335781602001602082028036833780820191505090505b50905060005b82811015610ea357610e4b8582610af2565b828281518110610e84577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610e9b90613a93565b915050610e39565b508092505050919050565b6000610eb8610a7b565b8210610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090613781565b60405180910390fd5b60088281548110610f33577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f4d611b1f565b73ffffffffffffffffffffffffffffffffffffffff16610f6b6113ca565b73ffffffffffffffffffffffffffffffffffffffff1614610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb8906136a1565b60405180910390fd5b80600c8190555050565b610fd3611b1f565b73ffffffffffffffffffffffffffffffffffffffff16610ff16113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e906136a1565b60405180910390fd5b80600b908051906020019061105d929190612af5565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561110a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611101906135e1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b906135c1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111d3611b1f565b73ffffffffffffffffffffffffffffffffffffffff166111f16113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123e906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6103e881565b611316611b1f565b73ffffffffffffffffffffffffffffffffffffffff166113346113ca565b73ffffffffffffffffffffffffffffffffffffffff161461138a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611381906136a1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506113c857600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113fc611b1f565b73ffffffffffffffffffffffffffffffffffffffff1661141a6113ca565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611467906136a1565b60405180910390fd5b80600d8190555050565b60606001805461148990613a30565b80601f01602080910402602001604051908101604052809291908181526020018280546114b590613a30565b80156115025780601f106114d757610100808354040283529160200191611502565b820191906000526020600020905b8154815290600101906020018083116114e557829003601f168201915b5050505050905090565b60006115166113ca565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156115525760009050611558565b600d5490505b90565b611563611b1f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c890613561565b60405180910390fd5b80600560006115de611b1f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168b611b1f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d09190613484565b60405180910390a35050565b6116ed6116e7611b1f565b83611c4c565b61172c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172390613761565b60405180910390fd5b61173884848484611fa4565b50505050565b606061174982611b27565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f906136e1565b60405180910390fd5b6000611792612000565b905060008151116117b257604051806020016040528060008152506117dd565b806117bc84612092565b6040516020016117cd9291906133d7565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611881611b1f565b73ffffffffffffffffffffffffffffffffffffffff1661189f6113ca565b73ffffffffffffffffffffffffffffffffffffffff16146118f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ec906136a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613501565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b0857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b185750611b178261223f565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c0683611061565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c5782611b27565b611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613581565b60405180910390fd5b6000611ca183611061565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d1057508373ffffffffffffffffffffffffffffffffffffffff16611cf8846108cb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d215750611d2081856117e5565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d4a82611061565b73ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d97906136c1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0790613541565b60405180910390fd5b611e1b8383836122a9565b611e26600082611b93565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e769190613946565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecd91906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fa08282604051806020016040528060008152506123bd565b5050565b611faf848484611d2a565b611fbb84848484612418565b611ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff1906134e1565b60405180910390fd5b50505050565b6060600b805461200f90613a30565b80601f016020809104026020016040519081016040528092919081815260200182805461203b90613a30565b80156120885780601f1061205d57610100808354040283529160200191612088565b820191906000526020600020905b81548152906001019060200180831161206b57829003601f168201915b5050505050905090565b606060008214156120da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061223a565b600082905060005b6000821461210c5780806120f590613a93565b915050600a826121059190613915565b91506120e2565b60008167ffffffffffffffff81111561214e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121805781602001600182028036833780820191505090505b5090505b60008514612233576001826121999190613946565b9150600a856121a89190613adc565b60306121b491906138bf565b60f81b8183815181106121f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561222c9190613915565b9450612184565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122b4838383611a38565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122f7576122f2816125af565b612336565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123355761233483826125f8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123795761237481612765565b6123b8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123b7576123b682826128a8565b5b5b505050565b6123c78383612927565b6123d46000848484612418565b612413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240a906134e1565b60405180910390fd5b505050565b60006124398473ffffffffffffffffffffffffffffffffffffffff16611a25565b156125a2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612462611b1f565b8786866040518563ffffffff1660e01b81526004016124849493929190613416565b602060405180830381600087803b15801561249e57600080fd5b505af19250505080156124cf57506040513d601f19601f820116820180604052508101906124cc9190612eca565b60015b612552573d80600081146124ff576040519150601f19603f3d011682016040523d82523d6000602084013e612504565b606091505b5060008151141561254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906134e1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125a7565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161260584611113565b61260f9190613946565b90506000600760008481526020019081526020016000205490508181146126f4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127799190613946565b90506000600960008481526020019081526020016000205490506000600883815481106127cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612817577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128b383611113565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298e90613621565b60405180910390fd5b6129a081611b27565b156129e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d790613521565b60405180910390fd5b6129ec600083836122a9565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a3c91906138bf565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b0190613a30565b90600052602060002090601f016020900481019282612b235760008555612b6a565b82601f10612b3c57805160ff1916838001178555612b6a565b82800160010185558215612b6a579182015b82811115612b69578251825591602001919060010190612b4e565b5b509050612b779190612b7b565b5090565b5b80821115612b94576000816000905550600101612b7c565b5090565b6000612bab612ba6846137e1565b6137bc565b905082815260208101848484011115612bc357600080fd5b612bce8482856139ee565b509392505050565b6000612be9612be484613812565b6137bc565b905082815260208101848484011115612c0157600080fd5b612c0c8482856139ee565b509392505050565b600081359050612c23816141c3565b92915050565b600081359050612c38816141da565b92915050565b600081359050612c4d816141f1565b92915050565b600081519050612c62816141f1565b92915050565b600082601f830112612c7957600080fd5b8135612c89848260208601612b98565b91505092915050565b600082601f830112612ca357600080fd5b8135612cb3848260208601612bd6565b91505092915050565b600081359050612ccb81614208565b92915050565b600060208284031215612ce357600080fd5b6000612cf184828501612c14565b91505092915050565b60008060408385031215612d0d57600080fd5b6000612d1b85828601612c14565b9250506020612d2c85828601612c14565b9150509250929050565b600080600060608486031215612d4b57600080fd5b6000612d5986828701612c14565b9350506020612d6a86828701612c14565b9250506040612d7b86828701612cbc565b9150509250925092565b60008060008060808587031215612d9b57600080fd5b6000612da987828801612c14565b9450506020612dba87828801612c14565b9350506040612dcb87828801612cbc565b925050606085013567ffffffffffffffff811115612de857600080fd5b612df487828801612c68565b91505092959194509250565b60008060408385031215612e1357600080fd5b6000612e2185828601612c14565b9250506020612e3285828601612c29565b9150509250929050565b60008060408385031215612e4f57600080fd5b6000612e5d85828601612c14565b9250506020612e6e85828601612cbc565b9150509250929050565b600060208284031215612e8a57600080fd5b6000612e9884828501612c29565b91505092915050565b600060208284031215612eb357600080fd5b6000612ec184828501612c3e565b91505092915050565b600060208284031215612edc57600080fd5b6000612eea84828501612c53565b91505092915050565b600060208284031215612f0557600080fd5b600082013567ffffffffffffffff811115612f1f57600080fd5b612f2b84828501612c92565b91505092915050565b600060208284031215612f4657600080fd5b6000612f5484828501612cbc565b91505092915050565b6000612f6983836133b9565b60208301905092915050565b612f7e8161397a565b82525050565b6000612f8f82613853565b612f998185613881565b9350612fa483613843565b8060005b83811015612fd5578151612fbc8882612f5d565b9750612fc783613874565b925050600181019050612fa8565b5085935050505092915050565b612feb8161398c565b82525050565b6000612ffc8261385e565b6130068185613892565b93506130168185602086016139fd565b61301f81613bc9565b840191505092915050565b600061303582613869565b61303f81856138a3565b935061304f8185602086016139fd565b61305881613bc9565b840191505092915050565b600061306e82613869565b61307881856138b4565b93506130888185602086016139fd565b80840191505092915050565b60006130a1602b836138a3565b91506130ac82613bda565b604082019050919050565b60006130c46032836138a3565b91506130cf82613c29565b604082019050919050565b60006130e76026836138a3565b91506130f282613c78565b604082019050919050565b600061310a601c836138a3565b915061311582613cc7565b602082019050919050565b600061312d6024836138a3565b915061313882613cf0565b604082019050919050565b60006131506019836138a3565b915061315b82613d3f565b602082019050919050565b6000613173602c836138a3565b915061317e82613d68565b604082019050919050565b60006131966038836138a3565b91506131a182613db7565b604082019050919050565b60006131b9602a836138a3565b91506131c482613e06565b604082019050919050565b60006131dc6029836138a3565b91506131e782613e55565b604082019050919050565b60006131ff6020836138a3565b915061320a82613ea4565b602082019050919050565b60006132226020836138a3565b915061322d82613ecd565b602082019050919050565b6000613245600b836138a3565b915061325082613ef6565b602082019050919050565b6000613268602a836138a3565b915061327382613f1f565b604082019050919050565b600061328b602c836138a3565b915061329682613f6e565b604082019050919050565b60006132ae6020836138a3565b91506132b982613fbd565b602082019050919050565b60006132d16029836138a3565b91506132dc82613fe6565b604082019050919050565b60006132f4602f836138a3565b91506132ff82614035565b604082019050919050565b60006133176021836138a3565b915061332282614084565b604082019050919050565b600061333a6016836138a3565b9150613345826140d3565b602082019050919050565b600061335d6019836138a3565b9150613368826140fc565b602082019050919050565b60006133806031836138a3565b915061338b82614125565b604082019050919050565b60006133a3602c836138a3565b91506133ae82614174565b604082019050919050565b6133c2816139e4565b82525050565b6133d1816139e4565b82525050565b60006133e38285613063565b91506133ef8284613063565b91508190509392505050565b60006020820190506134106000830184612f75565b92915050565b600060808201905061342b6000830187612f75565b6134386020830186612f75565b61344560408301856133c8565b81810360608301526134578184612ff1565b905095945050505050565b6000602082019050818103600083015261347c8184612f84565b905092915050565b60006020820190506134996000830184612fe2565b92915050565b600060208201905081810360008301526134b9818461302a565b905092915050565b600060208201905081810360008301526134da81613094565b9050919050565b600060208201905081810360008301526134fa816130b7565b9050919050565b6000602082019050818103600083015261351a816130da565b9050919050565b6000602082019050818103600083015261353a816130fd565b9050919050565b6000602082019050818103600083015261355a81613120565b9050919050565b6000602082019050818103600083015261357a81613143565b9050919050565b6000602082019050818103600083015261359a81613166565b9050919050565b600060208201905081810360008301526135ba81613189565b9050919050565b600060208201905081810360008301526135da816131ac565b9050919050565b600060208201905081810360008301526135fa816131cf565b9050919050565b6000602082019050818103600083015261361a816131f2565b9050919050565b6000602082019050818103600083015261363a81613215565b9050919050565b6000602082019050818103600083015261365a81613238565b9050919050565b6000602082019050818103600083015261367a8161325b565b9050919050565b6000602082019050818103600083015261369a8161327e565b9050919050565b600060208201905081810360008301526136ba816132a1565b9050919050565b600060208201905081810360008301526136da816132c4565b9050919050565b600060208201905081810360008301526136fa816132e7565b9050919050565b6000602082019050818103600083015261371a8161330a565b9050919050565b6000602082019050818103600083015261373a8161332d565b9050919050565b6000602082019050818103600083015261375a81613350565b9050919050565b6000602082019050818103600083015261377a81613373565b9050919050565b6000602082019050818103600083015261379a81613396565b9050919050565b60006020820190506137b660008301846133c8565b92915050565b60006137c66137d7565b90506137d28282613a62565b919050565b6000604051905090565b600067ffffffffffffffff8211156137fc576137fb613b9a565b5b61380582613bc9565b9050602081019050919050565b600067ffffffffffffffff82111561382d5761382c613b9a565b5b61383682613bc9565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138ca826139e4565b91506138d5836139e4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561390a57613909613b0d565b5b828201905092915050565b6000613920826139e4565b915061392b836139e4565b92508261393b5761393a613b3c565b5b828204905092915050565b6000613951826139e4565b915061395c836139e4565b92508282101561396f5761396e613b0d565b5b828203905092915050565b6000613985826139c4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a1b578082015181840152602081019050613a00565b83811115613a2a576000848401525b50505050565b60006002820490506001821680613a4857607f821691505b60208210811415613a5c57613a5b613b6b565b5b50919050565b613a6b82613bc9565b810181811067ffffffffffffffff82111715613a8a57613a89613b9a565b5b80604052505050565b6000613a9e826139e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ad157613ad0613b0d565b5b600182019050919050565b6000613ae7826139e4565b9150613af2836139e4565b925082613b0257613b01613b3c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178206f66203320666174746965732e600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b7f45786365656473206d6178696d756d2066617474696573206d696e746564207060008201527f65722077616c6c65742e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6141cc8161397a565b81146141d757600080fd5b50565b6141e38161398c565b81146141ee57600080fd5b50565b6141fa81613998565b811461420557600080fd5b50565b614211816139e4565b811461421c57600080fd5b5056fea2646970667358221220b7295b863b88efcb5807b293cdf5f128c7fc3abd875352e304726b757c23d5de64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000035442440000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): TBD

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [2] : 5442440000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42728:2417:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34242:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44933:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21455:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22915:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22452:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42942:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34895:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44483:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23805:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34563:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43229:619;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24181:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43860:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35085:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44580:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44819:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21149:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20879:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42110:148;;;;;;;;;;;;;:::i;:::-;;42975:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45019:123;;;:::i;:::-;;41459:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44378:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21624:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44214:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23208:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24403:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21799:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23574:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42413:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34242:237;34344:4;34383:35;34368:50;;;:11;:50;;;;:103;;;;34435:36;34459:11;34435:23;:36::i;:::-;34368:103;34361:110;;34242:237;;;:::o;44933:74::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44996:3:::1;44986:7;;:13;;;;;;;;;;;;;;;;;;44933:74:::0;:::o;21455:100::-;21509:13;21542:5;21535:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21455:100;:::o;22915:221::-;22991:7;23019:16;23027:7;23019;:16::i;:::-;23011:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23104:15;:24;23120:7;23104:24;;;;;;;;;;;;;;;;;;;;;23097:31;;22915:221;;;:::o;22452:397::-;22533:13;22549:23;22564:7;22549:14;:23::i;:::-;22533:39;;22597:5;22591:11;;:2;:11;;;;22583:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22677:5;22661:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22686:37;22703:5;22710:12;:10;:12::i;:::-;22686:16;:37::i;:::-;22661:62;22653:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22820:21;22829:2;22833:7;22820:8;:21::i;:::-;22452:397;;;:::o;42942:26::-;;;;;;;;;;;;;:::o;34895:113::-;34956:7;34983:10;:17;;;;34976:24;;34895:113;:::o;44483:85::-;44526:7;44552:8;;44545:15;;44483:85;:::o;23805:305::-;23966:41;23985:12;:10;:12::i;:::-;23999:7;23966:18;:41::i;:::-;23958:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24074:28;24084:4;24090:2;24094:7;24074:9;:28::i;:::-;23805:305;;;:::o;34563:256::-;34660:7;34696:23;34713:5;34696:16;:23::i;:::-;34688:5;:31;34680:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34785:12;:19;34798:5;34785:19;;;;;;;;;;;;;;;:26;34805:5;34785:26;;;;;;;;;;;;34778:33;;34563:256;;;;:::o;43229:619::-;43295:14;43312:13;:11;:13::i;:::-;43295:30;;43363:7;:5;:7::i;:::-;43349:21;;:10;:21;;;43346:321;;43394:7;;;;;;;;;;;43393:8;43385:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;43468:1;43462:3;43438:21;43448:10;43438:9;:21::i;:::-;:27;;;;:::i;:::-;:31;43430:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;43545:1;43538:3;:9;43529:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;43619:6;;43606:9;:19;;43597:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43346:321;43010:4;43705:3;43696:6;:12;;;;:::i;:::-;:26;43687:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43764:9;43760:81;43779:3;43775:1;:7;43760:81;;;43801:28;43812:3;43826:1;43817:6;:10;;;;:::i;:::-;43801:9;:28::i;:::-;43784:3;;;;;:::i;:::-;;;;43760:81;;;;43229:619;;;:::o;24181:151::-;24285:39;24302:4;24308:2;24312:7;24285:39;;;;;;;;;;;;:16;:39::i;:::-;24181:151;;;:::o;43860:342::-;43919:16;43948:18;43969:17;43979:6;43969:9;:17::i;:::-;43948:38;;43999:25;44041:10;44027:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43999:53;;44067:9;44063:106;44082:10;44078:1;:14;44063:106;;;44127:30;44147:6;44155:1;44127:19;:30::i;:::-;44113:8;44122:1;44113:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;44094:3;;;;;:::i;:::-;;;;44063:106;;;;44186:8;44179:15;;;;43860:342;;;:::o;35085:233::-;35160:7;35196:30;:28;:30::i;:::-;35188:5;:38;35180:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35293:10;35304:5;35293:17;;;;;;;;;;;;;;;;;;;;;;;;35286:24;;35085:233;;;:::o;44580:101::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44662:11:::1;44651:8;:22;;;;44580:101:::0;:::o;44819:102::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44906:7:::1;44890:13;:23;;;;;;;;;;;;:::i;:::-;;44819:102:::0;:::o;21149:239::-;21221:7;21241:13;21257:7;:16;21265:7;21257:16;;;;;;;;;;;;;;;;;;;;;21241:32;;21309:1;21292:19;;:5;:19;;;;21284:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21375:5;21368:12;;;21149:239;;;:::o;20879:208::-;20951:7;20996:1;20979:19;;:5;:19;;;;20971:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21063:9;:16;21073:5;21063:16;;;;;;;;;;;;;;;;21056:23;;20879:208;;;:::o;42110:148::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42217:1:::1;42180:40;;42201:6;;;;;;;;;;;42180:40;;;;;;;;;;;;42248:1;42231:6;;:19;;;;;;;;;;;;;;;;;;42110:148::o:0;42975:39::-;43010:4;42975:39;:::o;45019:123::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45094:10:::1;45086:24;;:47;45111:21;45086:47;;;;;;;;;;;;;;;;;;;;;;;45078:56;;;::::0;::::1;;45019:123::o:0;41459:87::-;41505:7;41532:6;;;;;;;;;;;41525:13;;41459:87;:::o;44378:93::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44454:9:::1;44445:6;:18;;;;44378:93:::0;:::o;21624:104::-;21680:13;21713:7;21706:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21624:104;:::o;44214:152::-;44255:7;44291;:5;:7::i;:::-;44277:21;;:10;:21;;;44274:61;;;44322:1;44315:8;;;;44274:61;44352:6;;44345:13;;44214:152;;:::o;23208:295::-;23323:12;:10;:12::i;:::-;23311:24;;:8;:24;;;;23303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23423:8;23378:18;:32;23397:12;:10;:12::i;:::-;23378:32;;;;;;;;;;;;;;;:42;23411:8;23378:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23476:8;23447:48;;23462:12;:10;:12::i;:::-;23447:48;;;23486:8;23447:48;;;;;;:::i;:::-;;;;;;;;23208:295;;:::o;24403:285::-;24535:41;24554:12;:10;:12::i;:::-;24568:7;24535:18;:41::i;:::-;24527:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24641:39;24655:4;24661:2;24665:7;24674:5;24641:13;:39::i;:::-;24403:285;;;;:::o;21799:360::-;21872:13;21906:16;21914:7;21906;:16::i;:::-;21898:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21987:21;22011:10;:8;:10::i;:::-;21987:34;;22063:1;22045:7;22039:21;:25;:112;;;;;;;;;;;;;;;;;22104:7;22113:18;:7;:16;:18::i;:::-;22087:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22039:112;22032:119;;;21799:360;;;:::o;23574:164::-;23671:4;23695:18;:25;23714:5;23695:25;;;;;;;;;;;;;;;:35;23721:8;23695:35;;;;;;;;;;;;;;;;;;;;;;;;;23688:42;;23574:164;;;;:::o;42413:244::-;41690:12;:10;:12::i;:::-;41679:23;;:7;:5;:7::i;:::-;:23;;;41671:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42522:1:::1;42502:22;;:8;:22;;;;42494:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42612:8;42583:38;;42604:6;;;;;;;;;;;42583:38;;;;;;;;;;;;42641:8;42632:6;;:17;;;;;;;;;;;;;;;;;;42413:244:::0;:::o;7954:422::-;8014:4;8222:12;8333:7;8321:20;8313:28;;8367:1;8360:4;:8;8353:15;;;7954:422;;;:::o;32227:93::-;;;;:::o;20523:292::-;20625:4;20664:25;20649:40;;;:11;:40;;;;:105;;;;20721:33;20706:48;;;:11;:48;;;;20649:105;:158;;;;20771:36;20795:11;20771:23;:36::i;:::-;20649:158;20642:165;;20523:292;;;:::o;15833:98::-;15886:7;15913:10;15906:17;;15833:98;:::o;26155:127::-;26220:4;26272:1;26244:30;;:7;:16;26252:7;26244:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26237:37;;26155:127;;;:::o;30032:174::-;30134:2;30107:15;:24;30123:7;30107:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30190:7;30186:2;30152:46;;30161:23;30176:7;30161:14;:23::i;:::-;30152:46;;;;;;;;;;;;30032:174;;:::o;26449:348::-;26542:4;26567:16;26575:7;26567;:16::i;:::-;26559:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26643:13;26659:23;26674:7;26659:14;:23::i;:::-;26643:39;;26712:5;26701:16;;:7;:16;;;:51;;;;26745:7;26721:31;;:20;26733:7;26721:11;:20::i;:::-;:31;;;26701:51;:87;;;;26756:32;26773:5;26780:7;26756:16;:32::i;:::-;26701:87;26693:96;;;26449:348;;;;:::o;29370:544::-;29495:4;29468:31;;:23;29483:7;29468:14;:23::i;:::-;:31;;;29460:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29578:1;29564:16;;:2;:16;;;;29556:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29634:39;29655:4;29661:2;29665:7;29634:20;:39::i;:::-;29738:29;29755:1;29759:7;29738:8;:29::i;:::-;29799:1;29780:9;:15;29790:4;29780:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29828:1;29811:9;:13;29821:2;29811:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29859:2;29840:7;:16;29848:7;29840:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29898:7;29894:2;29879:27;;29888:4;29879:27;;;;;;;;;;;;29370:544;;;:::o;27139:110::-;27215:26;27225:2;27229:7;27215:26;;;;;;;;;;;;:9;:26::i;:::-;27139:110;;:::o;25570:272::-;25684:28;25694:4;25700:2;25704:7;25684:9;:28::i;:::-;25731:48;25754:4;25760:2;25764:7;25773:5;25731:22;:48::i;:::-;25723:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25570:272;;;;:::o;44693:114::-;44753:13;44786;44779:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44693:114;:::o;16488:723::-;16544:13;16774:1;16765:5;:10;16761:53;;;16792:10;;;;;;;;;;;;;;;;;;;;;16761:53;16824:12;16839:5;16824:20;;16855:14;16880:78;16895:1;16887:4;:9;16880:78;;16913:8;;;;;:::i;:::-;;;;16944:2;16936:10;;;;;:::i;:::-;;;16880:78;;;16968:19;17000:6;16990:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16968:39;;17018:154;17034:1;17025:5;:10;17018:154;;17062:1;17052:11;;;;;:::i;:::-;;;17129:2;17121:5;:10;;;;:::i;:::-;17108:2;:24;;;;:::i;:::-;17095:39;;17078:6;17085;17078:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17158:2;17149:11;;;;;:::i;:::-;;;17018:154;;;17196:6;17182:21;;;;;16488:723;;;;:::o;19039:157::-;19124:4;19163:25;19148:40;;;:11;:40;;;;19141:47;;19039:157;;;:::o;35931:555::-;36041:45;36068:4;36074:2;36078:7;36041:26;:45::i;:::-;36119:1;36103:18;;:4;:18;;;36099:187;;;36138:40;36170:7;36138:31;:40::i;:::-;36099:187;;;36208:2;36200:10;;:4;:10;;;36196:90;;36227:47;36260:4;36266:7;36227:32;:47::i;:::-;36196:90;36099:187;36314:1;36300:16;;:2;:16;;;36296:183;;;36333:45;36370:7;36333:36;:45::i;:::-;36296:183;;;36406:4;36400:10;;:2;:10;;;36396:83;;36427:40;36455:2;36459:7;36427:27;:40::i;:::-;36396:83;36296:183;35931:555;;;:::o;27476:250::-;27572:18;27578:2;27582:7;27572:5;:18::i;:::-;27609:54;27640:1;27644:2;27648:7;27657:5;27609:22;:54::i;:::-;27601:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27476:250;;;:::o;30771:843::-;30892:4;30918:15;:2;:13;;;:15::i;:::-;30914:693;;;30970:2;30954:36;;;30991:12;:10;:12::i;:::-;31005:4;31011:7;31020:5;30954:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30950:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31217:1;31200:6;:13;:18;31196:341;;;31243:60;;;;;;;;;;:::i;:::-;;;;;;;;31196:341;31487:6;31481:13;31472:6;31468:2;31464:15;31457:38;30950:602;31087:45;;;31077:55;;;:6;:55;;;;31070:62;;;;;30914:693;31591:4;31584:11;;30771:843;;;;;;;:::o;37209:164::-;37313:10;:17;;;;37286:15;:24;37302:7;37286:24;;;;;;;;;;;:44;;;;37341:10;37357:7;37341:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37209:164;:::o;38000:988::-;38266:22;38316:1;38291:22;38308:4;38291:16;:22::i;:::-;:26;;;;:::i;:::-;38266:51;;38328:18;38349:17;:26;38367:7;38349:26;;;;;;;;;;;;38328:47;;38496:14;38482:10;:28;38478:328;;38527:19;38549:12;:18;38562:4;38549:18;;;;;;;;;;;;;;;:34;38568:14;38549:34;;;;;;;;;;;;38527:56;;38633:11;38600:12;:18;38613:4;38600:18;;;;;;;;;;;;;;;:30;38619:10;38600:30;;;;;;;;;;;:44;;;;38750:10;38717:17;:30;38735:11;38717:30;;;;;;;;;;;:43;;;;38478:328;;38902:17;:26;38920:7;38902:26;;;;;;;;;;;38895:33;;;38946:12;:18;38959:4;38946:18;;;;;;;;;;;;;;;:34;38965:14;38946:34;;;;;;;;;;;38939:41;;;38000:988;;;;:::o;39283:1079::-;39536:22;39581:1;39561:10;:17;;;;:21;;;;:::i;:::-;39536:46;;39593:18;39614:15;:24;39630:7;39614:24;;;;;;;;;;;;39593:45;;39965:19;39987:10;39998:14;39987:26;;;;;;;;;;;;;;;;;;;;;;;;39965:48;;40051:11;40026:10;40037;40026:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40162:10;40131:15;:28;40147:11;40131:28;;;;;;;;;;;:41;;;;40303:15;:24;40319:7;40303:24;;;;;;;;;;;40296:31;;;40338:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39283:1079;;;;:::o;36787:221::-;36872:14;36889:20;36906:2;36889:16;:20::i;:::-;36872:37;;36947:7;36920:12;:16;36933:2;36920:16;;;;;;;;;;;;;;;:24;36937:6;36920:24;;;;;;;;;;;:34;;;;36994:6;36965:17;:26;36983:7;36965:26;;;;;;;;;;;:35;;;;36787:221;;;:::o;28062:382::-;28156:1;28142:16;;:2;:16;;;;28134:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28215:16;28223:7;28215;:16::i;:::-;28214:17;28206:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28277:45;28306:1;28310:2;28314:7;28277:20;:45::i;:::-;28352:1;28335:9;:13;28345:2;28335:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28383:2;28364:7;:16;28372:7;28364:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28428:7;28424:2;28403:33;;28420:1;28403:33;;;;;;;;;;;;28062:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:256::-;4939:6;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:50;5114:7;5105:6;5094:9;5090:22;5072:50;:::i;:::-;5062:60;;5018:114;4946:193;;;;:::o;5145:260::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:2;;;5268:1;5265;5258:12;5220:2;5311:1;5336:52;5380:7;5371:6;5360:9;5356:22;5336:52;:::i;:::-;5326:62;;5282:116;5210:195;;;;:::o;5411:282::-;5480:6;5529:2;5517:9;5508:7;5504:23;5500:32;5497:2;;;5545:1;5542;5535:12;5497:2;5588:1;5613:63;5668:7;5659:6;5648:9;5644:22;5613:63;:::i;:::-;5603:73;;5559:127;5487:206;;;;:::o;5699:375::-;5768:6;5817:2;5805:9;5796:7;5792:23;5788:32;5785:2;;;5833:1;5830;5823:12;5785:2;5904:1;5893:9;5889:17;5876:31;5934:18;5926:6;5923:30;5920:2;;;5966:1;5963;5956:12;5920:2;5994:63;6049:7;6040:6;6029:9;6025:22;5994:63;:::i;:::-;5984:73;;5847:220;5775:299;;;;:::o;6080:262::-;6139:6;6188:2;6176:9;6167:7;6163:23;6159:32;6156:2;;;6204:1;6201;6194:12;6156:2;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6146:196;;;;:::o;6348:179::-;6417:10;6438:46;6480:3;6472:6;6438:46;:::i;:::-;6516:4;6511:3;6507:14;6493:28;;6428:99;;;;:::o;6533:118::-;6620:24;6638:5;6620:24;:::i;:::-;6615:3;6608:37;6598:53;;:::o;6687:732::-;6806:3;6835:54;6883:5;6835:54;:::i;:::-;6905:86;6984:6;6979:3;6905:86;:::i;:::-;6898:93;;7015:56;7065:5;7015:56;:::i;:::-;7094:7;7125:1;7110:284;7135:6;7132:1;7129:13;7110:284;;;7211:6;7205:13;7238:63;7297:3;7282:13;7238:63;:::i;:::-;7231:70;;7324:60;7377:6;7324:60;:::i;:::-;7314:70;;7170:224;7157:1;7154;7150:9;7145:14;;7110:284;;;7114:14;7410:3;7403:10;;6811:608;;;;;;;:::o;7425:109::-;7506:21;7521:5;7506:21;:::i;:::-;7501:3;7494:34;7484:50;;:::o;7540:360::-;7626:3;7654:38;7686:5;7654:38;:::i;:::-;7708:70;7771:6;7766:3;7708:70;:::i;:::-;7701:77;;7787:52;7832:6;7827:3;7820:4;7813:5;7809:16;7787:52;:::i;:::-;7864:29;7886:6;7864:29;:::i;:::-;7859:3;7855:39;7848:46;;7630:270;;;;;:::o;7906:364::-;7994:3;8022:39;8055:5;8022:39;:::i;:::-;8077:71;8141:6;8136:3;8077:71;:::i;:::-;8070:78;;8157:52;8202:6;8197:3;8190:4;8183:5;8179:16;8157:52;:::i;:::-;8234:29;8256:6;8234:29;:::i;:::-;8229:3;8225:39;8218:46;;7998:272;;;;;:::o;8276:377::-;8382:3;8410:39;8443:5;8410:39;:::i;:::-;8465:89;8547:6;8542:3;8465:89;:::i;:::-;8458:96;;8563:52;8608:6;8603:3;8596:4;8589:5;8585:16;8563:52;:::i;:::-;8640:6;8635:3;8631:16;8624:23;;8386:267;;;;;:::o;8659:366::-;8801:3;8822:67;8886:2;8881:3;8822:67;:::i;:::-;8815:74;;8898:93;8987:3;8898:93;:::i;:::-;9016:2;9011:3;9007:12;9000:19;;8805:220;;;:::o;9031:366::-;9173:3;9194:67;9258:2;9253:3;9194:67;:::i;:::-;9187:74;;9270:93;9359:3;9270:93;:::i;:::-;9388:2;9383:3;9379:12;9372:19;;9177:220;;;:::o;9403:366::-;9545:3;9566:67;9630:2;9625:3;9566:67;:::i;:::-;9559:74;;9642:93;9731:3;9642:93;:::i;:::-;9760:2;9755:3;9751:12;9744:19;;9549:220;;;:::o;9775:366::-;9917:3;9938:67;10002:2;9997:3;9938:67;:::i;:::-;9931:74;;10014:93;10103:3;10014:93;:::i;:::-;10132:2;10127:3;10123:12;10116:19;;9921:220;;;:::o;10147:366::-;10289:3;10310:67;10374:2;10369:3;10310:67;:::i;:::-;10303:74;;10386:93;10475:3;10386:93;:::i;:::-;10504:2;10499:3;10495:12;10488:19;;10293:220;;;:::o;10519:366::-;10661:3;10682:67;10746:2;10741:3;10682:67;:::i;:::-;10675:74;;10758:93;10847:3;10758:93;:::i;:::-;10876:2;10871:3;10867:12;10860:19;;10665:220;;;:::o;10891:366::-;11033:3;11054:67;11118:2;11113:3;11054:67;:::i;:::-;11047:74;;11130:93;11219:3;11130:93;:::i;:::-;11248:2;11243:3;11239:12;11232:19;;11037:220;;;:::o;11263:366::-;11405:3;11426:67;11490:2;11485:3;11426:67;:::i;:::-;11419:74;;11502:93;11591:3;11502:93;:::i;:::-;11620:2;11615:3;11611:12;11604:19;;11409:220;;;:::o;11635:366::-;11777:3;11798:67;11862:2;11857:3;11798:67;:::i;:::-;11791:74;;11874:93;11963:3;11874:93;:::i;:::-;11992:2;11987:3;11983:12;11976:19;;11781:220;;;:::o;12007:366::-;12149:3;12170:67;12234:2;12229:3;12170:67;:::i;:::-;12163:74;;12246:93;12335:3;12246:93;:::i;:::-;12364:2;12359:3;12355:12;12348:19;;12153:220;;;:::o;12379:366::-;12521:3;12542:67;12606:2;12601:3;12542:67;:::i;:::-;12535:74;;12618:93;12707:3;12618:93;:::i;:::-;12736:2;12731:3;12727:12;12720:19;;12525:220;;;:::o;12751:366::-;12893:3;12914:67;12978:2;12973:3;12914:67;:::i;:::-;12907:74;;12990:93;13079:3;12990:93;:::i;:::-;13108:2;13103:3;13099:12;13092:19;;12897:220;;;:::o;13123:366::-;13265:3;13286:67;13350:2;13345:3;13286:67;:::i;:::-;13279:74;;13362:93;13451:3;13362:93;:::i;:::-;13480:2;13475:3;13471:12;13464:19;;13269:220;;;:::o;13495:366::-;13637:3;13658:67;13722:2;13717:3;13658:67;:::i;:::-;13651:74;;13734:93;13823:3;13734:93;:::i;:::-;13852:2;13847:3;13843:12;13836:19;;13641:220;;;:::o;13867:366::-;14009:3;14030:67;14094:2;14089:3;14030:67;:::i;:::-;14023:74;;14106:93;14195:3;14106:93;:::i;:::-;14224:2;14219:3;14215:12;14208:19;;14013:220;;;:::o;14239:366::-;14381:3;14402:67;14466:2;14461:3;14402:67;:::i;:::-;14395:74;;14478:93;14567:3;14478:93;:::i;:::-;14596:2;14591:3;14587:12;14580:19;;14385:220;;;:::o;14611:366::-;14753:3;14774:67;14838:2;14833:3;14774:67;:::i;:::-;14767:74;;14850:93;14939:3;14850:93;:::i;:::-;14968:2;14963:3;14959:12;14952:19;;14757:220;;;:::o;14983:366::-;15125:3;15146:67;15210:2;15205:3;15146:67;:::i;:::-;15139:74;;15222:93;15311:3;15222:93;:::i;:::-;15340:2;15335:3;15331:12;15324:19;;15129:220;;;:::o;15355:366::-;15497:3;15518:67;15582:2;15577:3;15518:67;:::i;:::-;15511:74;;15594:93;15683:3;15594:93;:::i;:::-;15712:2;15707:3;15703:12;15696:19;;15501:220;;;:::o;15727:366::-;15869:3;15890:67;15954:2;15949:3;15890:67;:::i;:::-;15883:74;;15966:93;16055:3;15966:93;:::i;:::-;16084:2;16079:3;16075:12;16068:19;;15873:220;;;:::o;16099:366::-;16241:3;16262:67;16326:2;16321:3;16262:67;:::i;:::-;16255:74;;16338:93;16427:3;16338:93;:::i;:::-;16456:2;16451:3;16447:12;16440:19;;16245:220;;;:::o;16471:366::-;16613:3;16634:67;16698:2;16693:3;16634:67;:::i;:::-;16627:74;;16710:93;16799:3;16710:93;:::i;:::-;16828:2;16823:3;16819:12;16812:19;;16617:220;;;:::o;16843:366::-;16985:3;17006:67;17070:2;17065:3;17006:67;:::i;:::-;16999:74;;17082:93;17171:3;17082:93;:::i;:::-;17200:2;17195:3;17191:12;17184:19;;16989:220;;;:::o;17215:108::-;17292:24;17310:5;17292:24;:::i;:::-;17287:3;17280:37;17270:53;;:::o;17329:118::-;17416:24;17434:5;17416:24;:::i;:::-;17411:3;17404:37;17394:53;;:::o;17453:435::-;17633:3;17655:95;17746:3;17737:6;17655:95;:::i;:::-;17648:102;;17767:95;17858:3;17849:6;17767:95;:::i;:::-;17760:102;;17879:3;17872:10;;17637:251;;;;;:::o;17894:222::-;17987:4;18025:2;18014:9;18010:18;18002:26;;18038:71;18106:1;18095:9;18091:17;18082:6;18038:71;:::i;:::-;17992:124;;;;:::o;18122:640::-;18317:4;18355:3;18344:9;18340:19;18332:27;;18369:71;18437:1;18426:9;18422:17;18413:6;18369:71;:::i;:::-;18450:72;18518:2;18507:9;18503:18;18494:6;18450:72;:::i;:::-;18532;18600:2;18589:9;18585:18;18576:6;18532:72;:::i;:::-;18651:9;18645:4;18641:20;18636:2;18625:9;18621:18;18614:48;18679:76;18750:4;18741:6;18679:76;:::i;:::-;18671:84;;18322:440;;;;;;;:::o;18768:373::-;18911:4;18949:2;18938:9;18934:18;18926:26;;18998:9;18992:4;18988:20;18984:1;18973:9;18969:17;18962:47;19026:108;19129:4;19120:6;19026:108;:::i;:::-;19018:116;;18916:225;;;;:::o;19147:210::-;19234:4;19272:2;19261:9;19257:18;19249:26;;19285:65;19347:1;19336:9;19332:17;19323:6;19285:65;:::i;:::-;19239:118;;;;:::o;19363:313::-;19476:4;19514:2;19503:9;19499:18;19491:26;;19563:9;19557:4;19553:20;19549:1;19538:9;19534:17;19527:47;19591:78;19664:4;19655:6;19591:78;:::i;:::-;19583:86;;19481:195;;;;:::o;19682:419::-;19848:4;19886:2;19875:9;19871:18;19863:26;;19935:9;19929:4;19925:20;19921:1;19910:9;19906:17;19899:47;19963:131;20089:4;19963:131;:::i;:::-;19955:139;;19853:248;;;:::o;20107:419::-;20273:4;20311:2;20300:9;20296:18;20288:26;;20360:9;20354:4;20350:20;20346:1;20335:9;20331:17;20324:47;20388:131;20514:4;20388:131;:::i;:::-;20380:139;;20278:248;;;:::o;20532:419::-;20698:4;20736:2;20725:9;20721:18;20713:26;;20785:9;20779:4;20775:20;20771:1;20760:9;20756:17;20749:47;20813:131;20939:4;20813:131;:::i;:::-;20805:139;;20703:248;;;:::o;20957:419::-;21123:4;21161:2;21150:9;21146:18;21138:26;;21210:9;21204:4;21200:20;21196:1;21185:9;21181:17;21174:47;21238:131;21364:4;21238:131;:::i;:::-;21230:139;;21128:248;;;:::o;21382:419::-;21548:4;21586:2;21575:9;21571:18;21563:26;;21635:9;21629:4;21625:20;21621:1;21610:9;21606:17;21599:47;21663:131;21789:4;21663:131;:::i;:::-;21655:139;;21553:248;;;:::o;21807:419::-;21973:4;22011:2;22000:9;21996:18;21988:26;;22060:9;22054:4;22050:20;22046:1;22035:9;22031:17;22024:47;22088:131;22214:4;22088:131;:::i;:::-;22080:139;;21978:248;;;:::o;22232:419::-;22398:4;22436:2;22425:9;22421:18;22413:26;;22485:9;22479:4;22475:20;22471:1;22460:9;22456:17;22449:47;22513:131;22639:4;22513:131;:::i;:::-;22505:139;;22403:248;;;:::o;22657:419::-;22823:4;22861:2;22850:9;22846:18;22838:26;;22910:9;22904:4;22900:20;22896:1;22885:9;22881:17;22874:47;22938:131;23064:4;22938:131;:::i;:::-;22930:139;;22828:248;;;:::o;23082:419::-;23248:4;23286:2;23275:9;23271:18;23263:26;;23335:9;23329:4;23325:20;23321:1;23310:9;23306:17;23299:47;23363:131;23489:4;23363:131;:::i;:::-;23355:139;;23253:248;;;:::o;23507:419::-;23673:4;23711:2;23700:9;23696:18;23688:26;;23760:9;23754:4;23750:20;23746:1;23735:9;23731:17;23724:47;23788:131;23914:4;23788:131;:::i;:::-;23780:139;;23678:248;;;:::o;23932:419::-;24098:4;24136:2;24125:9;24121:18;24113:26;;24185:9;24179:4;24175:20;24171:1;24160:9;24156:17;24149:47;24213:131;24339:4;24213:131;:::i;:::-;24205:139;;24103:248;;;:::o;24357:419::-;24523:4;24561:2;24550:9;24546:18;24538:26;;24610:9;24604:4;24600:20;24596:1;24585:9;24581:17;24574:47;24638:131;24764:4;24638:131;:::i;:::-;24630:139;;24528:248;;;:::o;24782:419::-;24948:4;24986:2;24975:9;24971:18;24963:26;;25035:9;25029:4;25025:20;25021:1;25010:9;25006:17;24999:47;25063:131;25189:4;25063:131;:::i;:::-;25055:139;;24953:248;;;:::o;25207:419::-;25373:4;25411:2;25400:9;25396:18;25388:26;;25460:9;25454:4;25450:20;25446:1;25435:9;25431:17;25424:47;25488:131;25614:4;25488:131;:::i;:::-;25480:139;;25378:248;;;:::o;25632:419::-;25798:4;25836:2;25825:9;25821:18;25813:26;;25885:9;25879:4;25875:20;25871:1;25860:9;25856:17;25849:47;25913:131;26039:4;25913:131;:::i;:::-;25905:139;;25803:248;;;:::o;26057:419::-;26223:4;26261:2;26250:9;26246:18;26238:26;;26310:9;26304:4;26300:20;26296:1;26285:9;26281:17;26274:47;26338:131;26464:4;26338:131;:::i;:::-;26330:139;;26228:248;;;:::o;26482:419::-;26648:4;26686:2;26675:9;26671:18;26663:26;;26735:9;26729:4;26725:20;26721:1;26710:9;26706:17;26699:47;26763:131;26889:4;26763:131;:::i;:::-;26755:139;;26653:248;;;:::o;26907:419::-;27073:4;27111:2;27100:9;27096:18;27088:26;;27160:9;27154:4;27150:20;27146:1;27135:9;27131:17;27124:47;27188:131;27314:4;27188:131;:::i;:::-;27180:139;;27078:248;;;:::o;27332:419::-;27498:4;27536:2;27525:9;27521:18;27513:26;;27585:9;27579:4;27575:20;27571:1;27560:9;27556:17;27549:47;27613:131;27739:4;27613:131;:::i;:::-;27605:139;;27503:248;;;:::o;27757:419::-;27923:4;27961:2;27950:9;27946:18;27938:26;;28010:9;28004:4;28000:20;27996:1;27985:9;27981:17;27974:47;28038:131;28164:4;28038:131;:::i;:::-;28030:139;;27928:248;;;:::o;28182:419::-;28348:4;28386:2;28375:9;28371:18;28363:26;;28435:9;28429:4;28425:20;28421:1;28410:9;28406:17;28399:47;28463:131;28589:4;28463:131;:::i;:::-;28455:139;;28353:248;;;:::o;28607:419::-;28773:4;28811:2;28800:9;28796:18;28788:26;;28860:9;28854:4;28850:20;28846:1;28835:9;28831:17;28824:47;28888:131;29014:4;28888:131;:::i;:::-;28880:139;;28778:248;;;:::o;29032:419::-;29198:4;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29203:248;;;:::o;29457:222::-;29550:4;29588:2;29577:9;29573:18;29565:26;;29601:71;29669:1;29658:9;29654:17;29645:6;29601:71;:::i;:::-;29555:124;;;;:::o;29685:129::-;29719:6;29746:20;;:::i;:::-;29736:30;;29775:33;29803:4;29795:6;29775:33;:::i;:::-;29726:88;;;:::o;29820:75::-;29853:6;29886:2;29880:9;29870:19;;29860:35;:::o;29901:307::-;29962:4;30052:18;30044:6;30041:30;30038:2;;;30074:18;;:::i;:::-;30038:2;30112:29;30134:6;30112:29;:::i;:::-;30104:37;;30196:4;30190;30186:15;30178:23;;29967:241;;;:::o;30214:308::-;30276:4;30366:18;30358:6;30355:30;30352:2;;;30388:18;;:::i;:::-;30352:2;30426:29;30448:6;30426:29;:::i;:::-;30418:37;;30510:4;30504;30500:15;30492:23;;30281:241;;;:::o;30528:132::-;30595:4;30618:3;30610:11;;30648:4;30643:3;30639:14;30631:22;;30600:60;;;:::o;30666:114::-;30733:6;30767:5;30761:12;30751:22;;30740:40;;;:::o;30786:98::-;30837:6;30871:5;30865:12;30855:22;;30844:40;;;:::o;30890:99::-;30942:6;30976:5;30970:12;30960:22;;30949:40;;;:::o;30995:113::-;31065:4;31097;31092:3;31088:14;31080:22;;31070:38;;;:::o;31114:184::-;31213:11;31247:6;31242:3;31235:19;31287:4;31282:3;31278:14;31263:29;;31225:73;;;;:::o;31304:168::-;31387:11;31421:6;31416:3;31409:19;31461:4;31456:3;31452:14;31437:29;;31399:73;;;;:::o;31478:169::-;31562:11;31596:6;31591:3;31584:19;31636:4;31631:3;31627:14;31612:29;;31574:73;;;;:::o;31653:148::-;31755:11;31792:3;31777:18;;31767:34;;;;:::o;31807:305::-;31847:3;31866:20;31884:1;31866:20;:::i;:::-;31861:25;;31900:20;31918:1;31900:20;:::i;:::-;31895:25;;32054:1;31986:66;31982:74;31979:1;31976:81;31973:2;;;32060:18;;:::i;:::-;31973:2;32104:1;32101;32097:9;32090:16;;31851:261;;;;:::o;32118:185::-;32158:1;32175:20;32193:1;32175:20;:::i;:::-;32170:25;;32209:20;32227:1;32209:20;:::i;:::-;32204:25;;32248:1;32238:2;;32253:18;;:::i;:::-;32238:2;32295:1;32292;32288:9;32283:14;;32160:143;;;;:::o;32309:191::-;32349:4;32369:20;32387:1;32369:20;:::i;:::-;32364:25;;32403:20;32421:1;32403:20;:::i;:::-;32398:25;;32442:1;32439;32436:8;32433:2;;;32447:18;;:::i;:::-;32433:2;32492:1;32489;32485:9;32477:17;;32354:146;;;;:::o;32506:96::-;32543:7;32572:24;32590:5;32572:24;:::i;:::-;32561:35;;32551:51;;;:::o;32608:90::-;32642:7;32685:5;32678:13;32671:21;32660:32;;32650:48;;;:::o;32704:149::-;32740:7;32780:66;32773:5;32769:78;32758:89;;32748:105;;;:::o;32859:126::-;32896:7;32936:42;32929:5;32925:54;32914:65;;32904:81;;;:::o;32991:77::-;33028:7;33057:5;33046:16;;33036:32;;;:::o;33074:154::-;33158:6;33153:3;33148;33135:30;33220:1;33211:6;33206:3;33202:16;33195:27;33125:103;;;:::o;33234:307::-;33302:1;33312:113;33326:6;33323:1;33320:13;33312:113;;;33411:1;33406:3;33402:11;33396:18;33392:1;33387:3;33383:11;33376:39;33348:2;33345:1;33341:10;33336:15;;33312:113;;;33443:6;33440:1;33437:13;33434:2;;;33523:1;33514:6;33509:3;33505:16;33498:27;33434:2;33283:258;;;;:::o;33547:320::-;33591:6;33628:1;33622:4;33618:12;33608:22;;33675:1;33669:4;33665:12;33696:18;33686:2;;33752:4;33744:6;33740:17;33730:27;;33686:2;33814;33806:6;33803:14;33783:18;33780:38;33777:2;;;33833:18;;:::i;:::-;33777:2;33598:269;;;;:::o;33873:281::-;33956:27;33978:4;33956:27;:::i;:::-;33948:6;33944:40;34086:6;34074:10;34071:22;34050:18;34038:10;34035:34;34032:62;34029:2;;;34097:18;;:::i;:::-;34029:2;34137:10;34133:2;34126:22;33916:238;;;:::o;34160:233::-;34199:3;34222:24;34240:5;34222:24;:::i;:::-;34213:33;;34268:66;34261:5;34258:77;34255:2;;;34338:18;;:::i;:::-;34255:2;34385:1;34378:5;34374:13;34367:20;;34203:190;;;:::o;34399:176::-;34431:1;34448:20;34466:1;34448:20;:::i;:::-;34443:25;;34482:20;34500:1;34482:20;:::i;:::-;34477:25;;34521:1;34511:2;;34526:18;;:::i;:::-;34511:2;34567:1;34564;34560:9;34555:14;;34433:142;;;;:::o;34581:180::-;34629:77;34626:1;34619:88;34726:4;34723:1;34716:15;34750:4;34747:1;34740:15;34767:180;34815:77;34812:1;34805:88;34912:4;34909:1;34902:15;34936:4;34933:1;34926:15;34953:180;35001:77;34998:1;34991:88;35098:4;35095:1;35088:15;35122:4;35119:1;35112:15;35139:180;35187:77;35184:1;35177:88;35284:4;35281:1;35274:15;35308:4;35305:1;35298:15;35325:102;35366:6;35417:2;35413:7;35408:2;35401:5;35397:14;35393:28;35383:38;;35373:54;;;:::o;35433:230::-;35573:34;35569:1;35561:6;35557:14;35550:58;35642:13;35637:2;35629:6;35625:15;35618:38;35539:124;:::o;35669:237::-;35809:34;35805:1;35797:6;35793:14;35786:58;35878:20;35873:2;35865:6;35861:15;35854:45;35775:131;:::o;35912:225::-;36052:34;36048:1;36040:6;36036:14;36029:58;36121:8;36116:2;36108:6;36104:15;36097:33;36018:119;:::o;36143:178::-;36283:30;36279:1;36271:6;36267:14;36260:54;36249:72;:::o;36327:223::-;36467:34;36463:1;36455:6;36451:14;36444:58;36536:6;36531:2;36523:6;36519:15;36512:31;36433:117;:::o;36556:175::-;36696:27;36692:1;36684:6;36680:14;36673:51;36662:69;:::o;36737:231::-;36877:34;36873:1;36865:6;36861:14;36854:58;36946:14;36941:2;36933:6;36929:15;36922:39;36843:125;:::o;36974:243::-;37114:34;37110:1;37102:6;37098:14;37091:58;37183:26;37178:2;37170:6;37166:15;37159:51;37080:137;:::o;37223:229::-;37363:34;37359:1;37351:6;37347:14;37340:58;37432:12;37427:2;37419:6;37415:15;37408:37;37329:123;:::o;37458:228::-;37598:34;37594:1;37586:6;37582:14;37575:58;37667:11;37662:2;37654:6;37650:15;37643:36;37564:122;:::o;37692:182::-;37832:34;37828:1;37820:6;37816:14;37809:58;37798:76;:::o;37880:182::-;38020:34;38016:1;38008:6;38004:14;37997:58;37986:76;:::o;38068:161::-;38208:13;38204:1;38196:6;38192:14;38185:37;38174:55;:::o;38235:229::-;38375:34;38371:1;38363:6;38359:14;38352:58;38444:12;38439:2;38431:6;38427:15;38420:37;38341:123;:::o;38470:231::-;38610:34;38606:1;38598:6;38594:14;38587:58;38679:14;38674:2;38666:6;38662:15;38655:39;38576:125;:::o;38707:182::-;38847:34;38843:1;38835:6;38831:14;38824:58;38813:76;:::o;38895:228::-;39035:34;39031:1;39023:6;39019:14;39012:58;39104:11;39099:2;39091:6;39087:15;39080:36;39001:122;:::o;39129:234::-;39269:34;39265:1;39257:6;39253:14;39246:58;39338:17;39333:2;39325:6;39321:15;39314:42;39235:128;:::o;39369:220::-;39509:34;39505:1;39497:6;39493:14;39486:58;39578:3;39573:2;39565:6;39561:15;39554:28;39475:114;:::o;39595:172::-;39735:24;39731:1;39723:6;39719:14;39712:48;39701:66;:::o;39773:175::-;39913:27;39909:1;39901:6;39897:14;39890:51;39879:69;:::o;39954:236::-;40094:34;40090:1;40082:6;40078:14;40071:58;40163:19;40158:2;40150:6;40146:15;40139:44;40060:130;:::o;40196:231::-;40336:34;40332:1;40324:6;40320:14;40313:58;40405:14;40400:2;40392:6;40388:15;40381:39;40302:125;:::o;40433:122::-;40506:24;40524:5;40506:24;:::i;:::-;40499:5;40496:35;40486:2;;40545:1;40542;40535:12;40486:2;40476:79;:::o;40561:116::-;40631:21;40646:5;40631:21;:::i;:::-;40624:5;40621:32;40611:2;;40667:1;40664;40657:12;40611:2;40601:76;:::o;40683:120::-;40755:23;40772:5;40755:23;:::i;:::-;40748:5;40745:34;40735:2;;40793:1;40790;40783:12;40735:2;40725:78;:::o;40809:122::-;40882:24;40900:5;40882:24;:::i;:::-;40875:5;40872:35;40862:2;;40921:1;40918;40911:12;40862:2;40852:79;:::o

Swarm Source

ipfs://b7295b863b88efcb5807b293cdf5f128c7fc3abd875352e304726b757c23d5de
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.