ETH Price: $3,400.78 (+3.21%)

Token

MurakamiMfers (MURA-MFERS)
 

Overview

Max Total Supply

3,550 MURA-MFERS

Holders

211

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
sneakingninjapants.eth
Balance
30 MURA-MFERS
0x0E642E32974470085e362FE76DE5C43330632bdb
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MurakamiMfers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (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/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (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/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (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/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/Context.sol


// OpenZeppelin Contracts v4.4.1 (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) {
        return msg.data;
    }
}

// File: contracts/ERC721A.sol


// Creators: locationtba.eth, 2pmflow.eth

pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: 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 override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * 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
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > currentIndex - 1) {
      endIndex = currentIndex - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @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("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

// File: contracts/contract.sol



pragma solidity ^0.8.7;



contract MurakamiMfers is ERC721A, Ownable {

    string public baseURI = "https://ipfs.io/ipfs/QmZcXXhajXVDVNvrjVGJnFiPrSdWX1cRz7Ucuu4E8xp1km/";
    bool public paused;

    uint256 constant public MAX_MINT = 4545;
    uint256 constant public MAX_MINT_PER_TX = 20;
    uint256 public cost = 0.0069 ether;
    uint256 public freemint = 500;

    constructor() ERC721A("MurakamiMfers", "MURA-MFERS", MAX_MINT_PER_TX, MAX_MINT) {}

    function mint(uint256 quantity) external payable {
        require(!paused, "Sale is currently paused.");
        require(quantity > 0, "Mint quantity less than 0.");
        require(totalSupply() + quantity <= MAX_MINT, "Cannot exceed max mint amount.");
        require(quantity <= 20, "Cannot exeeds 1 quantity per tx.");
        require(msg.value >= quantity * cost || totalSupply() + quantity <= freemint, "Exceeds mint quantity or not enough eth sent");

        _safeMint(msg.sender, quantity);
    }

    function devMint(uint256 quantity) external onlyOwner {
        require(totalSupply() + quantity <= MAX_MINT, "Cannot exceed max mint amount");

        _safeMint(msg.sender, quantity);
    }

    function setCost(uint256 _newCost) external onlyOwner() {
        cost = _newCost;
    }

    function setBaseExtension(uint256 _newCost) external onlyOwner() {
        cost = _newCost;
    }

    function setBaseURI(string calldata uri) external onlyOwner {
        baseURI = uri;
    }

    function setFreeMints(uint256 _newFreeMints) external onlyOwner {
        freemint = _newFreeMints;
    }

    function toggleSale() external onlyOwner {
        paused = !paused;
    }

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

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freemint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFreeMints","type":"uint256"}],"name":"setFreeMints","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":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260008055600060075560405180608001604052806044815260200162004c5860449139600990805190602001906200003e92919062000295565b506618838370f34000600b556101f4600c553480156200005d57600080fd5b506040518060400160405280600d81526020017f4d7572616b616d694d66657273000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4d5552412d4d464552530000000000000000000000000000000000000000000081525060146111c16000811162000115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010c90620003b5565b60405180910390fd5b600082116200015b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001529062000393565b60405180910390fd5b83600190805190602001906200017392919062000295565b5082600290805190602001906200018c92919062000295565b508160a08181525050806080818152505050505050620001c1620001b5620001c760201b60201c565b620001cf60201b60201c565b620004eb565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a390620003e8565b90600052602060002090601f016020900481019282620002c7576000855562000313565b82601f10620002e257805160ff191683800117855562000313565b8280016001018555821562000313579182015b8281111562000312578251825591602001919060010190620002f5565b5b50905062000322919062000326565b5090565b5b808211156200034157600081600090555060010162000327565b5090565b600062000354602783620003d7565b915062000361826200044d565b604082019050919050565b60006200037b602e83620003d7565b915062000388826200049c565b604082019050919050565b60006020820190508181036000830152620003ae8162000345565b9050919050565b60006020820190508181036000830152620003d0816200036c565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200040157607f821691505b602082108114156200041857620004176200041e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a05161473c6200051c60003960008181612288015281816122b1015261295401526000505061473c6000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063e7db8fb01161006f578063e7db8fb0146106fe578063e985e9c514610727578063f0292a0314610764578063f2fde38b1461078f578063f9cb63ac146107b8576101f9565b8063a22cb46514610644578063b88d4fde1461066d578063c87b56dd14610696578063d7224ba0146106d3576101f9565b80638ecad721116100dc5780638ecad721146105a957806395d89b41146105d45780639cc2374c146105ff578063a0712d6814610628576101f9565b806370a0823114610513578063715018a6146105505780637d8966e4146105675780638da5cb5b1461057e576101f9565b8063375a069a116101905780634f6ccce71161015f5780634f6ccce71461041a57806355f804b3146104575780635c975abb146104805780636352211e146104ab5780636c0360eb146104e8576101f9565b8063375a069a146103885780633ccfd60b146103b157806342842e0e146103c857806344a0d68a146103f1576101f9565b806313faede6116101cc57806313faede6146102cc57806318160ddd146102f757806323b872dd146103225780632f745c591461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613164565b6107e3565b6040516102329190613721565b60405180910390f35b34801561024757600080fd5b5061025061092d565b60405161025d919061373c565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061320b565b6109bf565b60405161029a91906136ba565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613124565b610a44565b005b3480156102d857600080fd5b506102e1610b5d565b6040516102ee9190613a9e565b60405180910390f35b34801561030357600080fd5b5061030c610b63565b6040516103199190613a9e565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061300e565b610b6c565b005b34801561035757600080fd5b50610372600480360381019061036d9190613124565b610b7c565b60405161037f9190613a9e565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa919061320b565b610d7a565b005b3480156103bd57600080fd5b506103c6610e5a565b005b3480156103d457600080fd5b506103ef60048036038101906103ea919061300e565b610f26565b005b3480156103fd57600080fd5b506104186004803603810190610413919061320b565b610f46565b005b34801561042657600080fd5b50610441600480360381019061043c919061320b565b610fcc565b60405161044e9190613a9e565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131be565b61101f565b005b34801561048c57600080fd5b506104956110b1565b6040516104a29190613721565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd919061320b565b6110c4565b6040516104df91906136ba565b60405180910390f35b3480156104f457600080fd5b506104fd6110da565b60405161050a919061373c565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612fa1565b611168565b6040516105479190613a9e565b60405180910390f35b34801561055c57600080fd5b50610565611251565b005b34801561057357600080fd5b5061057c6112d9565b005b34801561058a57600080fd5b50610593611381565b6040516105a091906136ba565b60405180910390f35b3480156105b557600080fd5b506105be6113ab565b6040516105cb9190613a9e565b60405180910390f35b3480156105e057600080fd5b506105e96113b0565b6040516105f6919061373c565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061320b565b611442565b005b610642600480360381019061063d919061320b565b6114c8565b005b34801561065057600080fd5b5061066b600480360381019061066691906130e4565b611672565b005b34801561067957600080fd5b50610694600480360381019061068f9190613061565b6117f3565b005b3480156106a257600080fd5b506106bd60048036038101906106b8919061320b565b61184f565b6040516106ca919061373c565b60405180910390f35b3480156106df57600080fd5b506106e8611908565b6040516106f59190613a9e565b60405180910390f35b34801561070a57600080fd5b506107256004803603810190610720919061320b565b61190e565b005b34801561073357600080fd5b5061074e60048036038101906107499190612fce565b611994565b60405161075b9190613721565b60405180910390f35b34801561077057600080fd5b50610779611a28565b6040516107869190613a9e565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190612fa1565b611a2e565b005b3480156107c457600080fd5b506107cd611b26565b6040516107da9190613a9e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611b2c565b5b9050919050565b60606001805461093c90613ddd565b80601f016020809104026020016040519081016040528092919081815260200182805461096890613ddd565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611b96565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613a3e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f826110c4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab79061393e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611ba3565b73ffffffffffffffffffffffffffffffffffffffff161480610b0e5750610b0d81610b08611ba3565b611994565b5b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449061383e565b60405180910390fd5b610b58838383611bab565b505050565b600b5481565b60008054905090565b610b77838383611c5d565b505050565b6000610b8783611168565b8210610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061375e565b60405180910390fd5b6000610bd2610b63565b905060008060005b83811015610d38576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ccc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d245786841415610d15578195505050505050610d74565b8380610d2090613e40565b9450505b508080610d3090613e40565b915050610bda565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b906139de565b60405180910390fd5b92915050565b610d82611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610da0611381565b73ffffffffffffffffffffffffffffffffffffffff1614610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded9061389e565b60405180910390fd5b6111c181610e02610b63565b610e0c9190613b98565b1115610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906139fe565b60405180910390fd5b610e573382612216565b50565b610e62611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610e80611381565b73ffffffffffffffffffffffffffffffffffffffff1614610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9061389e565b60405180910390fd5b610ede611381565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f23573d6000803e3d6000fd5b50565b610f41838383604051806020016040528060008152506117f3565b505050565b610f4e611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611381565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061389e565b60405180910390fd5b80600b8190555050565b6000610fd6610b63565b8210611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906137be565b60405180910390fd5b819050919050565b611027611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611045611381565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110929061389e565b60405180910390fd5b8181600991906110ac929190612d95565b505050565b600a60009054906101000a900460ff1681565b60006110cf82612234565b600001519050919050565b600980546110e790613ddd565b80601f016020809104026020016040519081016040528092919081815260200182805461111390613ddd565b80156111605780601f1061113557610100808354040283529160200191611160565b820191906000526020600020905b81548152906001019060200180831161114357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d09061385e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611259611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611277611381565b73ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c49061389e565b60405180910390fd5b6112d76000612437565b565b6112e1611ba3565b73ffffffffffffffffffffffffffffffffffffffff166112ff611381565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061389e565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601481565b6060600280546113bf90613ddd565b80601f01602080910402602001604051908101604052809291908181526020018280546113eb90613ddd565b80156114385780601f1061140d57610100808354040283529160200191611438565b820191906000526020600020905b81548152906001019060200180831161141b57829003601f168201915b5050505050905090565b61144a611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611468611381565b73ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b59061389e565b60405180910390fd5b80600b8190555050565b600a60009054906101000a900460ff1615611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f906137de565b60405180910390fd5b6000811161155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613a7e565b60405180910390fd5b6111c181611567610b63565b6115719190613b98565b11156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a99061381e565b60405180910390fd5b60148111156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed906138be565b60405180910390fd5b600b54816116049190613c1f565b341015806116265750600c5481611619610b63565b6116239190613b98565b11155b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c906139be565b60405180910390fd5b61166f3382612216565b50565b61167a611ba3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906138fe565b60405180910390fd5b80600660006116f5611ba3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117a2611ba3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e79190613721565b60405180910390a35050565b6117fe848484611c5d565b61180a848484846124fd565b611849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118409061395e565b60405180910390fd5b50505050565b606061185a82611b96565b611899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611890906138de565b60405180910390fd5b60006001836118a89190613b98565b905060006118b4612694565b905060008151116118d457604051806020016040528060008152506118ff565b806118de83612726565b6040516020016118ef929190613696565b6040516020818303038152906040525b92505050919050565b60075481565b611916611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611934611381565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119819061389e565b60405180910390fd5b80600c8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111c181565b611a36611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611a54611381565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa19061389e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b119061377e565b60405180910390fd5b611b2381612437565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c6882612234565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c8f611ba3565b73ffffffffffffffffffffffffffffffffffffffff161480611ceb5750611cb4611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611cd3846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d075750611d068260000151611d01611ba3565b611994565b5b905080611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d409061391e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db29061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e22906137fe565b60405180910390fd5b611e388585856001612887565b611e486000848460000151611bab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611eb69190613c79565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f5a9190613b52565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120609190613b98565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121a6576120d681611b96565b156121a5576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220e868686600161288d565b505050505050565b612230828260405180602001604052806000815250612893565b5050565b61223c612e1b565b61224582611b96565b612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b9061379e565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106122e85760017f0000000000000000000000000000000000000000000000000000000000000000846122db9190613cad565b6122e59190613b98565b90505b60008390505b8181106123f6576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123e257809350505050612432565b5080806123ee90613db3565b9150506122ee565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613a1e565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061251e8473ffffffffffffffffffffffffffffffffffffffff16612d72565b15612687578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612547611ba3565b8786866040518563ffffffff1660e01b815260040161256994939291906136d5565b602060405180830381600087803b15801561258357600080fd5b505af19250505080156125b457506040513d601f19601f820116820180604052508101906125b19190613191565b60015b612637573d80600081146125e4576040519150601f19603f3d011682016040523d82523d6000602084013e6125e9565b606091505b5060008151141561262f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126269061395e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061268c565b600190505b949350505050565b6060600980546126a390613ddd565b80601f01602080910402602001604051908101604052809291908181526020018280546126cf90613ddd565b801561271c5780601f106126f15761010080835404028352916020019161271c565b820191906000526020600020905b8154815290600101906020018083116126ff57829003601f168201915b5050505050905090565b6060600082141561276e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612882565b600082905060005b600082146127a057808061278990613e40565b915050600a826127999190613bee565b9150612776565b60008167ffffffffffffffff8111156127bc576127bb613f76565b5b6040519080825280601f01601f1916602001820160405280156127ee5781602001600182028036833780820191505090505b5090505b6000851461287b576001826128079190613cad565b9150600a856128169190613e89565b60306128229190613b98565b60f81b81838151811061283857612837613f47565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128749190613bee565b94506127f2565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129009061399e565b60405180910390fd5b61291281611b96565b15612952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129499061397e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156129b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ac90613a5e565b60405180910390fd5b6129c26000858386612887565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612abf9190613b52565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ae69190613b52565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612d5557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf560008884886124fd565b612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b9061395e565b60405180910390fd5b8180612d3f90613e40565b9250508080612d4d90613e40565b915050612c84565b5080600081905550612d6a600087858861288d565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612da190613ddd565b90600052602060002090601f016020900481019282612dc35760008555612e0a565b82601f10612ddc57803560ff1916838001178555612e0a565b82800160010185558215612e0a579182015b82811115612e09578235825591602001919060010190612dee565b5b509050612e179190612e55565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e6e576000816000905550600101612e56565b5090565b6000612e85612e8084613ade565b613ab9565b905082815260208101848484011115612ea157612ea0613fb4565b5b612eac848285613d71565b509392505050565b600081359050612ec3816146aa565b92915050565b600081359050612ed8816146c1565b92915050565b600081359050612eed816146d8565b92915050565b600081519050612f02816146d8565b92915050565b600082601f830112612f1d57612f1c613faa565b5b8135612f2d848260208601612e72565b91505092915050565b60008083601f840112612f4c57612f4b613faa565b5b8235905067ffffffffffffffff811115612f6957612f68613fa5565b5b602083019150836001820283011115612f8557612f84613faf565b5b9250929050565b600081359050612f9b816146ef565b92915050565b600060208284031215612fb757612fb6613fbe565b5b6000612fc584828501612eb4565b91505092915050565b60008060408385031215612fe557612fe4613fbe565b5b6000612ff385828601612eb4565b925050602061300485828601612eb4565b9150509250929050565b60008060006060848603121561302757613026613fbe565b5b600061303586828701612eb4565b935050602061304686828701612eb4565b925050604061305786828701612f8c565b9150509250925092565b6000806000806080858703121561307b5761307a613fbe565b5b600061308987828801612eb4565b945050602061309a87828801612eb4565b93505060406130ab87828801612f8c565b925050606085013567ffffffffffffffff8111156130cc576130cb613fb9565b5b6130d887828801612f08565b91505092959194509250565b600080604083850312156130fb576130fa613fbe565b5b600061310985828601612eb4565b925050602061311a85828601612ec9565b9150509250929050565b6000806040838503121561313b5761313a613fbe565b5b600061314985828601612eb4565b925050602061315a85828601612f8c565b9150509250929050565b60006020828403121561317a57613179613fbe565b5b600061318884828501612ede565b91505092915050565b6000602082840312156131a7576131a6613fbe565b5b60006131b584828501612ef3565b91505092915050565b600080602083850312156131d5576131d4613fbe565b5b600083013567ffffffffffffffff8111156131f3576131f2613fb9565b5b6131ff85828601612f36565b92509250509250929050565b60006020828403121561322157613220613fbe565b5b600061322f84828501612f8c565b91505092915050565b61324181613ce1565b82525050565b61325081613cf3565b82525050565b600061326182613b0f565b61326b8185613b25565b935061327b818560208601613d80565b61328481613fc3565b840191505092915050565b600061329a82613b1a565b6132a48185613b36565b93506132b4818560208601613d80565b6132bd81613fc3565b840191505092915050565b60006132d382613b1a565b6132dd8185613b47565b93506132ed818560208601613d80565b80840191505092915050565b6000613306602283613b36565b915061331182613fd4565b604082019050919050565b6000613329602683613b36565b915061333482614023565b604082019050919050565b600061334c602a83613b36565b915061335782614072565b604082019050919050565b600061336f602383613b36565b915061337a826140c1565b604082019050919050565b6000613392601983613b36565b915061339d82614110565b602082019050919050565b60006133b5602583613b36565b91506133c082614139565b604082019050919050565b60006133d8601e83613b36565b91506133e382614188565b602082019050919050565b60006133fb603983613b36565b9150613406826141b1565b604082019050919050565b600061341e602b83613b36565b915061342982614200565b604082019050919050565b6000613441602683613b36565b915061344c8261424f565b604082019050919050565b6000613464602083613b36565b915061346f8261429e565b602082019050919050565b6000613487602083613b36565b9150613492826142c7565b602082019050919050565b60006134aa602f83613b36565b91506134b5826142f0565b604082019050919050565b60006134cd601a83613b36565b91506134d88261433f565b602082019050919050565b60006134f0603283613b36565b91506134fb82614368565b604082019050919050565b6000613513602283613b36565b915061351e826143b7565b604082019050919050565b6000613536603383613b36565b915061354182614406565b604082019050919050565b6000613559601d83613b36565b915061356482614455565b602082019050919050565b600061357c602183613b36565b91506135878261447e565b604082019050919050565b600061359f602c83613b36565b91506135aa826144cd565b604082019050919050565b60006135c2602e83613b36565b91506135cd8261451c565b604082019050919050565b60006135e5601d83613b36565b91506135f08261456b565b602082019050919050565b6000613608602f83613b36565b915061361382614594565b604082019050919050565b600061362b602d83613b36565b9150613636826145e3565b604082019050919050565b600061364e602283613b36565b915061365982614632565b604082019050919050565b6000613671601a83613b36565b915061367c82614681565b602082019050919050565b61369081613d67565b82525050565b60006136a282856132c8565b91506136ae82846132c8565b91508190509392505050565b60006020820190506136cf6000830184613238565b92915050565b60006080820190506136ea6000830187613238565b6136f76020830186613238565b6137046040830185613687565b81810360608301526137168184613256565b905095945050505050565b60006020820190506137366000830184613247565b92915050565b60006020820190508181036000830152613756818461328f565b905092915050565b60006020820190508181036000830152613777816132f9565b9050919050565b600060208201905081810360008301526137978161331c565b9050919050565b600060208201905081810360008301526137b78161333f565b9050919050565b600060208201905081810360008301526137d781613362565b9050919050565b600060208201905081810360008301526137f781613385565b9050919050565b60006020820190508181036000830152613817816133a8565b9050919050565b60006020820190508181036000830152613837816133cb565b9050919050565b60006020820190508181036000830152613857816133ee565b9050919050565b6000602082019050818103600083015261387781613411565b9050919050565b6000602082019050818103600083015261389781613434565b9050919050565b600060208201905081810360008301526138b781613457565b9050919050565b600060208201905081810360008301526138d78161347a565b9050919050565b600060208201905081810360008301526138f78161349d565b9050919050565b60006020820190508181036000830152613917816134c0565b9050919050565b60006020820190508181036000830152613937816134e3565b9050919050565b6000602082019050818103600083015261395781613506565b9050919050565b6000602082019050818103600083015261397781613529565b9050919050565b600060208201905081810360008301526139978161354c565b9050919050565b600060208201905081810360008301526139b78161356f565b9050919050565b600060208201905081810360008301526139d781613592565b9050919050565b600060208201905081810360008301526139f7816135b5565b9050919050565b60006020820190508181036000830152613a17816135d8565b9050919050565b60006020820190508181036000830152613a37816135fb565b9050919050565b60006020820190508181036000830152613a578161361e565b9050919050565b60006020820190508181036000830152613a7781613641565b9050919050565b60006020820190508181036000830152613a9781613664565b9050919050565b6000602082019050613ab36000830184613687565b92915050565b6000613ac3613ad4565b9050613acf8282613e0f565b919050565b6000604051905090565b600067ffffffffffffffff821115613af957613af8613f76565b5b613b0282613fc3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b5d82613d2b565b9150613b6883613d2b565b9250826fffffffffffffffffffffffffffffffff03821115613b8d57613b8c613eba565b5b828201905092915050565b6000613ba382613d67565b9150613bae83613d67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be357613be2613eba565b5b828201905092915050565b6000613bf982613d67565b9150613c0483613d67565b925082613c1457613c13613ee9565b5b828204905092915050565b6000613c2a82613d67565b9150613c3583613d67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6e57613c6d613eba565b5b828202905092915050565b6000613c8482613d2b565b9150613c8f83613d2b565b925082821015613ca257613ca1613eba565b5b828203905092915050565b6000613cb882613d67565b9150613cc383613d67565b925082821015613cd657613cd5613eba565b5b828203905092915050565b6000613cec82613d47565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d9e578082015181840152602081019050613d83565b83811115613dad576000848401525b50505050565b6000613dbe82613d67565b91506000821415613dd257613dd1613eba565b5b600182039050919050565b60006002820490506001821680613df557607f821691505b60208210811415613e0957613e08613f18565b5b50919050565b613e1882613fc3565b810181811067ffffffffffffffff82111715613e3757613e36613f76565b5b80604052505050565b6000613e4b82613d67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e7e57613e7d613eba565b5b600182019050919050565b6000613e9482613d67565b9150613e9f83613d67565b925082613eaf57613eae613ee9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652069732063757272656e746c79207061757365642e00000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d6178206d696e7420616d6f756e742e0000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206578656564732031207175616e74697479207065722074782e600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d696e74207175616e74697479206f72206e6f7420656e6f60008201527f756768206574682073656e740000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d6178206d696e7420616d6f756e74000000600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74207175616e74697479206c657373207468616e20302e000000000000600082015250565b6146b381613ce1565b81146146be57600080fd5b50565b6146ca81613cf3565b81146146d557600080fd5b50565b6146e181613cff565b81146146ec57600080fd5b50565b6146f881613d67565b811461470357600080fd5b5056fea2646970667358221220b67116eb9e64e07b06efcc3cfed49249c866b41b5d15167819e624b972cf7f6e64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d5a63585868616a585644564e76726a56474a6e46695072536457583163527a37556375753445387870316b6d2f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063e7db8fb01161006f578063e7db8fb0146106fe578063e985e9c514610727578063f0292a0314610764578063f2fde38b1461078f578063f9cb63ac146107b8576101f9565b8063a22cb46514610644578063b88d4fde1461066d578063c87b56dd14610696578063d7224ba0146106d3576101f9565b80638ecad721116100dc5780638ecad721146105a957806395d89b41146105d45780639cc2374c146105ff578063a0712d6814610628576101f9565b806370a0823114610513578063715018a6146105505780637d8966e4146105675780638da5cb5b1461057e576101f9565b8063375a069a116101905780634f6ccce71161015f5780634f6ccce71461041a57806355f804b3146104575780635c975abb146104805780636352211e146104ab5780636c0360eb146104e8576101f9565b8063375a069a146103885780633ccfd60b146103b157806342842e0e146103c857806344a0d68a146103f1576101f9565b806313faede6116101cc57806313faede6146102cc57806318160ddd146102f757806323b872dd146103225780632f745c591461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613164565b6107e3565b6040516102329190613721565b60405180910390f35b34801561024757600080fd5b5061025061092d565b60405161025d919061373c565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061320b565b6109bf565b60405161029a91906136ba565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613124565b610a44565b005b3480156102d857600080fd5b506102e1610b5d565b6040516102ee9190613a9e565b60405180910390f35b34801561030357600080fd5b5061030c610b63565b6040516103199190613a9e565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061300e565b610b6c565b005b34801561035757600080fd5b50610372600480360381019061036d9190613124565b610b7c565b60405161037f9190613a9e565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa919061320b565b610d7a565b005b3480156103bd57600080fd5b506103c6610e5a565b005b3480156103d457600080fd5b506103ef60048036038101906103ea919061300e565b610f26565b005b3480156103fd57600080fd5b506104186004803603810190610413919061320b565b610f46565b005b34801561042657600080fd5b50610441600480360381019061043c919061320b565b610fcc565b60405161044e9190613a9e565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131be565b61101f565b005b34801561048c57600080fd5b506104956110b1565b6040516104a29190613721565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd919061320b565b6110c4565b6040516104df91906136ba565b60405180910390f35b3480156104f457600080fd5b506104fd6110da565b60405161050a919061373c565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612fa1565b611168565b6040516105479190613a9e565b60405180910390f35b34801561055c57600080fd5b50610565611251565b005b34801561057357600080fd5b5061057c6112d9565b005b34801561058a57600080fd5b50610593611381565b6040516105a091906136ba565b60405180910390f35b3480156105b557600080fd5b506105be6113ab565b6040516105cb9190613a9e565b60405180910390f35b3480156105e057600080fd5b506105e96113b0565b6040516105f6919061373c565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061320b565b611442565b005b610642600480360381019061063d919061320b565b6114c8565b005b34801561065057600080fd5b5061066b600480360381019061066691906130e4565b611672565b005b34801561067957600080fd5b50610694600480360381019061068f9190613061565b6117f3565b005b3480156106a257600080fd5b506106bd60048036038101906106b8919061320b565b61184f565b6040516106ca919061373c565b60405180910390f35b3480156106df57600080fd5b506106e8611908565b6040516106f59190613a9e565b60405180910390f35b34801561070a57600080fd5b506107256004803603810190610720919061320b565b61190e565b005b34801561073357600080fd5b5061074e60048036038101906107499190612fce565b611994565b60405161075b9190613721565b60405180910390f35b34801561077057600080fd5b50610779611a28565b6040516107869190613a9e565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190612fa1565b611a2e565b005b3480156107c457600080fd5b506107cd611b26565b6040516107da9190613a9e565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108ae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610926575061092582611b2c565b5b9050919050565b60606001805461093c90613ddd565b80601f016020809104026020016040519081016040528092919081815260200182805461096890613ddd565b80156109b55780601f1061098a576101008083540402835291602001916109b5565b820191906000526020600020905b81548152906001019060200180831161099857829003601f168201915b5050505050905090565b60006109ca82611b96565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613a3e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a4f826110c4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab79061393e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610adf611ba3565b73ffffffffffffffffffffffffffffffffffffffff161480610b0e5750610b0d81610b08611ba3565b611994565b5b610b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449061383e565b60405180910390fd5b610b58838383611bab565b505050565b600b5481565b60008054905090565b610b77838383611c5d565b505050565b6000610b8783611168565b8210610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf9061375e565b60405180910390fd5b6000610bd2610b63565b905060008060005b83811015610d38576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ccc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d245786841415610d15578195505050505050610d74565b8380610d2090613e40565b9450505b508080610d3090613e40565b915050610bda565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b906139de565b60405180910390fd5b92915050565b610d82611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610da0611381565b73ffffffffffffffffffffffffffffffffffffffff1614610df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ded9061389e565b60405180910390fd5b6111c181610e02610b63565b610e0c9190613b98565b1115610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906139fe565b60405180910390fd5b610e573382612216565b50565b610e62611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610e80611381565b73ffffffffffffffffffffffffffffffffffffffff1614610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd9061389e565b60405180910390fd5b610ede611381565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610f23573d6000803e3d6000fd5b50565b610f41838383604051806020016040528060008152506117f3565b505050565b610f4e611ba3565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611381565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb99061389e565b60405180910390fd5b80600b8190555050565b6000610fd6610b63565b8210611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100e906137be565b60405180910390fd5b819050919050565b611027611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611045611381565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110929061389e565b60405180910390fd5b8181600991906110ac929190612d95565b505050565b600a60009054906101000a900460ff1681565b60006110cf82612234565b600001519050919050565b600980546110e790613ddd565b80601f016020809104026020016040519081016040528092919081815260200182805461111390613ddd565b80156111605780601f1061113557610100808354040283529160200191611160565b820191906000526020600020905b81548152906001019060200180831161114357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d09061385e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611259611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611277611381565b73ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c49061389e565b60405180910390fd5b6112d76000612437565b565b6112e1611ba3565b73ffffffffffffffffffffffffffffffffffffffff166112ff611381565b73ffffffffffffffffffffffffffffffffffffffff1614611355576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134c9061389e565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b601481565b6060600280546113bf90613ddd565b80601f01602080910402602001604051908101604052809291908181526020018280546113eb90613ddd565b80156114385780601f1061140d57610100808354040283529160200191611438565b820191906000526020600020905b81548152906001019060200180831161141b57829003601f168201915b5050505050905090565b61144a611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611468611381565b73ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b59061389e565b60405180910390fd5b80600b8190555050565b600a60009054906101000a900460ff1615611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f906137de565b60405180910390fd5b6000811161155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613a7e565b60405180910390fd5b6111c181611567610b63565b6115719190613b98565b11156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a99061381e565b60405180910390fd5b60148111156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed906138be565b60405180910390fd5b600b54816116049190613c1f565b341015806116265750600c5481611619610b63565b6116239190613b98565b11155b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c906139be565b60405180910390fd5b61166f3382612216565b50565b61167a611ba3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116df906138fe565b60405180910390fd5b80600660006116f5611ba3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117a2611ba3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e79190613721565b60405180910390a35050565b6117fe848484611c5d565b61180a848484846124fd565b611849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118409061395e565b60405180910390fd5b50505050565b606061185a82611b96565b611899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611890906138de565b60405180910390fd5b60006001836118a89190613b98565b905060006118b4612694565b905060008151116118d457604051806020016040528060008152506118ff565b806118de83612726565b6040516020016118ef929190613696565b6040516020818303038152906040525b92505050919050565b60075481565b611916611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611934611381565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119819061389e565b60405180910390fd5b80600c8190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111c181565b611a36611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611a54611381565b73ffffffffffffffffffffffffffffffffffffffff1614611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa19061389e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b119061377e565b60405180910390fd5b611b2381612437565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c6882612234565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c8f611ba3565b73ffffffffffffffffffffffffffffffffffffffff161480611ceb5750611cb4611ba3565b73ffffffffffffffffffffffffffffffffffffffff16611cd3846109bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d075750611d068260000151611d01611ba3565b611994565b5b905080611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d409061391e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db29061387e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e22906137fe565b60405180910390fd5b611e388585856001612887565b611e486000848460000151611bab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611eb69190613c79565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f5a9190613b52565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120609190613b98565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121a6576120d681611b96565b156121a5576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461220e868686600161288d565b505050505050565b612230828260405180602001604052806000815250612893565b5050565b61223c612e1b565b61224582611b96565b612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b9061379e565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000001483106122e85760017f0000000000000000000000000000000000000000000000000000000000000014846122db9190613cad565b6122e59190613b98565b90505b60008390505b8181106123f6576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123e257809350505050612432565b5080806123ee90613db3565b9150506122ee565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613a1e565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061251e8473ffffffffffffffffffffffffffffffffffffffff16612d72565b15612687578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612547611ba3565b8786866040518563ffffffff1660e01b815260040161256994939291906136d5565b602060405180830381600087803b15801561258357600080fd5b505af19250505080156125b457506040513d601f19601f820116820180604052508101906125b19190613191565b60015b612637573d80600081146125e4576040519150601f19603f3d011682016040523d82523d6000602084013e6125e9565b606091505b5060008151141561262f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126269061395e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061268c565b600190505b949350505050565b6060600980546126a390613ddd565b80601f01602080910402602001604051908101604052809291908181526020018280546126cf90613ddd565b801561271c5780601f106126f15761010080835404028352916020019161271c565b820191906000526020600020905b8154815290600101906020018083116126ff57829003601f168201915b5050505050905090565b6060600082141561276e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612882565b600082905060005b600082146127a057808061278990613e40565b915050600a826127999190613bee565b9150612776565b60008167ffffffffffffffff8111156127bc576127bb613f76565b5b6040519080825280601f01601f1916602001820160405280156127ee5781602001600182028036833780820191505090505b5090505b6000851461287b576001826128079190613cad565b9150600a856128169190613e89565b60306128229190613b98565b60f81b81838151811061283857612837613f47565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128749190613bee565b94506127f2565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129009061399e565b60405180910390fd5b61291281611b96565b15612952576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129499061397e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000148311156129b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ac90613a5e565b60405180910390fd5b6129c26000858386612887565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612abf9190613b52565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ae69190613b52565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612d5557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf560008884886124fd565b612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b9061395e565b60405180910390fd5b8180612d3f90613e40565b9250508080612d4d90613e40565b915050612c84565b5080600081905550612d6a600087858861288d565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612da190613ddd565b90600052602060002090601f016020900481019282612dc35760008555612e0a565b82601f10612ddc57803560ff1916838001178555612e0a565b82800160010185558215612e0a579182015b82811115612e09578235825591602001919060010190612dee565b5b509050612e179190612e55565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612e6e576000816000905550600101612e56565b5090565b6000612e85612e8084613ade565b613ab9565b905082815260208101848484011115612ea157612ea0613fb4565b5b612eac848285613d71565b509392505050565b600081359050612ec3816146aa565b92915050565b600081359050612ed8816146c1565b92915050565b600081359050612eed816146d8565b92915050565b600081519050612f02816146d8565b92915050565b600082601f830112612f1d57612f1c613faa565b5b8135612f2d848260208601612e72565b91505092915050565b60008083601f840112612f4c57612f4b613faa565b5b8235905067ffffffffffffffff811115612f6957612f68613fa5565b5b602083019150836001820283011115612f8557612f84613faf565b5b9250929050565b600081359050612f9b816146ef565b92915050565b600060208284031215612fb757612fb6613fbe565b5b6000612fc584828501612eb4565b91505092915050565b60008060408385031215612fe557612fe4613fbe565b5b6000612ff385828601612eb4565b925050602061300485828601612eb4565b9150509250929050565b60008060006060848603121561302757613026613fbe565b5b600061303586828701612eb4565b935050602061304686828701612eb4565b925050604061305786828701612f8c565b9150509250925092565b6000806000806080858703121561307b5761307a613fbe565b5b600061308987828801612eb4565b945050602061309a87828801612eb4565b93505060406130ab87828801612f8c565b925050606085013567ffffffffffffffff8111156130cc576130cb613fb9565b5b6130d887828801612f08565b91505092959194509250565b600080604083850312156130fb576130fa613fbe565b5b600061310985828601612eb4565b925050602061311a85828601612ec9565b9150509250929050565b6000806040838503121561313b5761313a613fbe565b5b600061314985828601612eb4565b925050602061315a85828601612f8c565b9150509250929050565b60006020828403121561317a57613179613fbe565b5b600061318884828501612ede565b91505092915050565b6000602082840312156131a7576131a6613fbe565b5b60006131b584828501612ef3565b91505092915050565b600080602083850312156131d5576131d4613fbe565b5b600083013567ffffffffffffffff8111156131f3576131f2613fb9565b5b6131ff85828601612f36565b92509250509250929050565b60006020828403121561322157613220613fbe565b5b600061322f84828501612f8c565b91505092915050565b61324181613ce1565b82525050565b61325081613cf3565b82525050565b600061326182613b0f565b61326b8185613b25565b935061327b818560208601613d80565b61328481613fc3565b840191505092915050565b600061329a82613b1a565b6132a48185613b36565b93506132b4818560208601613d80565b6132bd81613fc3565b840191505092915050565b60006132d382613b1a565b6132dd8185613b47565b93506132ed818560208601613d80565b80840191505092915050565b6000613306602283613b36565b915061331182613fd4565b604082019050919050565b6000613329602683613b36565b915061333482614023565b604082019050919050565b600061334c602a83613b36565b915061335782614072565b604082019050919050565b600061336f602383613b36565b915061337a826140c1565b604082019050919050565b6000613392601983613b36565b915061339d82614110565b602082019050919050565b60006133b5602583613b36565b91506133c082614139565b604082019050919050565b60006133d8601e83613b36565b91506133e382614188565b602082019050919050565b60006133fb603983613b36565b9150613406826141b1565b604082019050919050565b600061341e602b83613b36565b915061342982614200565b604082019050919050565b6000613441602683613b36565b915061344c8261424f565b604082019050919050565b6000613464602083613b36565b915061346f8261429e565b602082019050919050565b6000613487602083613b36565b9150613492826142c7565b602082019050919050565b60006134aa602f83613b36565b91506134b5826142f0565b604082019050919050565b60006134cd601a83613b36565b91506134d88261433f565b602082019050919050565b60006134f0603283613b36565b91506134fb82614368565b604082019050919050565b6000613513602283613b36565b915061351e826143b7565b604082019050919050565b6000613536603383613b36565b915061354182614406565b604082019050919050565b6000613559601d83613b36565b915061356482614455565b602082019050919050565b600061357c602183613b36565b91506135878261447e565b604082019050919050565b600061359f602c83613b36565b91506135aa826144cd565b604082019050919050565b60006135c2602e83613b36565b91506135cd8261451c565b604082019050919050565b60006135e5601d83613b36565b91506135f08261456b565b602082019050919050565b6000613608602f83613b36565b915061361382614594565b604082019050919050565b600061362b602d83613b36565b9150613636826145e3565b604082019050919050565b600061364e602283613b36565b915061365982614632565b604082019050919050565b6000613671601a83613b36565b915061367c82614681565b602082019050919050565b61369081613d67565b82525050565b60006136a282856132c8565b91506136ae82846132c8565b91508190509392505050565b60006020820190506136cf6000830184613238565b92915050565b60006080820190506136ea6000830187613238565b6136f76020830186613238565b6137046040830185613687565b81810360608301526137168184613256565b905095945050505050565b60006020820190506137366000830184613247565b92915050565b60006020820190508181036000830152613756818461328f565b905092915050565b60006020820190508181036000830152613777816132f9565b9050919050565b600060208201905081810360008301526137978161331c565b9050919050565b600060208201905081810360008301526137b78161333f565b9050919050565b600060208201905081810360008301526137d781613362565b9050919050565b600060208201905081810360008301526137f781613385565b9050919050565b60006020820190508181036000830152613817816133a8565b9050919050565b60006020820190508181036000830152613837816133cb565b9050919050565b60006020820190508181036000830152613857816133ee565b9050919050565b6000602082019050818103600083015261387781613411565b9050919050565b6000602082019050818103600083015261389781613434565b9050919050565b600060208201905081810360008301526138b781613457565b9050919050565b600060208201905081810360008301526138d78161347a565b9050919050565b600060208201905081810360008301526138f78161349d565b9050919050565b60006020820190508181036000830152613917816134c0565b9050919050565b60006020820190508181036000830152613937816134e3565b9050919050565b6000602082019050818103600083015261395781613506565b9050919050565b6000602082019050818103600083015261397781613529565b9050919050565b600060208201905081810360008301526139978161354c565b9050919050565b600060208201905081810360008301526139b78161356f565b9050919050565b600060208201905081810360008301526139d781613592565b9050919050565b600060208201905081810360008301526139f7816135b5565b9050919050565b60006020820190508181036000830152613a17816135d8565b9050919050565b60006020820190508181036000830152613a37816135fb565b9050919050565b60006020820190508181036000830152613a578161361e565b9050919050565b60006020820190508181036000830152613a7781613641565b9050919050565b60006020820190508181036000830152613a9781613664565b9050919050565b6000602082019050613ab36000830184613687565b92915050565b6000613ac3613ad4565b9050613acf8282613e0f565b919050565b6000604051905090565b600067ffffffffffffffff821115613af957613af8613f76565b5b613b0282613fc3565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613b5d82613d2b565b9150613b6883613d2b565b9250826fffffffffffffffffffffffffffffffff03821115613b8d57613b8c613eba565b5b828201905092915050565b6000613ba382613d67565b9150613bae83613d67565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613be357613be2613eba565b5b828201905092915050565b6000613bf982613d67565b9150613c0483613d67565b925082613c1457613c13613ee9565b5b828204905092915050565b6000613c2a82613d67565b9150613c3583613d67565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c6e57613c6d613eba565b5b828202905092915050565b6000613c8482613d2b565b9150613c8f83613d2b565b925082821015613ca257613ca1613eba565b5b828203905092915050565b6000613cb882613d67565b9150613cc383613d67565b925082821015613cd657613cd5613eba565b5b828203905092915050565b6000613cec82613d47565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d9e578082015181840152602081019050613d83565b83811115613dad576000848401525b50505050565b6000613dbe82613d67565b91506000821415613dd257613dd1613eba565b5b600182039050919050565b60006002820490506001821680613df557607f821691505b60208210811415613e0957613e08613f18565b5b50919050565b613e1882613fc3565b810181811067ffffffffffffffff82111715613e3757613e36613f76565b5b80604052505050565b6000613e4b82613d67565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e7e57613e7d613eba565b5b600182019050919050565b6000613e9482613d67565b9150613e9f83613d67565b925082613eaf57613eae613ee9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652069732063757272656e746c79207061757365642e00000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d6178206d696e7420616d6f756e742e0000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616e6e6f74206578656564732031207175616e74697479207065722074782e600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d696e74207175616e74697479206f72206e6f7420656e6f60008201527f756768206574682073656e740000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d6178206d696e7420616d6f756e74000000600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74207175616e74697479206c657373207468616e20302e000000000000600082015250565b6146b381613ce1565b81146146be57600080fd5b50565b6146ca81613cf3565b81146146d557600080fd5b50565b6146e181613cff565b81146146ec57600080fd5b50565b6146f881613d67565b811461470357600080fd5b5056fea2646970667358221220b67116eb9e64e07b06efcc3cfed49249c866b41b5d15167819e624b972cf7f6e64736f6c63430008070033

Deployed Bytecode Sourcemap

39727:1893:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24877:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26603:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28162:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27725:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40004:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23441:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29012:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24069:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40696:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41511:106;;;;;;;;;;;;;:::i;:::-;;29217:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40899:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23604:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41104:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39880:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26426:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39779:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25303:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38840:103;;;;;;;;;;;;;:::i;:::-;;41319:76;;;;;;;;;;;;;:::i;:::-;;38189:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39953:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26758:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40997:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40173:515;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28430:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29437:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26919:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33768:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41204:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28767:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39907:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39098:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40045:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24877:370;25004:4;25049:25;25034:40;;;:11;:40;;;;:99;;;;25100:33;25085:48;;;:11;:48;;;;25034:99;:160;;;;25159:35;25144:50;;;:11;:50;;;;25034:160;:207;;;;25205:36;25229:11;25205:23;:36::i;:::-;25034:207;25020:221;;24877:370;;;:::o;26603:94::-;26657:13;26686:5;26679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26603:94;:::o;28162:204::-;28230:7;28254:16;28262:7;28254;:16::i;:::-;28246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28336:15;:24;28352:7;28336:24;;;;;;;;;;;;;;;;;;;;;28329:31;;28162:204;;;:::o;27725:379::-;27794:13;27810:24;27826:7;27810:15;:24::i;:::-;27794:40;;27855:5;27849:11;;:2;:11;;;;27841:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27940:5;27924:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27949:37;27966:5;27973:12;:10;:12::i;:::-;27949:16;:37::i;:::-;27924:62;27908:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28070:28;28079:2;28083:7;28092:5;28070:8;:28::i;:::-;27787:317;27725:379;;:::o;40004:34::-;;;;:::o;23441:94::-;23494:7;23517:12;;23510:19;;23441:94;:::o;29012:142::-;29120:28;29130:4;29136:2;29140:7;29120:9;:28::i;:::-;29012:142;;;:::o;24069:744::-;24178:7;24213:16;24223:5;24213:9;:16::i;:::-;24205:5;:24;24197:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24275:22;24300:13;:11;:13::i;:::-;24275:38;;24320:19;24350:25;24400:9;24395:350;24419:14;24415:1;:18;24395:350;;;24449:31;24483:11;:14;24495:1;24483:14;;;;;;;;;;;24449:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24536:1;24510:28;;:9;:14;;;:28;;;24506:89;;24571:9;:14;;;24551:34;;24506:89;24628:5;24607:26;;:17;:26;;;24603:135;;;24665:5;24650:11;:20;24646:59;;;24692:1;24685:8;;;;;;;;;24646:59;24715:13;;;;;:::i;:::-;;;;24603:135;24440:305;24435:3;;;;;:::i;:::-;;;;24395:350;;;;24751:56;;;;;;;;;;:::i;:::-;;;;;;;;24069:744;;;;;:::o;40696:195::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39942:4:::1;40785:8;40769:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;;40761:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;40852:31;40862:10;40874:8;40852:9;:31::i;:::-;40696:195:::0;:::o;41511:106::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41569:7:::1;:5;:7::i;:::-;41561:25;;:48;41587:21;41561:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;41511:106::o:0;29217:157::-;29329:39;29346:4;29352:2;29356:7;29329:39;;;;;;;;;;;;:16;:39::i;:::-;29217:157;;;:::o;40899:90::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40973:8:::1;40966:4;:15;;;;40899:90:::0;:::o;23604:177::-;23671:7;23703:13;:11;:13::i;:::-;23695:5;:21;23687:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23770:5;23763:12;;23604:177;;;:::o;41104:92::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41185:3:::1;;41175:7;:13;;;;;;;:::i;:::-;;41104:92:::0;;:::o;39880:18::-;;;;;;;;;;;;;:::o;26426:118::-;26490:7;26513:20;26525:7;26513:11;:20::i;:::-;:25;;;26506:32;;26426:118;;;:::o;39779:94::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25303:211::-;25367:7;25408:1;25391:19;;:5;:19;;;;25383:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25480:12;:19;25493:5;25480:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25472:36;;25465:43;;25303:211;;;:::o;38840:103::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38905:30:::1;38932:1;38905:18;:30::i;:::-;38840:103::o:0;41319:76::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41381:6:::1;;;;;;;;;;;41380:7;41371:6;;:16;;;;;;;;;;;;;;;;;;41319:76::o:0;38189:87::-;38235:7;38262:6;;;;;;;;;;;38255:13;;38189:87;:::o;39953:44::-;39995:2;39953:44;:::o;26758:98::-;26814:13;26843:7;26836:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26758:98;:::o;40997:99::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41080:8:::1;41073:4;:15;;;;40997:99:::0;:::o;40173:515::-;40242:6;;;;;;;;;;;40241:7;40233:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;40308:1;40297:8;:12;40289:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39942:4;40375:8;40359:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;;40351:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;40461:2;40449:8;:14;;40441:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;40543:4;;40532:8;:15;;;;:::i;:::-;40519:9;:28;;:68;;;;40579:8;;40567;40551:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;;40519:68;40511:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;40649:31;40659:10;40671:8;40649:9;:31::i;:::-;40173:515;:::o;28430:274::-;28533:12;:10;:12::i;:::-;28521:24;;:8;:24;;;;28513:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28630:8;28585:18;:32;28604:12;:10;:12::i;:::-;28585:32;;;;;;;;;;;;;;;:42;28618:8;28585:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28679:8;28650:48;;28665:12;:10;:12::i;:::-;28650:48;;;28689:8;28650:48;;;;;;:::i;:::-;;;;;;;;28430:274;;:::o;29437:311::-;29574:28;29584:4;29590:2;29594:7;29574:9;:28::i;:::-;29625:48;29648:4;29654:2;29658:7;29667:5;29625:22;:48::i;:::-;29609:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;29437:311;;;;:::o;26919:428::-;27017:13;27058:16;27066:7;27058;:16::i;:::-;27042:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;27148:14;27175:1;27165:7;:11;;;;:::i;:::-;27148:28;;27183:21;27207:10;:8;:10::i;:::-;27183:34;;27262:1;27244:7;27238:21;:25;:103;;;;;;;;;;;;;;;;;27299:7;27308:17;:6;:15;:17::i;:::-;27282:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27238:103;27224:117;;;;26919:428;;;:::o;33768:43::-;;;;:::o;41204:107::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41290:13:::1;41279:8;:24;;;;41204:107:::0;:::o;28767:186::-;28889:4;28912:18;:25;28931:5;28912:25;;;;;;;;;;;;;;;:35;28938:8;28912:35;;;;;;;;;;;;;;;;;;;;;;;;;28905:42;;28767:186;;;;:::o;39907:39::-;39942:4;39907:39;:::o;39098:201::-;38420:12;:10;:12::i;:::-;38409:23;;:7;:5;:7::i;:::-;:23;;;38401:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39207:1:::1;39187:22;;:8;:22;;;;39179:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39263:28;39282:8;39263:18;:28::i;:::-;39098:201:::0;:::o;40045:29::-;;;;:::o;13440:157::-;13525:4;13564:25;13549:40;;;:11;:40;;;;13542:47;;13440:157;;;:::o;29987:105::-;30044:4;30074:12;;30064:7;:22;30057:29;;29987:105;;;:::o;21038:98::-;21091:7;21118:10;21111:17;;21038:98;:::o;33590:172::-;33714:2;33687:15;:24;33703:7;33687:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33748:7;33744:2;33728:28;;33737:5;33728:28;;;;;;;;;;;;33590:172;;;:::o;31955:1529::-;32052:35;32090:20;32102:7;32090:11;:20::i;:::-;32052:58;;32119:22;32161:13;:18;;;32145:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;32214:12;:10;:12::i;:::-;32190:36;;:20;32202:7;32190:11;:20::i;:::-;:36;;;32145:81;:142;;;;32237:50;32254:13;:18;;;32274:12;:10;:12::i;:::-;32237:16;:50::i;:::-;32145:142;32119:169;;32313:17;32297:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;32445:4;32423:26;;:13;:18;;;:26;;;32407:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;32534:1;32520:16;;:2;:16;;;;32512:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32587:43;32609:4;32615:2;32619:7;32628:1;32587:21;:43::i;:::-;32687:49;32704:1;32708:7;32717:13;:18;;;32687:8;:49::i;:::-;32775:1;32745:12;:18;32758:4;32745:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32811:1;32783:12;:16;32796:2;32783:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32842:43;;;;;;;;32857:2;32842:43;;;;;;32868:15;32842:43;;;;;32819:11;:20;32831:7;32819:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33113:19;33145:1;33135:7;:11;;;;:::i;:::-;33113:33;;33198:1;33157:43;;:11;:24;33169:11;33157:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33153:236;;;33215:20;33223:11;33215:7;:20::i;:::-;33211:171;;;33275:97;;;;;;;;33302:13;:18;;;33275:97;;;;;;33333:13;:28;;;33275:97;;;;;33248:11;:24;33260:11;33248:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33211:171;33153:236;33421:7;33417:2;33402:27;;33411:4;33402:27;;;;;;;;;;;;33436:42;33457:4;33463:2;33467:7;33476:1;33436:20;:42::i;:::-;32045:1439;;;31955:1529;;;:::o;30098:98::-;30163:27;30173:2;30177:8;30163:27;;;;;;;;;;;;:9;:27::i;:::-;30098:98;;:::o;25766:606::-;25842:21;;:::i;:::-;25883:16;25891:7;25883;:16::i;:::-;25875:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25955:26;26003:12;25992:7;:23;25988:93;;26072:1;26057:12;26047:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;26026:47;;25988:93;26094:12;26109:7;26094:22;;26089:212;26126:18;26118:4;:26;26089:212;;26163:31;26197:11;:17;26209:4;26197:17;;;;;;;;;;;26163:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26253:1;26227:28;;:9;:14;;;:28;;;26223:71;;26275:9;26268:16;;;;;;;26223:71;26154:147;26146:6;;;;;:::i;:::-;;;;26089:212;;;;26309:57;;;;;;;;;;:::i;:::-;;;;;;;;25766:606;;;;:::o;39459:191::-;39533:16;39552:6;;;;;;;;;;;39533:25;;39578:8;39569:6;;:17;;;;;;;;;;;;;;;;;;39633:8;39602:40;;39623:8;39602:40;;;;;;;;;;;;39522:128;39459:191;:::o;35301:690::-;35438:4;35455:15;:2;:13;;;:15::i;:::-;35451:535;;;35510:2;35494:36;;;35531:12;:10;:12::i;:::-;35545:4;35551:7;35560:5;35494:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35481:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35742:1;35725:6;:13;:18;35721:215;;;35758:61;;;;;;;;;;:::i;:::-;;;;;;;;35721:215;35904:6;35898:13;35889:6;35885:2;35881:15;35874:38;35481:464;35626:45;;;35616:55;;;:6;:55;;;;35609:62;;;;;35451:535;35974:4;35967:11;;35301:690;;;;;;;:::o;41403:100::-;41455:13;41488:7;41481:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41403:100;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;36453:141::-;;;;;:::o;36980:140::-;;;;;:::o;30451:1272::-;30556:20;30579:12;;30556:35;;30620:1;30606:16;;:2;:16;;;;30598:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30797:21;30805:12;30797:7;:21::i;:::-;30796:22;30788:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30879:12;30867:8;:24;;30859:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30939:61;30969:1;30973:2;30977:12;30991:8;30939:21;:61::i;:::-;31009:30;31042:12;:16;31055:2;31042:16;;;;;;;;;;;;;;;31009:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31084:119;;;;;;;;31134:8;31104:11;:19;;;:39;;;;:::i;:::-;31084:119;;;;;;31187:8;31152:11;:24;;;:44;;;;:::i;:::-;31084:119;;;;;31065:12;:16;31078:2;31065:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31238:43;;;;;;;;31253:2;31238:43;;;;;;31264:15;31238:43;;;;;31210:11;:25;31222:12;31210:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31290:20;31313:12;31290:35;;31339:9;31334:281;31358:8;31354:1;:12;31334:281;;;31412:12;31408:2;31387:38;;31404:1;31387:38;;;;;;;;;;;;31452:59;31483:1;31487:2;31491:12;31505:5;31452:22;:59::i;:::-;31434:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;31593:14;;;;;:::i;:::-;;;;31368:3;;;;;:::i;:::-;;;;31334:281;;;;31638:12;31623;:27;;;;31657:60;31686:1;31690:2;31694:12;31708:8;31657:20;:60::i;:::-;30549:1174;;;30451:1272;;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:::-;9961:3;9982:67;10046:2;10041:3;9982:67;:::i;:::-;9975:74;;10058:93;10147:3;10058:93;:::i;:::-;10176:2;10171:3;10167:12;10160:19;;9819:366;;;:::o;10191:::-;10333:3;10354:67;10418:2;10413:3;10354:67;:::i;:::-;10347:74;;10430:93;10519:3;10430:93;:::i;:::-;10548:2;10543:3;10539:12;10532:19;;10191:366;;;:::o;10563:::-;10705:3;10726:67;10790:2;10785:3;10726:67;:::i;:::-;10719:74;;10802:93;10891:3;10802:93;:::i;:::-;10920:2;10915:3;10911:12;10904:19;;10563:366;;;:::o;10935:::-;11077:3;11098:67;11162:2;11157:3;11098:67;:::i;:::-;11091:74;;11174:93;11263:3;11174:93;:::i;:::-;11292:2;11287:3;11283:12;11276:19;;10935:366;;;:::o;11307:::-;11449:3;11470:67;11534:2;11529:3;11470:67;:::i;:::-;11463:74;;11546:93;11635:3;11546:93;:::i;:::-;11664:2;11659:3;11655:12;11648:19;;11307:366;;;:::o;11679:::-;11821:3;11842:67;11906:2;11901:3;11842:67;:::i;:::-;11835:74;;11918:93;12007:3;11918:93;:::i;:::-;12036:2;12031:3;12027:12;12020:19;;11679:366;;;:::o;12051:::-;12193:3;12214:67;12278:2;12273:3;12214:67;:::i;:::-;12207:74;;12290:93;12379:3;12290:93;:::i;:::-;12408:2;12403:3;12399:12;12392:19;;12051:366;;;:::o;12423:::-;12565:3;12586:67;12650:2;12645:3;12586:67;:::i;:::-;12579:74;;12662:93;12751:3;12662:93;:::i;:::-;12780:2;12775:3;12771:12;12764:19;;12423:366;;;:::o;12795:::-;12937:3;12958:67;13022:2;13017:3;12958:67;:::i;:::-;12951:74;;13034:93;13123:3;13034:93;:::i;:::-;13152:2;13147:3;13143:12;13136:19;;12795:366;;;:::o;13167:::-;13309:3;13330:67;13394:2;13389:3;13330:67;:::i;:::-;13323:74;;13406:93;13495:3;13406:93;:::i;:::-;13524:2;13519:3;13515:12;13508:19;;13167:366;;;:::o;13539:::-;13681:3;13702:67;13766:2;13761:3;13702:67;:::i;:::-;13695:74;;13778:93;13867:3;13778:93;:::i;:::-;13896:2;13891:3;13887:12;13880:19;;13539:366;;;:::o;13911:::-;14053:3;14074:67;14138:2;14133:3;14074:67;:::i;:::-;14067:74;;14150:93;14239:3;14150:93;:::i;:::-;14268:2;14263:3;14259:12;14252:19;;13911:366;;;:::o;14283:::-;14425:3;14446:67;14510:2;14505:3;14446:67;:::i;:::-;14439:74;;14522:93;14611:3;14522:93;:::i;:::-;14640:2;14635:3;14631:12;14624:19;;14283:366;;;:::o;14655:::-;14797:3;14818:67;14882:2;14877:3;14818:67;:::i;:::-;14811:74;;14894:93;14983:3;14894:93;:::i;:::-;15012:2;15007:3;15003:12;14996:19;;14655:366;;;:::o;15027:::-;15169:3;15190:67;15254:2;15249:3;15190:67;:::i;:::-;15183:74;;15266:93;15355:3;15266:93;:::i;:::-;15384:2;15379:3;15375:12;15368:19;;15027:366;;;:::o;15399:::-;15541:3;15562:67;15626:2;15621:3;15562:67;:::i;:::-;15555:74;;15638:93;15727:3;15638:93;:::i;:::-;15756:2;15751:3;15747:12;15740:19;;15399:366;;;:::o;15771:::-;15913:3;15934:67;15998:2;15993:3;15934:67;:::i;:::-;15927:74;;16010:93;16099:3;16010:93;:::i;:::-;16128:2;16123:3;16119:12;16112:19;;15771:366;;;:::o;16143:::-;16285:3;16306:67;16370:2;16365:3;16306:67;:::i;:::-;16299:74;;16382:93;16471:3;16382:93;:::i;:::-;16500:2;16495:3;16491:12;16484:19;;16143:366;;;:::o;16515:::-;16657:3;16678:67;16742:2;16737:3;16678:67;:::i;:::-;16671:74;;16754:93;16843:3;16754:93;:::i;:::-;16872:2;16867:3;16863:12;16856:19;;16515:366;;;:::o;16887:::-;17029:3;17050:67;17114:2;17109:3;17050:67;:::i;:::-;17043:74;;17126:93;17215:3;17126:93;:::i;:::-;17244:2;17239:3;17235:12;17228:19;;16887:366;;;:::o;17259:::-;17401:3;17422:67;17486:2;17481:3;17422:67;:::i;:::-;17415:74;;17498:93;17587:3;17498:93;:::i;:::-;17616:2;17611:3;17607:12;17600:19;;17259:366;;;:::o;17631:::-;17773:3;17794:67;17858:2;17853:3;17794:67;:::i;:::-;17787:74;;17870:93;17959:3;17870:93;:::i;:::-;17988:2;17983:3;17979:12;17972:19;;17631:366;;;:::o;18003:118::-;18090:24;18108:5;18090:24;:::i;:::-;18085:3;18078:37;18003:118;;:::o;18127:435::-;18307:3;18329:95;18420:3;18411:6;18329:95;:::i;:::-;18322:102;;18441:95;18532:3;18523:6;18441:95;:::i;:::-;18434:102;;18553:3;18546:10;;18127:435;;;;;:::o;18568:222::-;18661:4;18699:2;18688:9;18684:18;18676:26;;18712:71;18780:1;18769:9;18765:17;18756:6;18712:71;:::i;:::-;18568:222;;;;:::o;18796:640::-;18991:4;19029:3;19018:9;19014:19;19006:27;;19043:71;19111:1;19100:9;19096:17;19087:6;19043:71;:::i;:::-;19124:72;19192:2;19181:9;19177:18;19168:6;19124:72;:::i;:::-;19206;19274:2;19263:9;19259:18;19250:6;19206:72;:::i;:::-;19325:9;19319:4;19315:20;19310:2;19299:9;19295:18;19288:48;19353:76;19424:4;19415:6;19353:76;:::i;:::-;19345:84;;18796:640;;;;;;;:::o;19442:210::-;19529:4;19567:2;19556:9;19552:18;19544:26;;19580:65;19642:1;19631:9;19627:17;19618:6;19580:65;:::i;:::-;19442:210;;;;:::o;19658:313::-;19771:4;19809:2;19798:9;19794:18;19786:26;;19858:9;19852:4;19848:20;19844:1;19833:9;19829:17;19822:47;19886:78;19959:4;19950:6;19886:78;:::i;:::-;19878:86;;19658:313;;;;:::o;19977:419::-;20143:4;20181:2;20170:9;20166:18;20158:26;;20230:9;20224:4;20220:20;20216:1;20205:9;20201:17;20194:47;20258:131;20384:4;20258:131;:::i;:::-;20250:139;;19977:419;;;:::o;20402:::-;20568:4;20606:2;20595:9;20591:18;20583:26;;20655:9;20649:4;20645:20;20641:1;20630:9;20626:17;20619:47;20683:131;20809:4;20683:131;:::i;:::-;20675:139;;20402:419;;;:::o;20827:::-;20993:4;21031:2;21020:9;21016:18;21008:26;;21080:9;21074:4;21070:20;21066:1;21055:9;21051:17;21044:47;21108:131;21234:4;21108:131;:::i;:::-;21100:139;;20827:419;;;:::o;21252:::-;21418:4;21456:2;21445:9;21441:18;21433:26;;21505:9;21499:4;21495:20;21491:1;21480:9;21476:17;21469:47;21533:131;21659:4;21533:131;:::i;:::-;21525:139;;21252:419;;;:::o;21677:::-;21843:4;21881:2;21870:9;21866:18;21858:26;;21930:9;21924:4;21920:20;21916:1;21905:9;21901:17;21894:47;21958:131;22084:4;21958:131;:::i;:::-;21950:139;;21677:419;;;:::o;22102:::-;22268:4;22306:2;22295:9;22291:18;22283:26;;22355:9;22349:4;22345:20;22341:1;22330:9;22326:17;22319:47;22383:131;22509:4;22383:131;:::i;:::-;22375:139;;22102:419;;;:::o;22527:::-;22693:4;22731:2;22720:9;22716:18;22708:26;;22780:9;22774:4;22770:20;22766:1;22755:9;22751:17;22744:47;22808:131;22934:4;22808:131;:::i;:::-;22800:139;;22527:419;;;:::o;22952:::-;23118:4;23156:2;23145:9;23141:18;23133:26;;23205:9;23199:4;23195:20;23191:1;23180:9;23176:17;23169:47;23233:131;23359:4;23233:131;:::i;:::-;23225:139;;22952:419;;;:::o;23377:::-;23543:4;23581:2;23570:9;23566:18;23558:26;;23630:9;23624:4;23620:20;23616:1;23605:9;23601:17;23594:47;23658:131;23784:4;23658:131;:::i;:::-;23650:139;;23377:419;;;:::o;23802:::-;23968:4;24006:2;23995:9;23991:18;23983:26;;24055:9;24049:4;24045:20;24041:1;24030:9;24026:17;24019:47;24083:131;24209:4;24083:131;:::i;:::-;24075:139;;23802:419;;;:::o;24227:::-;24393:4;24431:2;24420:9;24416:18;24408:26;;24480:9;24474:4;24470:20;24466:1;24455:9;24451:17;24444:47;24508:131;24634:4;24508:131;:::i;:::-;24500:139;;24227:419;;;:::o;24652:::-;24818:4;24856:2;24845:9;24841:18;24833:26;;24905:9;24899:4;24895:20;24891:1;24880:9;24876:17;24869:47;24933:131;25059:4;24933:131;:::i;:::-;24925:139;;24652:419;;;:::o;25077:::-;25243:4;25281:2;25270:9;25266:18;25258:26;;25330:9;25324:4;25320:20;25316:1;25305:9;25301:17;25294:47;25358:131;25484:4;25358:131;:::i;:::-;25350:139;;25077:419;;;:::o;25502:::-;25668:4;25706:2;25695:9;25691:18;25683:26;;25755:9;25749:4;25745:20;25741:1;25730:9;25726:17;25719:47;25783:131;25909:4;25783:131;:::i;:::-;25775:139;;25502:419;;;:::o;25927:::-;26093:4;26131:2;26120:9;26116:18;26108:26;;26180:9;26174:4;26170:20;26166:1;26155:9;26151:17;26144:47;26208:131;26334:4;26208:131;:::i;:::-;26200:139;;25927:419;;;:::o;26352:::-;26518:4;26556:2;26545:9;26541:18;26533:26;;26605:9;26599:4;26595:20;26591:1;26580:9;26576:17;26569:47;26633:131;26759:4;26633:131;:::i;:::-;26625:139;;26352:419;;;:::o;26777:::-;26943:4;26981:2;26970:9;26966:18;26958:26;;27030:9;27024:4;27020:20;27016:1;27005:9;27001:17;26994:47;27058:131;27184:4;27058:131;:::i;:::-;27050:139;;26777:419;;;:::o;27202:::-;27368:4;27406:2;27395:9;27391:18;27383:26;;27455:9;27449:4;27445:20;27441:1;27430:9;27426:17;27419:47;27483:131;27609:4;27483:131;:::i;:::-;27475:139;;27202:419;;;:::o;27627:::-;27793:4;27831:2;27820:9;27816:18;27808:26;;27880:9;27874:4;27870:20;27866:1;27855:9;27851:17;27844:47;27908:131;28034:4;27908:131;:::i;:::-;27900:139;;27627:419;;;:::o;28052:::-;28218:4;28256:2;28245:9;28241:18;28233:26;;28305:9;28299:4;28295:20;28291:1;28280:9;28276:17;28269:47;28333:131;28459:4;28333:131;:::i;:::-;28325:139;;28052:419;;;:::o;28477:::-;28643:4;28681:2;28670:9;28666:18;28658:26;;28730:9;28724:4;28720:20;28716:1;28705:9;28701:17;28694:47;28758:131;28884:4;28758:131;:::i;:::-;28750:139;;28477:419;;;:::o;28902:::-;29068:4;29106:2;29095:9;29091:18;29083:26;;29155:9;29149:4;29145:20;29141:1;29130:9;29126:17;29119:47;29183:131;29309:4;29183:131;:::i;:::-;29175:139;;28902:419;;;:::o;29327:::-;29493:4;29531:2;29520:9;29516:18;29508:26;;29580:9;29574:4;29570:20;29566:1;29555:9;29551:17;29544:47;29608:131;29734:4;29608:131;:::i;:::-;29600:139;;29327:419;;;:::o;29752:::-;29918:4;29956:2;29945:9;29941:18;29933:26;;30005:9;29999:4;29995:20;29991:1;29980:9;29976:17;29969:47;30033:131;30159:4;30033:131;:::i;:::-;30025:139;;29752:419;;;:::o;30177:::-;30343:4;30381:2;30370:9;30366:18;30358:26;;30430:9;30424:4;30420:20;30416:1;30405:9;30401:17;30394:47;30458:131;30584:4;30458:131;:::i;:::-;30450:139;;30177:419;;;:::o;30602:::-;30768:4;30806:2;30795:9;30791:18;30783:26;;30855:9;30849:4;30845:20;30841:1;30830:9;30826:17;30819:47;30883:131;31009:4;30883:131;:::i;:::-;30875:139;;30602:419;;;:::o;31027:222::-;31120:4;31158:2;31147:9;31143:18;31135:26;;31171:71;31239:1;31228:9;31224:17;31215:6;31171:71;:::i;:::-;31027:222;;;;:::o;31255:129::-;31289:6;31316:20;;:::i;:::-;31306:30;;31345:33;31373:4;31365:6;31345:33;:::i;:::-;31255:129;;;:::o;31390:75::-;31423:6;31456:2;31450:9;31440:19;;31390:75;:::o;31471:307::-;31532:4;31622:18;31614:6;31611:30;31608:56;;;31644:18;;:::i;:::-;31608:56;31682:29;31704:6;31682:29;:::i;:::-;31674:37;;31766:4;31760;31756:15;31748:23;;31471:307;;;:::o;31784:98::-;31835:6;31869:5;31863:12;31853:22;;31784:98;;;:::o;31888:99::-;31940:6;31974:5;31968:12;31958:22;;31888:99;;;:::o;31993:168::-;32076:11;32110:6;32105:3;32098:19;32150:4;32145:3;32141:14;32126:29;;31993:168;;;;:::o;32167:169::-;32251:11;32285:6;32280:3;32273:19;32325:4;32320:3;32316:14;32301:29;;32167:169;;;;:::o;32342:148::-;32444:11;32481:3;32466:18;;32342:148;;;;:::o;32496:273::-;32536:3;32555:20;32573:1;32555:20;:::i;:::-;32550:25;;32589:20;32607:1;32589:20;:::i;:::-;32584:25;;32711:1;32675:34;32671:42;32668:1;32665:49;32662:75;;;32717:18;;:::i;:::-;32662:75;32761:1;32758;32754:9;32747:16;;32496:273;;;;:::o;32775:305::-;32815:3;32834:20;32852:1;32834:20;:::i;:::-;32829:25;;32868:20;32886:1;32868:20;:::i;:::-;32863:25;;33022:1;32954:66;32950:74;32947:1;32944:81;32941:107;;;33028:18;;:::i;:::-;32941:107;33072:1;33069;33065:9;33058:16;;32775:305;;;;:::o;33086:185::-;33126:1;33143:20;33161:1;33143:20;:::i;:::-;33138:25;;33177:20;33195:1;33177:20;:::i;:::-;33172:25;;33216:1;33206:35;;33221:18;;:::i;:::-;33206:35;33263:1;33260;33256:9;33251:14;;33086:185;;;;:::o;33277:348::-;33317:7;33340:20;33358:1;33340:20;:::i;:::-;33335:25;;33374:20;33392:1;33374:20;:::i;:::-;33369:25;;33562:1;33494:66;33490:74;33487:1;33484:81;33479:1;33472:9;33465:17;33461:105;33458:131;;;33569:18;;:::i;:::-;33458:131;33617:1;33614;33610:9;33599:20;;33277:348;;;;:::o;33631:191::-;33671:4;33691:20;33709:1;33691:20;:::i;:::-;33686:25;;33725:20;33743:1;33725:20;:::i;:::-;33720:25;;33764:1;33761;33758:8;33755:34;;;33769:18;;:::i;:::-;33755:34;33814:1;33811;33807:9;33799:17;;33631:191;;;;:::o;33828:::-;33868:4;33888:20;33906:1;33888:20;:::i;:::-;33883:25;;33922:20;33940:1;33922:20;:::i;:::-;33917:25;;33961:1;33958;33955:8;33952:34;;;33966:18;;:::i;:::-;33952:34;34011:1;34008;34004:9;33996:17;;33828:191;;;;:::o;34025:96::-;34062:7;34091:24;34109:5;34091:24;:::i;:::-;34080:35;;34025:96;;;:::o;34127:90::-;34161:7;34204:5;34197:13;34190:21;34179:32;;34127:90;;;:::o;34223:149::-;34259:7;34299:66;34292:5;34288:78;34277:89;;34223:149;;;:::o;34378:118::-;34415:7;34455:34;34448:5;34444:46;34433:57;;34378:118;;;:::o;34502:126::-;34539:7;34579:42;34572:5;34568:54;34557:65;;34502:126;;;:::o;34634:77::-;34671:7;34700:5;34689:16;;34634:77;;;:::o;34717:154::-;34801:6;34796:3;34791;34778:30;34863:1;34854:6;34849:3;34845:16;34838:27;34717:154;;;:::o;34877:307::-;34945:1;34955:113;34969:6;34966:1;34963:13;34955:113;;;35054:1;35049:3;35045:11;35039:18;35035:1;35030:3;35026:11;35019:39;34991:2;34988:1;34984:10;34979:15;;34955:113;;;35086:6;35083:1;35080:13;35077:101;;;35166:1;35157:6;35152:3;35148:16;35141:27;35077:101;34926:258;34877:307;;;:::o;35190:171::-;35229:3;35252:24;35270:5;35252:24;:::i;:::-;35243:33;;35298:4;35291:5;35288:15;35285:41;;;35306:18;;:::i;:::-;35285:41;35353:1;35346:5;35342:13;35335:20;;35190:171;;;:::o;35367:320::-;35411:6;35448:1;35442:4;35438:12;35428:22;;35495:1;35489:4;35485:12;35516:18;35506:81;;35572:4;35564:6;35560:17;35550:27;;35506:81;35634:2;35626:6;35623:14;35603:18;35600:38;35597:84;;;35653:18;;:::i;:::-;35597:84;35418:269;35367:320;;;:::o;35693:281::-;35776:27;35798:4;35776:27;:::i;:::-;35768:6;35764:40;35906:6;35894:10;35891:22;35870:18;35858:10;35855:34;35852:62;35849:88;;;35917:18;;:::i;:::-;35849:88;35957:10;35953:2;35946:22;35736:238;35693:281;;:::o;35980:233::-;36019:3;36042:24;36060:5;36042:24;:::i;:::-;36033:33;;36088:66;36081:5;36078:77;36075:103;;;36158:18;;:::i;:::-;36075:103;36205:1;36198:5;36194:13;36187:20;;35980:233;;;:::o;36219:176::-;36251:1;36268:20;36286:1;36268:20;:::i;:::-;36263:25;;36302:20;36320:1;36302:20;:::i;:::-;36297:25;;36341:1;36331:35;;36346:18;;:::i;:::-;36331:35;36387:1;36384;36380:9;36375:14;;36219:176;;;;:::o;36401:180::-;36449:77;36446:1;36439:88;36546:4;36543:1;36536:15;36570:4;36567:1;36560:15;36587:180;36635:77;36632:1;36625:88;36732:4;36729:1;36722:15;36756:4;36753:1;36746:15;36773:180;36821:77;36818:1;36811:88;36918:4;36915:1;36908:15;36942:4;36939:1;36932:15;36959:180;37007:77;37004:1;36997:88;37104:4;37101:1;37094:15;37128:4;37125:1;37118:15;37145:180;37193:77;37190:1;37183:88;37290:4;37287:1;37280:15;37314:4;37311:1;37304:15;37331:117;37440:1;37437;37430:12;37454:117;37563:1;37560;37553:12;37577:117;37686:1;37683;37676:12;37700:117;37809:1;37806;37799:12;37823:117;37932:1;37929;37922:12;37946:117;38055:1;38052;38045:12;38069:102;38110:6;38161:2;38157:7;38152:2;38145:5;38141:14;38137:28;38127:38;;38069:102;;;:::o;38177:221::-;38317:34;38313:1;38305:6;38301:14;38294:58;38386:4;38381:2;38373:6;38369:15;38362:29;38177:221;:::o;38404:225::-;38544:34;38540:1;38532:6;38528:14;38521:58;38613:8;38608:2;38600:6;38596:15;38589:33;38404:225;:::o;38635:229::-;38775:34;38771:1;38763:6;38759:14;38752:58;38844:12;38839:2;38831:6;38827:15;38820:37;38635:229;:::o;38870:222::-;39010:34;39006:1;38998:6;38994:14;38987:58;39079:5;39074:2;39066:6;39062:15;39055:30;38870:222;:::o;39098:175::-;39238:27;39234:1;39226:6;39222:14;39215:51;39098:175;:::o;39279:224::-;39419:34;39415:1;39407:6;39403:14;39396:58;39488:7;39483:2;39475:6;39471:15;39464:32;39279:224;:::o;39509:180::-;39649:32;39645:1;39637:6;39633:14;39626:56;39509:180;:::o;39695:244::-;39835:34;39831:1;39823:6;39819:14;39812:58;39904:27;39899:2;39891:6;39887:15;39880:52;39695:244;:::o;39945:230::-;40085:34;40081:1;40073:6;40069:14;40062:58;40154:13;40149:2;40141:6;40137:15;40130:38;39945:230;:::o;40181:225::-;40321:34;40317:1;40309:6;40305:14;40298:58;40390:8;40385:2;40377:6;40373:15;40366:33;40181:225;:::o;40412:182::-;40552:34;40548:1;40540:6;40536:14;40529:58;40412:182;:::o;40600:::-;40740:34;40736:1;40728:6;40724:14;40717:58;40600:182;:::o;40788:234::-;40928:34;40924:1;40916:6;40912:14;40905:58;40997:17;40992:2;40984:6;40980:15;40973:42;40788:234;:::o;41028:176::-;41168:28;41164:1;41156:6;41152:14;41145:52;41028:176;:::o;41210:237::-;41350:34;41346:1;41338:6;41334:14;41327:58;41419:20;41414:2;41406:6;41402:15;41395:45;41210:237;:::o;41453:221::-;41593:34;41589:1;41581:6;41577:14;41570:58;41662:4;41657:2;41649:6;41645:15;41638:29;41453:221;:::o;41680:238::-;41820:34;41816:1;41808:6;41804:14;41797:58;41889:21;41884:2;41876:6;41872:15;41865:46;41680:238;:::o;41924:179::-;42064:31;42060:1;42052:6;42048:14;42041:55;41924:179;:::o;42109:220::-;42249:34;42245:1;42237:6;42233:14;42226:58;42318:3;42313:2;42305:6;42301:15;42294:28;42109:220;:::o;42335:231::-;42475:34;42471:1;42463:6;42459:14;42452:58;42544:14;42539:2;42531:6;42527:15;42520:39;42335:231;:::o;42572:233::-;42712:34;42708:1;42700:6;42696:14;42689:58;42781:16;42776:2;42768:6;42764:15;42757:41;42572:233;:::o;42811:179::-;42951:31;42947:1;42939:6;42935:14;42928:55;42811:179;:::o;42996:234::-;43136:34;43132:1;43124:6;43120:14;43113:58;43205:17;43200:2;43192:6;43188:15;43181:42;42996:234;:::o;43236:232::-;43376:34;43372:1;43364:6;43360:14;43353:58;43445:15;43440:2;43432:6;43428:15;43421:40;43236:232;:::o;43474:221::-;43614:34;43610:1;43602:6;43598:14;43591:58;43683:4;43678:2;43670:6;43666:15;43659:29;43474:221;:::o;43701:176::-;43841:28;43837:1;43829:6;43825:14;43818:52;43701:176;:::o;43883:122::-;43956:24;43974:5;43956:24;:::i;:::-;43949:5;43946:35;43936:63;;43995:1;43992;43985:12;43936:63;43883:122;:::o;44011:116::-;44081:21;44096:5;44081:21;:::i;:::-;44074:5;44071:32;44061:60;;44117:1;44114;44107:12;44061:60;44011:116;:::o;44133:120::-;44205:23;44222:5;44205:23;:::i;:::-;44198:5;44195:34;44185:62;;44243:1;44240;44233:12;44185:62;44133:120;:::o;44259:122::-;44332:24;44350:5;44332:24;:::i;:::-;44325:5;44322:35;44312:63;;44371:1;44368;44361:12;44312:63;44259:122;:::o

Swarm Source

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