ETH Price: $3,372.11 (+0.14%)

Token

CorinnaDAO (CORIN)
 

Overview

Max Total Supply

674 CORIN

Holders

166

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 CORIN
0x15008a722270900f04dbddaf809ae9cd0af8386c
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:
CorinnaDAO

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-18
*/

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * 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.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  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(collectionSize). 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"
    );

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

  /**
   * @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:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `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 > collectionSize - 1) {
      endIndex = collectionSize - 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 {}
}

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

pragma solidity ^0.8.0;

contract CorinnaDAO is ERC721A, Ownable {
    uint256 public NFT_PRICE = 10000000000000000;
    uint256 public MAX_SUPPLY = 1100;
    uint256 public MAX_FREE_MINTS = 5;
    uint256 public MAX_MINTS = 10;
    uint256 public FREE_MINTS = 555;

    bool public DROP_ACTIVE = false;

    string public baseURI = "";
    
    constructor() ERC721A("CorinnaDAO", "CORIN", MAX_MINTS, MAX_SUPPLY) {}

    function mint(uint256 numTokens) public payable {
        require(DROP_ACTIVE);
        require(numTokens > 0 && numTokens <= MAX_MINTS);
        require(totalSupply() + numTokens <= MAX_SUPPLY);
        require(msg.value >= NFT_PRICE * numTokens);

        _safeMint(msg.sender, numTokens);
    }

    function mintFree(uint256 numTokens) public {
        require(DROP_ACTIVE);
        require(numTokens > 0 && numTokens <= MAX_FREE_MINTS);
        require(totalSupply() + numTokens <= FREE_MINTS, "There are no more free mints left");

        _safeMint(msg.sender, numTokens);
    }

    function flipDropState() public onlyOwner {
        DROP_ACTIVE = !DROP_ACTIVE;
    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        NFT_PRICE = newPrice;
    }

    function setMaxMints(uint256 newMax) public onlyOwner {
        MAX_MINTS = newMax;
    }

    function setSupply(uint256 newSupply) public onlyOwner {
        MAX_SUPPLY = newSupply;
    }

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

    function withdraw() public onlyOwner {
        require(payable(msg.sender).send(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":"DROP_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","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":"flipDropState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600080556000600755662386f26fc1000060095561044c600a556005600b55600a600c5561022b600d556000600e60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600f908051906020019062000070929190620002b7565b503480156200007e57600080fd5b506040518060400160405280600a81526020017f436f72696e6e6144414f000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434f52494e000000000000000000000000000000000000000000000000000000815250600c54600a546000811162000137576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012e9062000459565b60405180910390fd5b600082116200017d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001749062000437565b60405180910390fd5b836001908051906020019062000195929190620002b7565b508260029080519060200190620001ae929190620002b7565b508160a08181525050806080818152505050505050620001e3620001d7620001e960201b60201c565b620001f160201b60201c565b620004f1565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c5906200048c565b90600052602060002090601f016020900481019282620002e9576000855562000335565b82601f106200030457805160ff191683800117855562000335565b8280016001018555821562000335579182015b828111156200033457825182559160200191906001019062000317565b5b50905062000344919062000348565b5090565b5b808211156200036357600081600090555060010162000349565b5090565b6000620003766027836200047b565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620003de602e836200047b565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620004528162000367565b9050919050565b600060208201905081810360008301526200047481620003cf565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004a557607f821691505b60208210811415620004bc57620004bb620004c2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a0516142e762000522600039600081816121130152818161213c01526128490152600050506142e76000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063a4146733116100a0578063cce132d11161006f578063cce132d114610732578063d7224ba01461075d578063e985e9c514610788578063f2fde38b146107c5578063f7cd09c7146107ee57610204565b8063a414673314610678578063b88d4fde146106a1578063c7a6b21e146106ca578063c87b56dd146106f557610204565b806391b7f5ed116100e757806391b7f5ed146105c857806395d89b41146105f157806396f8f6dd1461061c578063a0712d6814610633578063a22cb4651461064f57610204565b8063715018a614610532578063764267b61461054957806379c9cb7b146105745780638da5cb5b1461059d57610204565b80633b4c4b251161019b57806355f804b31161016a57806355f804b3146104395780636352211e14610462578063676dd5631461049f5780636c0360eb146104ca57806370a08231146104f557610204565b80633b4c4b25146103935780633ccfd60b146103bc57806342842e0e146103d35780634f6ccce7146103fc57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd146103025780632f745c591461032b57806332cb6b0c1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613037565b610819565b60405161023d9190613a85565b60405180910390f35b34801561025257600080fd5b5061025b610963565b6040516102689190613aa0565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906130ca565b6109f5565b6040516102a59190613a1e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ffb565b610a7a565b005b3480156102e357600080fd5b506102ec610b93565b6040516102f99190613d62565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612ef5565b610b9c565b005b34801561033757600080fd5b50610352600480360381019061034d9190612ffb565b610bac565b60405161035f9190613d62565b60405180910390f35b34801561037457600080fd5b5061037d610daa565b60405161038a9190613d62565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906130ca565b610db0565b005b3480156103c857600080fd5b506103d1610e36565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612ef5565b610ef2565b005b34801561040857600080fd5b50610423600480360381019061041e91906130ca565b610f12565b6040516104309190613d62565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613089565b610f65565b005b34801561046e57600080fd5b50610489600480360381019061048491906130ca565b610ffb565b6040516104969190613a1e565b60405180910390f35b3480156104ab57600080fd5b506104b4611011565b6040516104c19190613d62565b60405180910390f35b3480156104d657600080fd5b506104df611017565b6040516104ec9190613aa0565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612e90565b6110a5565b6040516105299190613d62565b60405180910390f35b34801561053e57600080fd5b5061054761118e565b005b34801561055557600080fd5b5061055e611216565b60405161056b9190613d62565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906130ca565b61121c565b005b3480156105a957600080fd5b506105b26112a2565b6040516105bf9190613a1e565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea91906130ca565b6112cc565b005b3480156105fd57600080fd5b50610606611352565b6040516106139190613aa0565b60405180910390f35b34801561062857600080fd5b506106316113e4565b005b61064d600480360381019061064891906130ca565b61148c565b005b34801561065b57600080fd5b5061067660048036038101906106719190612fbf565b611508565b005b34801561068457600080fd5b5061069f600480360381019061069a91906130ca565b611689565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190612f44565b611721565b005b3480156106d657600080fd5b506106df61177d565b6040516106ec9190613d62565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906130ca565b611783565b6040516107299190613aa0565b60405180910390f35b34801561073e57600080fd5b5061074761182a565b6040516107549190613d62565b60405180910390f35b34801561076957600080fd5b50610772611830565b60405161077f9190613d62565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190612eb9565b611836565b6040516107bc9190613a85565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e79190612e90565b6118ca565b005b3480156107fa57600080fd5b506108036119c2565b6040516108109190613a85565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095c575061095b826119d5565b5b9050919050565b606060018054610972906140dc565b80601f016020809104026020016040519081016040528092919081815260200182805461099e906140dc565b80156109eb5780601f106109c0576101008083540402835291602001916109eb565b820191906000526020600020905b8154815290600101906020018083116109ce57829003601f168201915b5050505050905090565b6000610a0082611a3f565b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613d22565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8582610ffb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90613c62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611a4c565b73ffffffffffffffffffffffffffffffffffffffff161480610b445750610b4381610b3e611a4c565b611836565b5b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613b62565b60405180910390fd5b610b8e838383611a54565b505050565b60008054905090565b610ba7838383611b06565b505050565b6000610bb7836110a5565b8210610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613ac2565b60405180910390fd5b6000610c02610b93565b905060008060005b83811015610d68576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cfc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d545786841415610d45578195505050505050610da4565b8380610d509061410e565b9450505b508080610d609061410e565b915050610c0a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613ce2565b60405180910390fd5b92915050565b600a5481565b610db8611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610dd66112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613bc2565b60405180910390fd5b80600a8190555050565b610e3e611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610e5c6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990613bc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ef057600080fd5b565b610f0d83838360405180602001604052806000815250611721565b505050565b6000610f1c610b93565b8210610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490613b22565b60405180910390fd5b819050919050565b610f6d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610f8b6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613bc2565b60405180910390fd5b80600f9080519060200190610ff7929190612c7a565b5050565b6000611006826120bf565b600001519050919050565b60095481565b600f8054611024906140dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611050906140dc565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d90613b82565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611196611a4c565b73ffffffffffffffffffffffffffffffffffffffff166111b46112a2565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613bc2565b60405180910390fd5b61121460006122c2565b565b600d5481565b611224611a4c565b73ffffffffffffffffffffffffffffffffffffffff166112426112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613bc2565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112d4611a4c565b73ffffffffffffffffffffffffffffffffffffffff166112f26112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613bc2565b60405180910390fd5b8060098190555050565b606060028054611361906140dc565b80601f016020809104026020016040519081016040528092919081815260200182805461138d906140dc565b80156113da5780601f106113af576101008083540402835291602001916113da565b820191906000526020600020905b8154815290600101906020018083116113bd57829003601f168201915b5050505050905090565b6113ec611a4c565b73ffffffffffffffffffffffffffffffffffffffff1661140a6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790613bc2565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff166114a557600080fd5b6000811180156114b75750600c548111155b6114c057600080fd5b600a54816114cc610b93565b6114d69190613e97565b11156114e157600080fd5b806009546114ef9190613f1e565b3410156114fb57600080fd5b6115053382612388565b50565b611510611a4c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613c02565b60405180910390fd5b806006600061158b611a4c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611638611a4c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d9190613a85565b60405180910390a35050565b600e60009054906101000a900460ff166116a257600080fd5b6000811180156116b45750600b548111155b6116bd57600080fd5b600d54816116c9610b93565b6116d39190613e97565b1115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90613c42565b60405180910390fd5b61171e3382612388565b50565b61172c848484611b06565b611738848484846123a6565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e90613c82565b60405180910390fd5b50505050565b600b5481565b606061178e82611a3f565b6117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c490613be2565b60405180910390fd5b60006117d761253d565b905060008151116117f75760405180602001604052806000815250611822565b80611801846125cf565b6040516020016118129291906139ef565b6040516020818303038152906040525b915050919050565b600c5481565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118d2611a4c565b73ffffffffffffffffffffffffffffffffffffffff166118f06112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90613bc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613ae2565b60405180910390fd5b6119bf816122c2565b50565b600e60009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b11826120bf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b38611a4c565b73ffffffffffffffffffffffffffffffffffffffff161480611b945750611b5d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16611b7c846109f5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bb05750611baf8260000151611baa611a4c565b611836565b5b905080611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613c22565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613ba2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90613b42565b60405180910390fd5b611ce1858585600161277c565b611cf16000848460000151611a54565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d5f9190613f78565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e039190613e51565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611f099190613e97565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204f57611f7f81611a3f565b1561204e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120b78686866001612782565b505050505050565b6120c7612d00565b6120d082611a3f565b61210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690613b02565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106121735760017f0000000000000000000000000000000000000000000000000000000000000000846121669190613fac565b6121709190613e97565b90505b60008390505b818110612281576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461226d578093505050506122bd565b508080612279906140b2565b915050612179565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613d02565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a2828260405180602001604052806000815250612788565b5050565b60006123c78473ffffffffffffffffffffffffffffffffffffffff16612c67565b15612530578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f0611a4c565b8786866040518563ffffffff1660e01b81526004016124129493929190613a39565b602060405180830381600087803b15801561242c57600080fd5b505af192505050801561245d57506040513d601f19601f8201168201806040525081019061245a9190613060565b60015b6124e0573d806000811461248d576040519150601f19603f3d011682016040523d82523d6000602084013e612492565b606091505b506000815114156124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90613c82565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612535565b600190505b949350505050565b6060600f805461254c906140dc565b80601f0160208091040260200160405190810160405280929190818152602001828054612578906140dc565b80156125c55780601f1061259a576101008083540402835291602001916125c5565b820191906000526020600020905b8154815290600101906020018083116125a857829003601f168201915b5050505050905090565b60606000821415612617576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612777565b600082905060005b600082146126495780806126329061410e565b915050600a826126429190613eed565b915061261f565b60008167ffffffffffffffff81111561268b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126bd5781602001600182028036833780820191505090505b5090505b60008514612770576001826126d69190613fac565b9150600a856126e59190614157565b60306126f19190613e97565b60f81b81838151811061272d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127699190613eed565b94506126c1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590613cc2565b60405180910390fd5b61280781611a3f565b15612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90613ca2565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190613d42565b60405180910390fd5b6128b7600085838661277c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129b49190613e51565b6fffffffffffffffffffffffffffffffff1681526020018583602001516129db9190613e51565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c4a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bea60008884886123a6565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2090613c82565b60405180910390fd5b8180612c349061410e565b9250508080612c429061410e565b915050612b79565b5080600081905550612c5f6000878588612782565b505050505050565b600080823b905060008111915050919050565b828054612c86906140dc565b90600052602060002090601f016020900481019282612ca85760008555612cef565b82601f10612cc157805160ff1916838001178555612cef565b82800160010185558215612cef579182015b82811115612cee578251825591602001919060010190612cd3565b5b509050612cfc9190612d3a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d53576000816000905550600101612d3b565b5090565b6000612d6a612d6584613dae565b613d7d565b905082815260208101848484011115612d8257600080fd5b612d8d848285614070565b509392505050565b6000612da8612da384613dde565b613d7d565b905082815260208101848484011115612dc057600080fd5b612dcb848285614070565b509392505050565b600081359050612de281614255565b92915050565b600081359050612df78161426c565b92915050565b600081359050612e0c81614283565b92915050565b600081519050612e2181614283565b92915050565b600082601f830112612e3857600080fd5b8135612e48848260208601612d57565b91505092915050565b600082601f830112612e6257600080fd5b8135612e72848260208601612d95565b91505092915050565b600081359050612e8a8161429a565b92915050565b600060208284031215612ea257600080fd5b6000612eb084828501612dd3565b91505092915050565b60008060408385031215612ecc57600080fd5b6000612eda85828601612dd3565b9250506020612eeb85828601612dd3565b9150509250929050565b600080600060608486031215612f0a57600080fd5b6000612f1886828701612dd3565b9350506020612f2986828701612dd3565b9250506040612f3a86828701612e7b565b9150509250925092565b60008060008060808587031215612f5a57600080fd5b6000612f6887828801612dd3565b9450506020612f7987828801612dd3565b9350506040612f8a87828801612e7b565b925050606085013567ffffffffffffffff811115612fa757600080fd5b612fb387828801612e27565b91505092959194509250565b60008060408385031215612fd257600080fd5b6000612fe085828601612dd3565b9250506020612ff185828601612de8565b9150509250929050565b6000806040838503121561300e57600080fd5b600061301c85828601612dd3565b925050602061302d85828601612e7b565b9150509250929050565b60006020828403121561304957600080fd5b600061305784828501612dfd565b91505092915050565b60006020828403121561307257600080fd5b600061308084828501612e12565b91505092915050565b60006020828403121561309b57600080fd5b600082013567ffffffffffffffff8111156130b557600080fd5b6130c184828501612e51565b91505092915050565b6000602082840312156130dc57600080fd5b60006130ea84828501612e7b565b91505092915050565b6130fc81613fe0565b82525050565b61310b81613ff2565b82525050565b600061311c82613e0e565b6131268185613e24565b935061313681856020860161407f565b61313f81614244565b840191505092915050565b600061315582613e19565b61315f8185613e35565b935061316f81856020860161407f565b61317881614244565b840191505092915050565b600061318e82613e19565b6131988185613e46565b93506131a881856020860161407f565b80840191505092915050565b60006131c1602283613e35565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613227602683613e35565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061328d602a83613e35565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f3602383613e35565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613359602583613e35565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133bf603983613e35565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613425602b83613e35565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061348b602683613e35565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f1600583613e46565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613531602083613e35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613571602f83613e35565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135d7601a83613e35565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613617603283613e35565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061367d602183613e35565b91507f546865726520617265206e6f206d6f72652066726565206d696e7473206c656660008301527f74000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e3602283613e35565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613749603383613e35565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006137af601d83613e35565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006137ef602183613e35565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613855602e83613e35565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006138bb602f83613e35565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613921602d83613e35565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000613987602283613e35565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139e981614066565b82525050565b60006139fb8285613183565b9150613a078284613183565b9150613a12826134e4565b91508190509392505050565b6000602082019050613a3360008301846130f3565b92915050565b6000608082019050613a4e60008301876130f3565b613a5b60208301866130f3565b613a6860408301856139e0565b8181036060830152613a7a8184613111565b905095945050505050565b6000602082019050613a9a6000830184613102565b92915050565b60006020820190508181036000830152613aba818461314a565b905092915050565b60006020820190508181036000830152613adb816131b4565b9050919050565b60006020820190508181036000830152613afb8161321a565b9050919050565b60006020820190508181036000830152613b1b81613280565b9050919050565b60006020820190508181036000830152613b3b816132e6565b9050919050565b60006020820190508181036000830152613b5b8161334c565b9050919050565b60006020820190508181036000830152613b7b816133b2565b9050919050565b60006020820190508181036000830152613b9b81613418565b9050919050565b60006020820190508181036000830152613bbb8161347e565b9050919050565b60006020820190508181036000830152613bdb81613524565b9050919050565b60006020820190508181036000830152613bfb81613564565b9050919050565b60006020820190508181036000830152613c1b816135ca565b9050919050565b60006020820190508181036000830152613c3b8161360a565b9050919050565b60006020820190508181036000830152613c5b81613670565b9050919050565b60006020820190508181036000830152613c7b816136d6565b9050919050565b60006020820190508181036000830152613c9b8161373c565b9050919050565b60006020820190508181036000830152613cbb816137a2565b9050919050565b60006020820190508181036000830152613cdb816137e2565b9050919050565b60006020820190508181036000830152613cfb81613848565b9050919050565b60006020820190508181036000830152613d1b816138ae565b9050919050565b60006020820190508181036000830152613d3b81613914565b9050919050565b60006020820190508181036000830152613d5b8161397a565b9050919050565b6000602082019050613d7760008301846139e0565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613da457613da3614215565b5b8060405250919050565b600067ffffffffffffffff821115613dc957613dc8614215565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613df957613df8614215565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5c8261402a565b9150613e678361402a565b9250826fffffffffffffffffffffffffffffffff03821115613e8c57613e8b614188565b5b828201905092915050565b6000613ea282614066565b9150613ead83614066565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee257613ee1614188565b5b828201905092915050565b6000613ef882614066565b9150613f0383614066565b925082613f1357613f126141b7565b5b828204905092915050565b6000613f2982614066565b9150613f3483614066565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6d57613f6c614188565b5b828202905092915050565b6000613f838261402a565b9150613f8e8361402a565b925082821015613fa157613fa0614188565b5b828203905092915050565b6000613fb782614066565b9150613fc283614066565b925082821015613fd557613fd4614188565b5b828203905092915050565b6000613feb82614046565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561409d578082015181840152602081019050614082565b838111156140ac576000848401525b50505050565b60006140bd82614066565b915060008214156140d1576140d0614188565b5b600182039050919050565b600060028204905060018216806140f457607f821691505b60208210811415614108576141076141e6565b5b50919050565b600061411982614066565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561414c5761414b614188565b5b600182019050919050565b600061416282614066565b915061416d83614066565b92508261417d5761417c6141b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61425e81613fe0565b811461426957600080fd5b50565b61427581613ff2565b811461428057600080fd5b50565b61428c81613ffe565b811461429757600080fd5b50565b6142a381614066565b81146142ae57600080fd5b5056fea26469706673582212202522e0bcd6a79ff72b546ff1e28277fcae2b4f184f965f03c5e7e85ae84958a164736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102045760003560e01c8063715018a611610118578063a4146733116100a0578063cce132d11161006f578063cce132d114610732578063d7224ba01461075d578063e985e9c514610788578063f2fde38b146107c5578063f7cd09c7146107ee57610204565b8063a414673314610678578063b88d4fde146106a1578063c7a6b21e146106ca578063c87b56dd146106f557610204565b806391b7f5ed116100e757806391b7f5ed146105c857806395d89b41146105f157806396f8f6dd1461061c578063a0712d6814610633578063a22cb4651461064f57610204565b8063715018a614610532578063764267b61461054957806379c9cb7b146105745780638da5cb5b1461059d57610204565b80633b4c4b251161019b57806355f804b31161016a57806355f804b3146104395780636352211e14610462578063676dd5631461049f5780636c0360eb146104ca57806370a08231146104f557610204565b80633b4c4b25146103935780633ccfd60b146103bc57806342842e0e146103d35780634f6ccce7146103fc57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd146103025780632f745c591461032b57806332cb6b0c1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613037565b610819565b60405161023d9190613a85565b60405180910390f35b34801561025257600080fd5b5061025b610963565b6040516102689190613aa0565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906130ca565b6109f5565b6040516102a59190613a1e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612ffb565b610a7a565b005b3480156102e357600080fd5b506102ec610b93565b6040516102f99190613d62565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190612ef5565b610b9c565b005b34801561033757600080fd5b50610352600480360381019061034d9190612ffb565b610bac565b60405161035f9190613d62565b60405180910390f35b34801561037457600080fd5b5061037d610daa565b60405161038a9190613d62565b60405180910390f35b34801561039f57600080fd5b506103ba60048036038101906103b591906130ca565b610db0565b005b3480156103c857600080fd5b506103d1610e36565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190612ef5565b610ef2565b005b34801561040857600080fd5b50610423600480360381019061041e91906130ca565b610f12565b6040516104309190613d62565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613089565b610f65565b005b34801561046e57600080fd5b50610489600480360381019061048491906130ca565b610ffb565b6040516104969190613a1e565b60405180910390f35b3480156104ab57600080fd5b506104b4611011565b6040516104c19190613d62565b60405180910390f35b3480156104d657600080fd5b506104df611017565b6040516104ec9190613aa0565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190612e90565b6110a5565b6040516105299190613d62565b60405180910390f35b34801561053e57600080fd5b5061054761118e565b005b34801561055557600080fd5b5061055e611216565b60405161056b9190613d62565b60405180910390f35b34801561058057600080fd5b5061059b600480360381019061059691906130ca565b61121c565b005b3480156105a957600080fd5b506105b26112a2565b6040516105bf9190613a1e565b60405180910390f35b3480156105d457600080fd5b506105ef60048036038101906105ea91906130ca565b6112cc565b005b3480156105fd57600080fd5b50610606611352565b6040516106139190613aa0565b60405180910390f35b34801561062857600080fd5b506106316113e4565b005b61064d600480360381019061064891906130ca565b61148c565b005b34801561065b57600080fd5b5061067660048036038101906106719190612fbf565b611508565b005b34801561068457600080fd5b5061069f600480360381019061069a91906130ca565b611689565b005b3480156106ad57600080fd5b506106c860048036038101906106c39190612f44565b611721565b005b3480156106d657600080fd5b506106df61177d565b6040516106ec9190613d62565b60405180910390f35b34801561070157600080fd5b5061071c600480360381019061071791906130ca565b611783565b6040516107299190613aa0565b60405180910390f35b34801561073e57600080fd5b5061074761182a565b6040516107549190613d62565b60405180910390f35b34801561076957600080fd5b50610772611830565b60405161077f9190613d62565b60405180910390f35b34801561079457600080fd5b506107af60048036038101906107aa9190612eb9565b611836565b6040516107bc9190613a85565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e79190612e90565b6118ca565b005b3480156107fa57600080fd5b506108036119c2565b6040516108109190613a85565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094c57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095c575061095b826119d5565b5b9050919050565b606060018054610972906140dc565b80601f016020809104026020016040519081016040528092919081815260200182805461099e906140dc565b80156109eb5780601f106109c0576101008083540402835291602001916109eb565b820191906000526020600020905b8154815290600101906020018083116109ce57829003601f168201915b5050505050905090565b6000610a0082611a3f565b610a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3690613d22565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a8582610ffb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed90613c62565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b15611a4c565b73ffffffffffffffffffffffffffffffffffffffff161480610b445750610b4381610b3e611a4c565b611836565b5b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613b62565b60405180910390fd5b610b8e838383611a54565b505050565b60008054905090565b610ba7838383611b06565b505050565b6000610bb7836110a5565b8210610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef90613ac2565b60405180910390fd5b6000610c02610b93565b905060008060005b83811015610d68576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cfc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d545786841415610d45578195505050505050610da4565b8380610d509061410e565b9450505b508080610d609061410e565b915050610c0a565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b90613ce2565b60405180910390fd5b92915050565b600a5481565b610db8611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610dd66112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610e2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2390613bc2565b60405180910390fd5b80600a8190555050565b610e3e611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610e5c6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990613bc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ef057600080fd5b565b610f0d83838360405180602001604052806000815250611721565b505050565b6000610f1c610b93565b8210610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5490613b22565b60405180910390fd5b819050919050565b610f6d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16610f8b6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890613bc2565b60405180910390fd5b80600f9080519060200190610ff7929190612c7a565b5050565b6000611006826120bf565b600001519050919050565b60095481565b600f8054611024906140dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611050906140dc565b801561109d5780601f106110725761010080835404028352916020019161109d565b820191906000526020600020905b81548152906001019060200180831161108057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611116576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110d90613b82565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611196611a4c565b73ffffffffffffffffffffffffffffffffffffffff166111b46112a2565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190613bc2565b60405180910390fd5b61121460006122c2565b565b600d5481565b611224611a4c565b73ffffffffffffffffffffffffffffffffffffffff166112426112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f90613bc2565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112d4611a4c565b73ffffffffffffffffffffffffffffffffffffffff166112f26112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613bc2565b60405180910390fd5b8060098190555050565b606060028054611361906140dc565b80601f016020809104026020016040519081016040528092919081815260200182805461138d906140dc565b80156113da5780601f106113af576101008083540402835291602001916113da565b820191906000526020600020905b8154815290600101906020018083116113bd57829003601f168201915b5050505050905090565b6113ec611a4c565b73ffffffffffffffffffffffffffffffffffffffff1661140a6112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790613bc2565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff166114a557600080fd5b6000811180156114b75750600c548111155b6114c057600080fd5b600a54816114cc610b93565b6114d69190613e97565b11156114e157600080fd5b806009546114ef9190613f1e565b3410156114fb57600080fd5b6115053382612388565b50565b611510611a4c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613c02565b60405180910390fd5b806006600061158b611a4c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611638611a4c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161167d9190613a85565b60405180910390a35050565b600e60009054906101000a900460ff166116a257600080fd5b6000811180156116b45750600b548111155b6116bd57600080fd5b600d54816116c9610b93565b6116d39190613e97565b1115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b90613c42565b60405180910390fd5b61171e3382612388565b50565b61172c848484611b06565b611738848484846123a6565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176e90613c82565b60405180910390fd5b50505050565b600b5481565b606061178e82611a3f565b6117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c490613be2565b60405180910390fd5b60006117d761253d565b905060008151116117f75760405180602001604052806000815250611822565b80611801846125cf565b6040516020016118129291906139ef565b6040516020818303038152906040525b915050919050565b600c5481565b60075481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118d2611a4c565b73ffffffffffffffffffffffffffffffffffffffff166118f06112a2565b73ffffffffffffffffffffffffffffffffffffffff1614611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193d90613bc2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613ae2565b60405180910390fd5b6119bf816122c2565b50565b600e60009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611b11826120bf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611b38611a4c565b73ffffffffffffffffffffffffffffffffffffffff161480611b945750611b5d611a4c565b73ffffffffffffffffffffffffffffffffffffffff16611b7c846109f5565b73ffffffffffffffffffffffffffffffffffffffff16145b80611bb05750611baf8260000151611baa611a4c565b611836565b5b905080611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990613c22565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5b90613ba2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90613b42565b60405180910390fd5b611ce1858585600161277c565b611cf16000848460000151611a54565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611d5f9190613f78565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611e039190613e51565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184611f099190613e97565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561204f57611f7f81611a3f565b1561204e576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120b78686866001612782565b505050505050565b6120c7612d00565b6120d082611a3f565b61210f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210690613b02565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a83106121735760017f000000000000000000000000000000000000000000000000000000000000000a846121669190613fac565b6121709190613e97565b90505b60008390505b818110612281576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461226d578093505050506122bd565b508080612279906140b2565b915050612179565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490613d02565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a2828260405180602001604052806000815250612788565b5050565b60006123c78473ffffffffffffffffffffffffffffffffffffffff16612c67565b15612530578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123f0611a4c565b8786866040518563ffffffff1660e01b81526004016124129493929190613a39565b602060405180830381600087803b15801561242c57600080fd5b505af192505050801561245d57506040513d601f19601f8201168201806040525081019061245a9190613060565b60015b6124e0573d806000811461248d576040519150601f19603f3d011682016040523d82523d6000602084013e612492565b606091505b506000815114156124d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cf90613c82565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612535565b600190505b949350505050565b6060600f805461254c906140dc565b80601f0160208091040260200160405190810160405280929190818152602001828054612578906140dc565b80156125c55780601f1061259a576101008083540402835291602001916125c5565b820191906000526020600020905b8154815290600101906020018083116125a857829003601f168201915b5050505050905090565b60606000821415612617576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612777565b600082905060005b600082146126495780806126329061410e565b915050600a826126429190613eed565b915061261f565b60008167ffffffffffffffff81111561268b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126bd5781602001600182028036833780820191505090505b5090505b60008514612770576001826126d69190613fac565b9150600a856126e59190614157565b60306126f19190613e97565b60f81b81838151811061272d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127699190613eed565b94506126c1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590613cc2565b60405180910390fd5b61280781611a3f565b15612847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283e90613ca2565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190613d42565b60405180910390fd5b6128b7600085838661277c565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516129b49190613e51565b6fffffffffffffffffffffffffffffffff1681526020018583602001516129db9190613e51565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612c4a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bea60008884886123a6565b612c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2090613c82565b60405180910390fd5b8180612c349061410e565b9250508080612c429061410e565b915050612b79565b5080600081905550612c5f6000878588612782565b505050505050565b600080823b905060008111915050919050565b828054612c86906140dc565b90600052602060002090601f016020900481019282612ca85760008555612cef565b82601f10612cc157805160ff1916838001178555612cef565b82800160010185558215612cef579182015b82811115612cee578251825591602001919060010190612cd3565b5b509050612cfc9190612d3a565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612d53576000816000905550600101612d3b565b5090565b6000612d6a612d6584613dae565b613d7d565b905082815260208101848484011115612d8257600080fd5b612d8d848285614070565b509392505050565b6000612da8612da384613dde565b613d7d565b905082815260208101848484011115612dc057600080fd5b612dcb848285614070565b509392505050565b600081359050612de281614255565b92915050565b600081359050612df78161426c565b92915050565b600081359050612e0c81614283565b92915050565b600081519050612e2181614283565b92915050565b600082601f830112612e3857600080fd5b8135612e48848260208601612d57565b91505092915050565b600082601f830112612e6257600080fd5b8135612e72848260208601612d95565b91505092915050565b600081359050612e8a8161429a565b92915050565b600060208284031215612ea257600080fd5b6000612eb084828501612dd3565b91505092915050565b60008060408385031215612ecc57600080fd5b6000612eda85828601612dd3565b9250506020612eeb85828601612dd3565b9150509250929050565b600080600060608486031215612f0a57600080fd5b6000612f1886828701612dd3565b9350506020612f2986828701612dd3565b9250506040612f3a86828701612e7b565b9150509250925092565b60008060008060808587031215612f5a57600080fd5b6000612f6887828801612dd3565b9450506020612f7987828801612dd3565b9350506040612f8a87828801612e7b565b925050606085013567ffffffffffffffff811115612fa757600080fd5b612fb387828801612e27565b91505092959194509250565b60008060408385031215612fd257600080fd5b6000612fe085828601612dd3565b9250506020612ff185828601612de8565b9150509250929050565b6000806040838503121561300e57600080fd5b600061301c85828601612dd3565b925050602061302d85828601612e7b565b9150509250929050565b60006020828403121561304957600080fd5b600061305784828501612dfd565b91505092915050565b60006020828403121561307257600080fd5b600061308084828501612e12565b91505092915050565b60006020828403121561309b57600080fd5b600082013567ffffffffffffffff8111156130b557600080fd5b6130c184828501612e51565b91505092915050565b6000602082840312156130dc57600080fd5b60006130ea84828501612e7b565b91505092915050565b6130fc81613fe0565b82525050565b61310b81613ff2565b82525050565b600061311c82613e0e565b6131268185613e24565b935061313681856020860161407f565b61313f81614244565b840191505092915050565b600061315582613e19565b61315f8185613e35565b935061316f81856020860161407f565b61317881614244565b840191505092915050565b600061318e82613e19565b6131988185613e46565b93506131a881856020860161407f565b80840191505092915050565b60006131c1602283613e35565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613227602683613e35565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061328d602a83613e35565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f3602383613e35565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613359602583613e35565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133bf603983613e35565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613425602b83613e35565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b600061348b602683613e35565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006134f1600583613e46565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613531602083613e35565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613571602f83613e35565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135d7601a83613e35565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613617603283613e35565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061367d602183613e35565b91507f546865726520617265206e6f206d6f72652066726565206d696e7473206c656660008301527f74000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006136e3602283613e35565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613749603383613e35565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b60006137af601d83613e35565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b60006137ef602183613e35565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613855602e83613e35565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b60006138bb602f83613e35565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613921602d83613e35565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000613987602283613e35565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6139e981614066565b82525050565b60006139fb8285613183565b9150613a078284613183565b9150613a12826134e4565b91508190509392505050565b6000602082019050613a3360008301846130f3565b92915050565b6000608082019050613a4e60008301876130f3565b613a5b60208301866130f3565b613a6860408301856139e0565b8181036060830152613a7a8184613111565b905095945050505050565b6000602082019050613a9a6000830184613102565b92915050565b60006020820190508181036000830152613aba818461314a565b905092915050565b60006020820190508181036000830152613adb816131b4565b9050919050565b60006020820190508181036000830152613afb8161321a565b9050919050565b60006020820190508181036000830152613b1b81613280565b9050919050565b60006020820190508181036000830152613b3b816132e6565b9050919050565b60006020820190508181036000830152613b5b8161334c565b9050919050565b60006020820190508181036000830152613b7b816133b2565b9050919050565b60006020820190508181036000830152613b9b81613418565b9050919050565b60006020820190508181036000830152613bbb8161347e565b9050919050565b60006020820190508181036000830152613bdb81613524565b9050919050565b60006020820190508181036000830152613bfb81613564565b9050919050565b60006020820190508181036000830152613c1b816135ca565b9050919050565b60006020820190508181036000830152613c3b8161360a565b9050919050565b60006020820190508181036000830152613c5b81613670565b9050919050565b60006020820190508181036000830152613c7b816136d6565b9050919050565b60006020820190508181036000830152613c9b8161373c565b9050919050565b60006020820190508181036000830152613cbb816137a2565b9050919050565b60006020820190508181036000830152613cdb816137e2565b9050919050565b60006020820190508181036000830152613cfb81613848565b9050919050565b60006020820190508181036000830152613d1b816138ae565b9050919050565b60006020820190508181036000830152613d3b81613914565b9050919050565b60006020820190508181036000830152613d5b8161397a565b9050919050565b6000602082019050613d7760008301846139e0565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613da457613da3614215565b5b8060405250919050565b600067ffffffffffffffff821115613dc957613dc8614215565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613df957613df8614215565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e5c8261402a565b9150613e678361402a565b9250826fffffffffffffffffffffffffffffffff03821115613e8c57613e8b614188565b5b828201905092915050565b6000613ea282614066565b9150613ead83614066565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee257613ee1614188565b5b828201905092915050565b6000613ef882614066565b9150613f0383614066565b925082613f1357613f126141b7565b5b828204905092915050565b6000613f2982614066565b9150613f3483614066565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6d57613f6c614188565b5b828202905092915050565b6000613f838261402a565b9150613f8e8361402a565b925082821015613fa157613fa0614188565b5b828203905092915050565b6000613fb782614066565b9150613fc283614066565b925082821015613fd557613fd4614188565b5b828203905092915050565b6000613feb82614046565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561409d578082015181840152602081019050614082565b838111156140ac576000848401525b50505050565b60006140bd82614066565b915060008214156140d1576140d0614188565b5b600182039050919050565b600060028204905060018216806140f457607f821691505b60208210811415614108576141076141e6565b5b50919050565b600061411982614066565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561414c5761414b614188565b5b600182019050919050565b600061416282614066565b915061416d83614066565b92508261417d5761417c6141b7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61425e81613fe0565b811461426957600080fd5b50565b61427581613ff2565b811461428057600080fd5b50565b61428c81613ffe565b811461429757600080fd5b50565b6142a381614066565b81146142ae57600080fd5b5056fea26469706673582212202522e0bcd6a79ff72b546ff1e28277fcae2b4f184f965f03c5e7e85ae84958a164736f6c63430008000033

Deployed Bytecode Sourcemap

39617:1757:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24744:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26470:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28004:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27567:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23305:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28854:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23936:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39715:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41039:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41259:112;;;;;;;;;;;;;:::i;:::-;;29059:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23468:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40730:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26293:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39664:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39910:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25170:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38736:103;;;;;;;;;;;;;:::i;:::-;;39830:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40940:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38085:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40840:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26625:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40635:87;;;;;;;;;;;;;:::i;:::-;;40027:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28272:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40339:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29279:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39754:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26786:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39794:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33694:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28609:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38994:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39870:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24744:370;24871:4;24916:25;24901:40;;;:11;:40;;;;:99;;;;24967:33;24952:48;;;:11;:48;;;;24901:99;:160;;;;25026:35;25011:50;;;:11;:50;;;;24901:160;:207;;;;25072:36;25096:11;25072:23;:36::i;:::-;24901:207;24887:221;;24744:370;;;:::o;26470:94::-;26524:13;26553:5;26546:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26470:94;:::o;28004:204::-;28072:7;28096:16;28104:7;28096;:16::i;:::-;28088:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28178:15;:24;28194:7;28178:24;;;;;;;;;;;;;;;;;;;;;28171:31;;28004:204;;;:::o;27567:379::-;27636:13;27652:24;27668:7;27652:15;:24::i;:::-;27636:40;;27697:5;27691:11;;:2;:11;;;;27683:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27782:5;27766:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27791:37;27808:5;27815:12;:10;:12::i;:::-;27791:16;:37::i;:::-;27766:62;27750:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;27912:28;27921:2;27925:7;27934:5;27912:8;:28::i;:::-;27567:379;;;:::o;23305:94::-;23358:7;23381:12;;23374:19;;23305:94;:::o;28854:142::-;28962:28;28972:4;28978:2;28982:7;28962:9;:28::i;:::-;28854:142;;;:::o;23936:744::-;24045:7;24080:16;24090:5;24080:9;:16::i;:::-;24072:5;:24;24064:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24142:22;24167:13;:11;:13::i;:::-;24142:38;;24187:19;24217:25;24267:9;24262:350;24286:14;24282:1;:18;24262:350;;;24316:31;24350:11;:14;24362:1;24350:14;;;;;;;;;;;24316:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24403:1;24377:28;;:9;:14;;;:28;;;24373:89;;24438:9;:14;;;24418:34;;24373:89;24495:5;24474:26;;:17;:26;;;24470:135;;;24532:5;24517:11;:20;24513:59;;;24559:1;24552:8;;;;;;;;;24513:59;24582:13;;;;;:::i;:::-;;;;24470:135;24262:350;24302:3;;;;;:::i;:::-;;;;24262:350;;;;24618:56;;;;;;;;;;:::i;:::-;;;;;;;;23936:744;;;;;:::o;39715:32::-;;;;:::o;41039:96::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41118:9:::1;41105:10;:22;;;;41039:96:::0;:::o;41259:112::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41323:10:::1;41315:24;;:47;41340:21;41315:47;;;;;;;;;;;;;;;;;;;;;;;41307:56;;;::::0;::::1;;41259:112::o:0;29059:157::-;29171:39;29188:4;29194:2;29198:7;29171:39;;;;;;;;;;;;:16;:39::i;:::-;29059:157;;;:::o;23468:177::-;23535:7;23567:13;:11;:13::i;:::-;23559:5;:21;23551:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;23634:5;23627:12;;23468:177;;;:::o;40730:102::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40814:10:::1;40804:7;:20;;;;;;;;;;;;:::i;:::-;;40730:102:::0;:::o;26293:118::-;26357:7;26380:20;26392:7;26380:11;:20::i;:::-;:25;;;26373:32;;26293:118;;;:::o;39664:44::-;;;;:::o;39910:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25170:211::-;25234:7;25275:1;25258:19;;:5;:19;;;;25250:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;25347:12;:19;25360:5;25347:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25339:36;;25332:43;;25170:211;;;:::o;38736:103::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38801:30:::1;38828:1;38801:18;:30::i;:::-;38736:103::o:0;39830:31::-;;;;:::o;40940:91::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41017:6:::1;41005:9;:18;;;;40940:91:::0;:::o;38085:87::-;38131:7;38158:6;;;;;;;;;;;38151:13;;38085:87;:::o;40840:92::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40916:8:::1;40904:9;:20;;;;40840:92:::0;:::o;26625:98::-;26681:13;26710:7;26703:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26625:98;:::o;40635:87::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40703:11:::1;;;;;;;;;;;40702:12;40688:11;;:26;;;;;;;;;;;;;;;;;;40635:87::o:0;40027:304::-;40094:11;;;;;;;;;;;40086:20;;;;;;40137:1;40125:9;:13;:39;;;;;40155:9;;40142;:22;;40125:39;40117:48;;;;;;40213:10;;40200:9;40184:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;40176:48;;;;;;40268:9;40256;;:21;;;;:::i;:::-;40243:9;:34;;40235:43;;;;;;40291:32;40301:10;40313:9;40291;:32::i;:::-;40027:304;:::o;28272:274::-;28375:12;:10;:12::i;:::-;28363:24;;:8;:24;;;;28355:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28472:8;28427:18;:32;28446:12;:10;:12::i;:::-;28427:32;;;;;;;;;;;;;;;:42;28460:8;28427:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28521:8;28492:48;;28507:12;:10;:12::i;:::-;28492:48;;;28531:8;28492:48;;;;;;:::i;:::-;;;;;;;;28272:274;;:::o;40339:288::-;40402:11;;;;;;;;;;;40394:20;;;;;;40445:1;40433:9;:13;:44;;;;;40463:14;;40450:9;:27;;40433:44;40425:53;;;;;;40526:10;;40513:9;40497:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;40489:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40587:32;40597:10;40609:9;40587;:32::i;:::-;40339:288;:::o;29279:311::-;29416:28;29426:4;29432:2;29436:7;29416:9;:28::i;:::-;29467:48;29490:4;29496:2;29500:7;29509:5;29467:22;:48::i;:::-;29451:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;29279:311;;;;:::o;39754:33::-;;;;:::o;26786:403::-;26884:13;26925:16;26933:7;26925;:16::i;:::-;26909:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;27015:21;27039:10;:8;:10::i;:::-;27015:34;;27094:1;27076:7;27070:21;:25;:113;;;;;;;;;;;;;;;;;27131:7;27140:18;:7;:16;:18::i;:::-;27114:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27070:113;27056:127;;;26786:403;;;:::o;39794:29::-;;;;:::o;33694:43::-;;;;:::o;28609:186::-;28731:4;28754:18;:25;28773:5;28754:25;;;;;;;;;;;;;;;:35;28780:8;28754:35;;;;;;;;;;;;;;;;;;;;;;;;;28747:42;;28609:186;;;;:::o;38994:238::-;38316:12;:10;:12::i;:::-;38305:23;;:7;:5;:7::i;:::-;:23;;;38297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39117:1:::1;39097:22;;:8;:22;;;;39075:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39196:28;39215:8;39196:18;:28::i;:::-;38994:238:::0;:::o;39870:31::-;;;;;;;;;;;;;:::o;8316:207::-;8446:4;8490:25;8475:40;;;:11;:40;;;;8468:47;;8316:207;;;:::o;29829:105::-;29886:4;29916:12;;29906:7;:22;29899:29;;29829:105;;;:::o;17715:98::-;17768:7;17795:10;17788:17;;17715:98;:::o;33516:172::-;33640:2;33613:15;:24;33629:7;33613:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33674:7;33670:2;33654:28;;33663:5;33654:28;;;;;;;;;;;;33516:172;;;:::o;31881:1529::-;31978:35;32016:20;32028:7;32016:11;:20::i;:::-;31978:58;;32045:22;32087:13;:18;;;32071:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;32140:12;:10;:12::i;:::-;32116:36;;:20;32128:7;32116:11;:20::i;:::-;:36;;;32071:81;:142;;;;32163:50;32180:13;:18;;;32200:12;:10;:12::i;:::-;32163:16;:50::i;:::-;32071:142;32045:169;;32239:17;32223:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;32371:4;32349:26;;:13;:18;;;:26;;;32333:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;32460:1;32446:16;;:2;:16;;;;32438:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32513:43;32535:4;32541:2;32545:7;32554:1;32513:21;:43::i;:::-;32613:49;32630:1;32634:7;32643:13;:18;;;32613:8;:49::i;:::-;32701:1;32671:12;:18;32684:4;32671:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32737:1;32709:12;:16;32722:2;32709:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32768:43;;;;;;;;32783:2;32768:43;;;;;;32794:15;32768:43;;;;;32745:11;:20;32757:7;32745:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33039:19;33071:1;33061:7;:11;;;;:::i;:::-;33039:33;;33124:1;33083:43;;:11;:24;33095:11;33083:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33079:236;;;33141:20;33149:11;33141:7;:20::i;:::-;33137:171;;;33201:97;;;;;;;;33228:13;:18;;;33201:97;;;;;;33259:13;:28;;;33201:97;;;;;33174:11;:24;33186:11;33174:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33137:171;33079:236;33347:7;33343:2;33328:27;;33337:4;33328:27;;;;;;;;;;;;33362:42;33383:4;33389:2;33393:7;33402:1;33362:20;:42::i;:::-;31881:1529;;;;;;:::o;25633:606::-;25709:21;;:::i;:::-;25750:16;25758:7;25750;:16::i;:::-;25742:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25822:26;25870:12;25859:7;:23;25855:93;;25939:1;25924:12;25914:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;25893:47;;25855:93;25961:12;25976:7;25961:22;;25956:212;25993:18;25985:4;:26;25956:212;;26030:31;26064:11;:17;26076:4;26064:17;;;;;;;;;;;26030:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26120:1;26094:28;;:9;:14;;;:28;;;26090:71;;26142:9;26135:16;;;;;;;26090:71;25956:212;26013:6;;;;;:::i;:::-;;;;25956:212;;;;26176:57;;;;;;;;;;:::i;:::-;;;;;;;;25633:606;;;;:::o;39392:191::-;39466:16;39485:6;;;;;;;;;;;39466:25;;39511:8;39502:6;;:17;;;;;;;;;;;;;;;;;;39566:8;39535:40;;39556:8;39535:40;;;;;;;;;;;;39392:191;;:::o;29940:98::-;30005:27;30015:2;30019:8;30005:27;;;;;;;;;;;;:9;:27::i;:::-;29940:98;;:::o;35231:690::-;35368:4;35385:15;:2;:13;;;:15::i;:::-;35381:535;;;35440:2;35424:36;;;35461:12;:10;:12::i;:::-;35475:4;35481:7;35490:5;35424:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35411:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35672:1;35655:6;:13;:18;35651:215;;;35688:61;;;;;;;;;;:::i;:::-;;;;;;;;35651:215;35834:6;35828:13;35819:6;35815:2;35811:15;35804:38;35411:464;35556:45;;;35546:55;;;:6;:55;;;;35539:62;;;;;35381:535;35904:4;35897:11;;35231:690;;;;;;;:::o;41143:108::-;41203:13;41236:7;41229:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41143:108;:::o;18238:723::-;18294:13;18524:1;18515:5;:10;18511:53;;;18542:10;;;;;;;;;;;;;;;;;;;;;18511:53;18574:12;18589:5;18574:20;;18605:14;18630:78;18645:1;18637:4;:9;18630:78;;18663:8;;;;;:::i;:::-;;;;18694:2;18686:10;;;;;:::i;:::-;;;18630:78;;;18718:19;18750:6;18740:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18718:39;;18768:154;18784:1;18775:5;:10;18768:154;;18812:1;18802:11;;;;;:::i;:::-;;;18879:2;18871:5;:10;;;;:::i;:::-;18858:2;:24;;;;:::i;:::-;18845:39;;18828:6;18835;18828:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18908:2;18899:11;;;;;:::i;:::-;;;18768:154;;;18946:6;18932:21;;;;;18238:723;;;;:::o;36383:141::-;;;;;:::o;36910:140::-;;;;;:::o;30377:1272::-;30482:20;30505:12;;30482:35;;30546:1;30532:16;;:2;:16;;;;30524:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30723:21;30731:12;30723:7;:21::i;:::-;30722:22;30714:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;30805:12;30793:8;:24;;30785:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30865:61;30895:1;30899:2;30903:12;30917:8;30865:21;:61::i;:::-;30935:30;30968:12;:16;30981:2;30968:16;;;;;;;;;;;;;;;30935:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31010:119;;;;;;;;31060:8;31030:11;:19;;;:39;;;;:::i;:::-;31010:119;;;;;;31113:8;31078:11;:24;;;:44;;;;:::i;:::-;31010:119;;;;;30991:12;:16;31004:2;30991:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31164:43;;;;;;;;31179:2;31164:43;;;;;;31190:15;31164:43;;;;;31136:11;:25;31148:12;31136:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31216:20;31239:12;31216:35;;31265:9;31260:281;31284:8;31280:1;:12;31260:281;;;31338:12;31334:2;31313:38;;31330:1;31313:38;;;;;;;;;;;;31378:59;31409:1;31413:2;31417:12;31431:5;31378:22;:59::i;:::-;31360:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;31519:14;;;;;:::i;:::-;;;;31294:3;;;;;:::i;:::-;;;;31260:281;;;;31564:12;31549;:27;;;;31583:60;31612:1;31616:2;31620:12;31634:8;31583:20;:60::i;:::-;30377:1272;;;;;;:::o;9294:387::-;9354:4;9562:12;9629:7;9617:20;9609:28;;9672:1;9665:4;:8;9658:15;;;9294:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:366::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7768:4;7763:2;7758:3;7754:12;7747:26;7799:2;7794:3;7790:12;7783:19;;7588:220;;;:::o;7814:370::-;;7977:67;8041:2;8036:3;7977:67;:::i;:::-;7970:74;;8074:34;8070:1;8065:3;8061:11;8054:55;8140:8;8135:2;8130:3;8126:12;8119:30;8175:2;8170:3;8166:12;8159:19;;7960:224;;;:::o;8190:374::-;;8353:67;8417:2;8412:3;8353:67;:::i;:::-;8346:74;;8450:34;8446:1;8441:3;8437:11;8430:55;8516:12;8511:2;8506:3;8502:12;8495:34;8555:2;8550:3;8546:12;8539:19;;8336:228;;;:::o;8570:367::-;;8733:67;8797:2;8792:3;8733:67;:::i;:::-;8726:74;;8830:34;8826:1;8821:3;8817:11;8810:55;8896:5;8891:2;8886:3;8882:12;8875:27;8928:2;8923:3;8919:12;8912:19;;8716:221;;;:::o;8943:369::-;;9106:67;9170:2;9165:3;9106:67;:::i;:::-;9099:74;;9203:34;9199:1;9194:3;9190:11;9183:55;9269:7;9264:2;9259:3;9255:12;9248:29;9303:2;9298:3;9294:12;9287:19;;9089:223;;;:::o;9318:389::-;;9481:67;9545:2;9540:3;9481:67;:::i;:::-;9474:74;;9578:34;9574:1;9569:3;9565:11;9558:55;9644:27;9639:2;9634:3;9630:12;9623:49;9698:2;9693:3;9689:12;9682:19;;9464:243;;;:::o;9713:375::-;;9876:67;9940:2;9935:3;9876:67;:::i;:::-;9869:74;;9973:34;9969:1;9964:3;9960:11;9953:55;10039:13;10034:2;10029:3;10025:12;10018:35;10079:2;10074:3;10070:12;10063:19;;9859:229;;;:::o;10094:370::-;;10257:67;10321:2;10316:3;10257:67;:::i;:::-;10250:74;;10354:34;10350:1;10345:3;10341:11;10334:55;10420:8;10415:2;10410:3;10406:12;10399:30;10455:2;10450:3;10446:12;10439:19;;10240:224;;;:::o;10470:337::-;;10651:84;10733:1;10728:3;10651:84;:::i;:::-;10644:91;;10765:7;10761:1;10756:3;10752:11;10745:28;10799:1;10794:3;10790:11;10783:18;;10634:173;;;:::o;10813:330::-;;10976:67;11040:2;11035:3;10976:67;:::i;:::-;10969:74;;11073:34;11069:1;11064:3;11060:11;11053:55;11134:2;11129:3;11125:12;11118:19;;10959:184;;;:::o;11149:379::-;;11312:67;11376:2;11371:3;11312:67;:::i;:::-;11305:74;;11409:34;11405:1;11400:3;11396:11;11389:55;11475:17;11470:2;11465:3;11461:12;11454:39;11519:2;11514:3;11510:12;11503:19;;11295:233;;;:::o;11534:324::-;;11697:67;11761:2;11756:3;11697:67;:::i;:::-;11690:74;;11794:28;11790:1;11785:3;11781:11;11774:49;11849:2;11844:3;11840:12;11833:19;;11680:178;;;:::o;11864:382::-;;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12124:34;12120:1;12115:3;12111:11;12104:55;12190:20;12185:2;12180:3;12176:12;12169:42;12237:2;12232:3;12228:12;12221:19;;12010:236;;;:::o;12252:365::-;;12415:67;12479:2;12474:3;12415:67;:::i;:::-;12408:74;;12512:34;12508:1;12503:3;12499:11;12492:55;12578:3;12573:2;12568:3;12564:12;12557:25;12608:2;12603:3;12599:12;12592:19;;12398:219;;;:::o;12623:366::-;;12786:67;12850:2;12845:3;12786:67;:::i;:::-;12779:74;;12883:34;12879:1;12874:3;12870:11;12863:55;12949:4;12944:2;12939:3;12935:12;12928:26;12980:2;12975:3;12971:12;12964:19;;12769:220;;;:::o;12995:383::-;;13158:67;13222:2;13217:3;13158:67;:::i;:::-;13151:74;;13255:34;13251:1;13246:3;13242:11;13235:55;13321:21;13316:2;13311:3;13307:12;13300:43;13369:2;13364:3;13360:12;13353:19;;13141:237;;;:::o;13384:327::-;;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13644:31;13640:1;13635:3;13631:11;13624:52;13702:2;13697:3;13693:12;13686:19;;13530:181;;;:::o;13717:365::-;;13880:67;13944:2;13939:3;13880:67;:::i;:::-;13873:74;;13977:34;13973:1;13968:3;13964:11;13957:55;14043:3;14038:2;14033:3;14029:12;14022:25;14073:2;14068:3;14064:12;14057:19;;13863:219;;;:::o;14088:378::-;;14251:67;14315:2;14310:3;14251:67;:::i;:::-;14244:74;;14348:34;14344:1;14339:3;14335:11;14328:55;14414:16;14409:2;14404:3;14400:12;14393:38;14457:2;14452:3;14448:12;14441:19;;14234:232;;;:::o;14472:379::-;;14635:67;14699:2;14694:3;14635:67;:::i;:::-;14628:74;;14732:34;14728:1;14723:3;14719:11;14712:55;14798:17;14793:2;14788:3;14784:12;14777:39;14842:2;14837:3;14833:12;14826:19;;14618:233;;;:::o;14857:377::-;;15020:67;15084:2;15079:3;15020:67;:::i;:::-;15013:74;;15117:34;15113:1;15108:3;15104:11;15097:55;15183:15;15178:2;15173:3;15169:12;15162:37;15225:2;15220:3;15216:12;15209:19;;15003:231;;;:::o;15240:366::-;;15403:67;15467:2;15462:3;15403:67;:::i;:::-;15396:74;;15500:34;15496:1;15491:3;15487:11;15480:55;15566:4;15561:2;15556:3;15552:12;15545:26;15597:2;15592:3;15588:12;15581:19;;15386:220;;;:::o;15612:118::-;15699:24;15717:5;15699:24;:::i;:::-;15694:3;15687:37;15677:53;;:::o;15736:701::-;;16039:95;16130:3;16121:6;16039:95;:::i;:::-;16032:102;;16151:95;16242:3;16233:6;16151:95;:::i;:::-;16144:102;;16263:148;16407:3;16263:148;:::i;:::-;16256:155;;16428:3;16421:10;;16021:416;;;;;:::o;16443:222::-;;16574:2;16563:9;16559:18;16551:26;;16587:71;16655:1;16644:9;16640:17;16631:6;16587:71;:::i;:::-;16541:124;;;;:::o;16671:640::-;;16904:3;16893:9;16889:19;16881:27;;16918:71;16986:1;16975:9;16971:17;16962:6;16918:71;:::i;:::-;16999:72;17067:2;17056:9;17052:18;17043:6;16999:72;:::i;:::-;17081;17149:2;17138:9;17134:18;17125:6;17081:72;:::i;:::-;17200:9;17194:4;17190:20;17185:2;17174:9;17170:18;17163:48;17228:76;17299:4;17290:6;17228:76;:::i;:::-;17220:84;;16871:440;;;;;;;:::o;17317:210::-;;17442:2;17431:9;17427:18;17419:26;;17455:65;17517:1;17506:9;17502:17;17493:6;17455:65;:::i;:::-;17409:118;;;;:::o;17533:313::-;;17684:2;17673:9;17669:18;17661:26;;17733:9;17727:4;17723:20;17719:1;17708:9;17704:17;17697:47;17761:78;17834:4;17825:6;17761:78;:::i;:::-;17753:86;;17651:195;;;;:::o;17852:419::-;;18056:2;18045:9;18041:18;18033:26;;18105:9;18099:4;18095:20;18091:1;18080:9;18076:17;18069:47;18133:131;18259:4;18133:131;:::i;:::-;18125:139;;18023:248;;;:::o;18277:419::-;;18481:2;18470:9;18466:18;18458:26;;18530:9;18524:4;18520:20;18516:1;18505:9;18501:17;18494:47;18558:131;18684:4;18558:131;:::i;:::-;18550:139;;18448:248;;;:::o;18702:419::-;;18906:2;18895:9;18891:18;18883:26;;18955:9;18949:4;18945:20;18941:1;18930:9;18926:17;18919:47;18983:131;19109:4;18983:131;:::i;:::-;18975:139;;18873:248;;;:::o;19127:419::-;;19331:2;19320:9;19316:18;19308:26;;19380:9;19374:4;19370:20;19366:1;19355:9;19351:17;19344:47;19408:131;19534:4;19408:131;:::i;:::-;19400:139;;19298:248;;;:::o;19552:419::-;;19756:2;19745:9;19741:18;19733:26;;19805:9;19799:4;19795:20;19791:1;19780:9;19776:17;19769:47;19833:131;19959:4;19833:131;:::i;:::-;19825:139;;19723:248;;;:::o;19977:419::-;;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;;20148:248;;;:::o;20402:419::-;;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;;20573:248;;;:::o;20827:419::-;;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;;20998:248;;;:::o;21252:419::-;;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;;21423:248;;;:::o;21677:419::-;;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;;21848:248;;;:::o;22102:419::-;;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;;22273:248;;;:::o;22527:419::-;;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;;22698:248;;;:::o;22952:419::-;;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;;23123:248;;;:::o;23377:419::-;;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;;23548:248;;;:::o;23802:419::-;;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;;23973:248;;;:::o;24227:419::-;;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;;24398:248;;;:::o;24652:419::-;;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;;24823:248;;;:::o;25077:419::-;;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;;25248:248;;;:::o;25502:419::-;;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;;25673:248;;;:::o;25927:419::-;;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;;26098:248;;;:::o;26352:419::-;;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;;26523:248;;;:::o;26777:222::-;;26908:2;26897:9;26893:18;26885:26;;26921:71;26989:1;26978:9;26974:17;26965:6;26921:71;:::i;:::-;26875:124;;;;:::o;27005:283::-;;27071:2;27065:9;27055:19;;27113:4;27105:6;27101:17;27220:6;27208:10;27205:22;27184:18;27172:10;27169:34;27166:62;27163:2;;;27231:18;;:::i;:::-;27163:2;27271:10;27267:2;27260:22;27045:243;;;;:::o;27294:331::-;;27445:18;27437:6;27434:30;27431:2;;;27467:18;;:::i;:::-;27431:2;27552:4;27548:9;27541:4;27533:6;27529:17;27525:33;27517:41;;27613:4;27607;27603:15;27595:23;;27360:265;;;:::o;27631:332::-;;27783:18;27775:6;27772:30;27769:2;;;27805:18;;:::i;:::-;27769:2;27890:4;27886:9;27879:4;27871:6;27867:17;27863:33;27855:41;;27951:4;27945;27941:15;27933:23;;27698:265;;;:::o;27969:98::-;;28054:5;28048:12;28038:22;;28027:40;;;:::o;28073:99::-;;28159:5;28153:12;28143:22;;28132:40;;;:::o;28178:168::-;;28295:6;28290:3;28283:19;28335:4;28330:3;28326:14;28311:29;;28273:73;;;;:::o;28352:169::-;;28470:6;28465:3;28458:19;28510:4;28505:3;28501:14;28486:29;;28448:73;;;;:::o;28527:148::-;;28666:3;28651:18;;28641:34;;;;:::o;28681:273::-;;28740:20;28758:1;28740:20;:::i;:::-;28735:25;;28774:20;28792:1;28774:20;:::i;:::-;28769:25;;28896:1;28860:34;28856:42;28853:1;28850:49;28847:2;;;28902:18;;:::i;:::-;28847:2;28946:1;28943;28939:9;28932:16;;28725:229;;;;:::o;28960:305::-;;29019:20;29037:1;29019:20;:::i;:::-;29014:25;;29053:20;29071:1;29053:20;:::i;:::-;29048:25;;29207:1;29139:66;29135:74;29132:1;29129:81;29126:2;;;29213:18;;:::i;:::-;29126:2;29257:1;29254;29250:9;29243:16;;29004:261;;;;:::o;29271:185::-;;29328:20;29346:1;29328:20;:::i;:::-;29323:25;;29362:20;29380:1;29362:20;:::i;:::-;29357:25;;29401:1;29391:2;;29406:18;;:::i;:::-;29391:2;29448:1;29445;29441:9;29436:14;;29313:143;;;;:::o;29462:348::-;;29525:20;29543:1;29525:20;:::i;:::-;29520:25;;29559:20;29577:1;29559:20;:::i;:::-;29554:25;;29747:1;29679:66;29675:74;29672:1;29669:81;29664:1;29657:9;29650:17;29646:105;29643:2;;;29754:18;;:::i;:::-;29643:2;29802:1;29799;29795:9;29784:20;;29510:300;;;;:::o;29816:191::-;;29876:20;29894:1;29876:20;:::i;:::-;29871:25;;29910:20;29928:1;29910:20;:::i;:::-;29905:25;;29949:1;29946;29943:8;29940:2;;;29954:18;;:::i;:::-;29940:2;29999:1;29996;29992:9;29984:17;;29861:146;;;;:::o;30013:191::-;;30073:20;30091:1;30073:20;:::i;:::-;30068:25;;30107:20;30125:1;30107:20;:::i;:::-;30102:25;;30146:1;30143;30140:8;30137:2;;;30151:18;;:::i;:::-;30137:2;30196:1;30193;30189:9;30181:17;;30058:146;;;;:::o;30210:96::-;;30276:24;30294:5;30276:24;:::i;:::-;30265:35;;30255:51;;;:::o;30312:90::-;;30389:5;30382:13;30375:21;30364:32;;30354:48;;;:::o;30408:149::-;;30484:66;30477:5;30473:78;30462:89;;30452:105;;;:::o;30563:118::-;;30640:34;30633:5;30629:46;30618:57;;30608:73;;;:::o;30687:126::-;;30764:42;30757:5;30753:54;30742:65;;30732:81;;;:::o;30819:77::-;;30885:5;30874:16;;30864:32;;;:::o;30902:154::-;30986:6;30981:3;30976;30963:30;31048:1;31039:6;31034:3;31030:16;31023:27;30953:103;;;:::o;31062:307::-;31130:1;31140:113;31154:6;31151:1;31148:13;31140:113;;;31239:1;31234:3;31230:11;31224:18;31220:1;31215:3;31211:11;31204:39;31176:2;31173:1;31169:10;31164:15;;31140:113;;;31271:6;31268:1;31265:13;31262:2;;;31351:1;31342:6;31337:3;31333:16;31326:27;31262:2;31111:258;;;;:::o;31375:171::-;;31437:24;31455:5;31437:24;:::i;:::-;31428:33;;31483:4;31476:5;31473:15;31470:2;;;31491:18;;:::i;:::-;31470:2;31538:1;31531:5;31527:13;31520:20;;31418:128;;;:::o;31552:320::-;;31633:1;31627:4;31623:12;31613:22;;31680:1;31674:4;31670:12;31701:18;31691:2;;31757:4;31749:6;31745:17;31735:27;;31691:2;31819;31811:6;31808:14;31788:18;31785:38;31782:2;;;31838:18;;:::i;:::-;31782:2;31603:269;;;;:::o;31878:233::-;;31940:24;31958:5;31940:24;:::i;:::-;31931:33;;31986:66;31979:5;31976:77;31973:2;;;32056:18;;:::i;:::-;31973:2;32103:1;32096:5;32092:13;32085:20;;31921:190;;;:::o;32117:176::-;;32166:20;32184:1;32166:20;:::i;:::-;32161:25;;32200:20;32218:1;32200:20;:::i;:::-;32195:25;;32239:1;32229:2;;32244:18;;:::i;:::-;32229:2;32285:1;32282;32278:9;32273:14;;32151:142;;;;:::o;32299:180::-;32347:77;32344:1;32337:88;32444:4;32441:1;32434:15;32468:4;32465:1;32458:15;32485:180;32533:77;32530:1;32523:88;32630:4;32627:1;32620:15;32654:4;32651:1;32644:15;32671:180;32719:77;32716:1;32709:88;32816:4;32813:1;32806:15;32840:4;32837:1;32830:15;32857:180;32905:77;32902:1;32895:88;33002:4;32999:1;32992:15;33026:4;33023:1;33016:15;33043:102;;33135:2;33131:7;33126:2;33119:5;33115:14;33111:28;33101:38;;33091:54;;;:::o;33151:122::-;33224:24;33242:5;33224:24;:::i;:::-;33217:5;33214:35;33204:2;;33263:1;33260;33253:12;33204:2;33194:79;:::o;33279:116::-;33349:21;33364:5;33349:21;:::i;:::-;33342:5;33339:32;33329:2;;33385:1;33382;33375:12;33329:2;33319:76;:::o;33401:120::-;33473:23;33490:5;33473:23;:::i;:::-;33466:5;33463:34;33453:2;;33511:1;33508;33501:12;33453:2;33443:78;:::o;33527:122::-;33600:24;33618:5;33600:24;:::i;:::-;33593:5;33590:35;33580:2;;33639:1;33636;33629:12;33580:2;33570:79;:::o

Swarm Source

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