ETH Price: $2,633.79 (+0.88%)

Token

The Dingalings (DNGLNGS)
 

Overview

Max Total Supply

1,753 DNGLNGS

Holders

606

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 DNGLNGS
0x5457186296af19e23a1644493255f52680925c66
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:
TheDingalings

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-11
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-07
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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



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


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

pragma solidity ^0.8.0;

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


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


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

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


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


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


// File contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // 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) internal _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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function totalSupply() public view returns (uint256) {
        return currentIndex;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

    unchecked {
        for (uint256 curr = tokenId; curr >= 0; 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())) : '';
    }

    /**
     * @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 Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
    unchecked {
        _addressData[to].balance += uint128(quantity);
        _addressData[to].numberMinted += uint128(quantity);

        _ownerships[startTokenId].addr = to;
        _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

        uint256 updatedIndex = startTokenId;

        for (uint256 i; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            if (safe) {
                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);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
    unchecked {
        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;

        _ownerships[tokenId].addr = to;
        _ownerships[tokenId].startTimestamp = 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].addr = prevOwnership.addr;
                _ownerships[nextTokenId].startTimestamp = 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);
    }

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

pragma solidity ^0.8.0;

contract TheDingalings is Ownable, ERC721A, ReentrancyGuard {
    string public baseURI = "";
	uint256 public constant PRICE = 0.0033 ether;
	uint256 public constant MAX_SUPPLY = 10000;
	uint256 public maxPerTx = 20;
	uint256 public maxPerWallet = 60;
	uint256 public maxFreePerWallet = 2;
	uint256 public totalFree = 1000;
	uint256 public freeMinted = 0;
	bool public mintEnabled = false;

	mapping(address => uint256) private freeMintedByAddress;

    constructor() ERC721A("The Dingalings", "DNGLNGS") {}

	/******************************************************************
	 * Modifier to validate whether someone can mint a certain amount.
	 ******************************************************************/

	modifier validate(uint256 amt) {
		require(mintEnabled, "Minting hasn't been enabled yet.");
		require(msg.sender == tx.origin, "Sneaky sneak, ser,");
		require(totalSupply() + amt < MAX_SUPPLY + 1, "We've minted all Dingalings.");
		require(amt > 0, "Amount must be greater than 0.");
		
		_;
	}

	/************************
	 * Our minting functions
	 ************************/

	function mint(uint256 amt) external payable validate(amt) nonReentrant {
		require(msg.value == amt * PRICE, "Please send the exact amount of eth.");
		require(numberMinted(msg.sender) + amt < maxPerWallet + 1, "Your wallet owns the max. amount of Dingalings.");
		require(amt < maxPerTx + 1, "You tried to mint too many Dingalings in one transaction.");

		_safeMint(msg.sender, amt);
	}

	function mintFree(uint256 amt) external validate(amt) nonReentrant {
		require(freeMinted + amt < totalFree + 1, "We've given out all of our free Dingalings.");
		require(freeMintedByAddress[msg.sender] + amt < maxFreePerWallet + 1, "You've already minted the max. amount of free Dingalings.");

		freeMinted += amt;
		freeMintedByAddress[msg.sender] += amt;

		_safeMint(msg.sender, amt);
	}

	function mintForAddresses(address[] calldata _addresses, uint256 _quantity) public onlyOwner {
		uint256 addressLength = _addresses.length;
		uint256 amt = addressLength * _quantity;

		require(totalSupply() + amt < MAX_SUPPLY + 1, "We've minted all Dingalings.");

		for (uint i = 0; i < addressLength; i++) {
			_safeMint(_addresses[i], _quantity);
		}
	}

	/**********************************************************************
	 * Overwrite some functions to return the proper baseURI and tokenURI.
	 **********************************************************************/
	
	function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory uri = super.tokenURI(tokenId);

        return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : "";
    }

	/**********************************************
	 * Extract some information from our Contract.
	 **********************************************/

	function getContractBalance() external view onlyOwner returns (uint256) {
		return address(this).balance;
	}

	function numberMinted(address owner) public view returns (uint256) {
		return _numberMinted(owner);
	}

    /********************************************************
	 * Change some of our Contract's variables if necessary.
	 ********************************************************/

	function toggleMinting() external onlyOwner {
		mintEnabled = !mintEnabled;
	}

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

	function setTotalFree(uint256 _totalFree) external onlyOwner {
		totalFree = _totalFree;
	}

	function setMaxPerTx(uint256 _maxPerTx) external onlyOwner {
		maxPerTx = _maxPerTx;
	}

	function setMaxPerWallet(uint256 _maxPerWallet) external onlyOwner {
		maxPerWallet = _maxPerWallet;
	}

	function setMaxFreePerWallet(uint256 _maxFreePerWallet) external onlyOwner {
		maxFreePerWallet = _maxFreePerWallet;
	}

	/************************************
	 * Withdraw funds from the Contract.
	 ************************************/

	function withdraw() external onlyOwner nonReentrant {
		(bool success, ) = msg.sender.call{value: address(this).balance}("");
		require(success, "Transfer failed.");
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintForAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreePerWallet","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFree","type":"uint256"}],"name":"setTotalFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b92919062000209565b506014600a55603c600b556002600c556103e8600d556000600e556000600f60006101000a81548160ff0219169083151502179055503480156200006e57600080fd5b506040518060400160405280600e81526020017f5468652044696e67616c696e67730000000000000000000000000000000000008152506040518060400160405280600781526020017f444e474c4e475300000000000000000000000000000000000000000000000000815250620000fb620000ef6200013d60201b60201c565b6200014560201b60201c565b81600290805190602001906200011392919062000209565b5080600390805190602001906200012c92919062000209565b50505060016008819055506200031e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021790620002b9565b90600052602060002090601f0160209004810192826200023b576000855562000287565b82601f106200025657805160ff191683800117855562000287565b8280016001018555821562000287579182015b828111156200028657825182559160200191906001019062000269565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b60006002820490506001821680620002d257607f821691505b60208210811415620002e957620002e8620002ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614cb1806200032e6000396000f3fe6080604052600436106102255760003560e01c80637d55094d11610123578063b88d4fde116100ab578063dc33e6811161006f578063dc33e681146107ae578063e268e4d3146107eb578063e985e9c514610814578063f2fde38b14610851578063f968adbe1461087a57610225565b8063b88d4fde146106c9578063c6f6f216146106f2578063c87b56dd1461071b578063d10a1a2b14610758578063d12397301461078357610225565b806395d89b41116100f257806395d89b4114610605578063a0712d6814610630578063a22cb4651461064c578063a414673314610675578063a70273571461069e57610225565b80637d55094d1461056f5780638670d1ed146105865780638d859f3e146105af5780638da5cb5b146105da57610225565b806342842e0e116101b15780636c0360eb116101755780636c0360eb1461049c5780636d7c4a4b146104c75780636f9fb98a146104f057806370a082311461051b578063715018a61461055857610225565b806342842e0e146103b9578063453c2310146103e257806355f804b31461040d578063563aaf11146104365780636352211e1461045f57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd1461032357806332cb6b0c1461034c578063333e44e6146103775780633ccfd60b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906135c1565b6108a5565b60405161025e9190613c41565b60405180910390f35b34801561027357600080fd5b5061027c610987565b6040516102899190613c5c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613668565b610a19565b6040516102c69190613bda565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613521565b610a9e565b005b34801561030457600080fd5b5061030d610bb7565b60405161031a9190613ffe565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061340b565b610bc1565b005b34801561035857600080fd5b50610361610bd1565b60405161036e9190613ffe565b60405180910390f35b34801561038357600080fd5b5061038c610bd7565b6040516103999190613ffe565b60405180910390f35b3480156103ae57600080fd5b506103b7610bdd565b005b3480156103c557600080fd5b506103e060048036038101906103db919061340b565b610d5e565b005b3480156103ee57600080fd5b506103f7610d7e565b6040516104049190613ffe565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f919061361b565b610d84565b005b34801561044257600080fd5b5061045d60048036038101906104589190613668565b610e16565b005b34801561046b57600080fd5b5061048660048036038101906104819190613668565b610e9c565b6040516104939190613bda565b60405180910390f35b3480156104a857600080fd5b506104b1610eb2565b6040516104be9190613c5c565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190613668565b610f40565b005b3480156104fc57600080fd5b50610505610fc6565b6040516105129190613ffe565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d919061339e565b61104a565b60405161054f9190613ffe565b60405180910390f35b34801561056457600080fd5b5061056d611133565b005b34801561057b57600080fd5b506105846111bb565b005b34801561059257600080fd5b506105ad60048036038101906105a89190613561565b611263565b005b3480156105bb57600080fd5b506105c46113b0565b6040516105d19190613ffe565b60405180910390f35b3480156105e657600080fd5b506105ef6113bb565b6040516105fc9190613bda565b60405180910390f35b34801561061157600080fd5b5061061a6113e4565b6040516106279190613c5c565b60405180910390f35b61064a60048036038101906106459190613668565b611476565b005b34801561065857600080fd5b50610673600480360381019061066e91906134e1565b611744565b005b34801561068157600080fd5b5061069c60048036038101906106979190613668565b6118c5565b005b3480156106aa57600080fd5b506106b3611bf2565b6040516106c09190613ffe565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb919061345e565b611bf8565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613668565b611c54565b005b34801561072757600080fd5b50610742600480360381019061073d9190613668565b611cda565b60405161074f9190613c5c565b60405180910390f35b34801561076457600080fd5b5061076d611d30565b60405161077a9190613ffe565b60405180910390f35b34801561078f57600080fd5b50610798611d36565b6040516107a59190613c41565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061339e565b611d49565b6040516107e29190613ffe565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613668565b611d5b565b005b34801561082057600080fd5b5061083b600480360381019061083691906133cb565b611de1565b6040516108489190613c41565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061339e565b611e75565b005b34801561088657600080fd5b5061088f611f6d565b60405161089c9190613ffe565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610980575061097f82611f73565b5b9050919050565b60606002805461099690614288565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290614288565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050905090565b6000610a2482611fdd565b610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90613f9e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa982610e9c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1190613e9e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b39611feb565b73ffffffffffffffffffffffffffffffffffffffff161480610b685750610b6781610b62611feb565b611de1565b5b610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90613dbe565b60405180910390fd5b610bb2838383611ff3565b505050565b6000600154905090565b610bcc8383836120a5565b505050565b61271081565b600d5481565b610be5611feb565b73ffffffffffffffffffffffffffffffffffffffff16610c036113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090613e1e565b60405180910390fd5b60026008541415610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613f5e565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ccd90613bc5565b60006040518083038185875af1925050503d8060008114610d0a576040519150601f19603f3d011682016040523d82523d6000602084013e610d0f565b606091505b5050905080610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613ebe565b60405180910390fd5b506001600881905550565b610d7983838360405180602001604052806000815250611bf8565b505050565b600b5481565b610d8c611feb565b73ffffffffffffffffffffffffffffffffffffffff16610daa6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790613e1e565b60405180910390fd5b818160099190610e1192919061313c565b505050565b610e1e611feb565b73ffffffffffffffffffffffffffffffffffffffff16610e3c6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613e1e565b60405180910390fd5b80600d8190555050565b6000610ea7826125e5565b600001519050919050565b60098054610ebf90614288565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90614288565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b610f48611feb565b73ffffffffffffffffffffffffffffffffffffffff16610f666113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613e1e565b60405180910390fd5b80600c8190555050565b6000610fd0611feb565b73ffffffffffffffffffffffffffffffffffffffff16610fee6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90613e1e565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613dde565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61113b611feb565b73ffffffffffffffffffffffffffffffffffffffff166111596113bb565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690613e1e565b60405180910390fd5b6111b9600061277f565b565b6111c3611feb565b73ffffffffffffffffffffffffffffffffffffffff166111e16113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e90613e1e565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61126b611feb565b73ffffffffffffffffffffffffffffffffffffffff166112896113bb565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690613e1e565b60405180910390fd5b6000838390509050600082826112f59190614144565b9050600161271061130691906140bd565b8161130f610bb7565b61131991906140bd565b10611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090613f3e565b60405180910390fd5b60005b828110156113a85761139586868381811061137a576113796143f2565b5b905060200201602081019061138f919061339e565b85612843565b80806113a0906142eb565b91505061135c565b505050505050565b660bb9551fc2400081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113f390614288565b80601f016020809104026020016040519081016040528092919081815260200182805461141f90614288565b801561146c5780601f106114415761010080835404028352916020019161146c565b820191906000526020600020905b81548152906001019060200180831161144f57829003601f168201915b5050505050905090565b80600f60009054906101000a900460ff166114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90613fde565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90613d9e565b60405180910390fd5b600161271061154391906140bd565b8161154c610bb7565b61155691906140bd565b10611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613f3e565b60405180910390fd5b600081116115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613c7e565b60405180910390fd5b6002600854141561161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613f5e565b60405180910390fd5b6002600881905550660bb9551fc240008261163a9190614144565b341461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613d1e565b60405180910390fd5b6001600b5461168a91906140bd565b8261169433611d49565b61169e91906140bd565b106116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590613fbe565b60405180910390fd5b6001600a546116ed91906140bd565b821061172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613c9e565b60405180910390fd5b6117383383612843565b60016008819055505050565b61174c611feb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b190613e5e565b60405180910390fd5b80600760006117c7611feb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611874611feb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b99190613c41565b60405180910390a35050565b80600f60009054906101000a900460ff16611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90613fde565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613d9e565b60405180910390fd5b600161271061199291906140bd565b8161199b610bb7565b6119a591906140bd565b106119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613f3e565b60405180910390fd5b60008111611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90613c7e565b60405180910390fd5b60026008541415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613f5e565b60405180910390fd5b60026008819055506001600d54611a8591906140bd565b82600e54611a9391906140bd565b10611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613d7e565b60405180910390fd5b6001600c54611ae291906140bd565b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2d91906140bd565b10611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490613cfe565b60405180910390fd5b81600e6000828254611b7f91906140bd565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd591906140bd565b92505081905550611be63383612843565b60016008819055505050565b600c5481565b611c038484846120a5565b611c0f84848484612861565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613ede565b60405180910390fd5b50505050565b611c5c611feb565b73ffffffffffffffffffffffffffffffffffffffff16611c7a6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613e1e565b60405180910390fd5b80600a8190555050565b60606000611ce7836129f8565b90506000815111611d075760405180602001604052806000815250611d28565b80604051602001611d189190613ba3565b6040516020818303038152906040525b915050919050565b600e5481565b600f60009054906101000a900460ff1681565b6000611d5482612aa0565b9050919050565b611d63611feb565b73ffffffffffffffffffffffffffffffffffffffff16611d816113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613e1e565b60405180910390fd5b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e7d611feb565b73ffffffffffffffffffffffffffffffffffffffff16611e9b6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890613e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890613cbe565b60405180910390fd5b611f6a8161277f565b50565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120b0826125e5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120d7611feb565b73ffffffffffffffffffffffffffffffffffffffff16148061213357506120fc611feb565b73ffffffffffffffffffffffffffffffffffffffff1661211b84610a19565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214f575061214e8260000151612149611feb565b611de1565b5b905080612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890613e7e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613dfe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613d3e565b60405180910390fd5b6122808585856001612b89565b6122906000848460000151611ff3565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612575576124d481611fdd565b156125745782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125de8585856001612b8f565b5050505050565b6125ed6131c2565b6125f682611fdd565b612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262c90613cde565b60405180910390fd5b60008290505b6000811061273e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461272f57809250505061277a565b5080806001900391505061263b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277190613f7e565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61285d828260405180602001604052806000815250612b95565b5050565b60006128828473ffffffffffffffffffffffffffffffffffffffff16612ba7565b156129eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ab611feb565b8786866040518563ffffffff1660e01b81526004016128cd9493929190613bf5565b602060405180830381600087803b1580156128e757600080fd5b505af192505050801561291857506040513d601f19601f8201168201806040525081019061291591906135ee565b60015b61299b573d8060008114612948576040519150601f19603f3d011682016040523d82523d6000602084013e61294d565b606091505b50600081511415612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90613ede565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f0565b600190505b949350505050565b6060612a0382611fdd565b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990613e3e565b60405180910390fd5b6000612a4c612bca565b9050600081511415612a6d5760405180602001604052806000815250612a98565b80612a7784612c5c565b604051602001612a88929190613b7f565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890613d5e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b612ba28383836001612dbd565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060098054612bd990614288565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0590614288565b8015612c525780601f10612c2757610100808354040283529160200191612c52565b820191906000526020600020905b815481529060010190602001808311612c3557829003601f168201915b5050505050905090565b60606000821415612ca4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612db8565b600082905060005b60008214612cd6578080612cbf906142eb565b915050600a82612ccf9190614113565b9150612cac565b60008167ffffffffffffffff811115612cf257612cf1614421565b5b6040519080825280601f01601f191660200182016040528015612d245781602001600182028036833780820191505090505b5090505b60008514612db157600182612d3d919061419e565b9150600a85612d4c9190614334565b6030612d5891906140bd565b60f81b818381518110612d6e57612d6d6143f2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612daa9190614113565b9450612d28565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2b90613efe565b60405180910390fd5b6000841415612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90613f1e565b60405180910390fd5b612e856000868387612b89565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561311f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561310a576130ca6000888488612861565b613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090613ede565b60405180910390fd5b5b81806001019250508080600101915050613053565b5080600181905550506131356000868387612b8f565b5050505050565b82805461314890614288565b90600052602060002090601f01602090048101928261316a57600085556131b1565b82601f1061318357803560ff19168380011785556131b1565b828001600101855582156131b1579182015b828111156131b0578235825591602001919060010190613195565b5b5090506131be91906131fc565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156132155760008160009055506001016131fd565b5090565b600061322c6132278461403e565b614019565b9050828152602081018484840111156132485761324761445f565b5b613253848285614246565b509392505050565b60008135905061326a81614c1f565b92915050565b60008083601f84011261328657613285614455565b5b8235905067ffffffffffffffff8111156132a3576132a2614450565b5b6020830191508360208202830111156132bf576132be61445a565b5b9250929050565b6000813590506132d581614c36565b92915050565b6000813590506132ea81614c4d565b92915050565b6000815190506132ff81614c4d565b92915050565b600082601f83011261331a57613319614455565b5b813561332a848260208601613219565b91505092915050565b60008083601f84011261334957613348614455565b5b8235905067ffffffffffffffff81111561336657613365614450565b5b6020830191508360018202830111156133825761338161445a565b5b9250929050565b60008135905061339881614c64565b92915050565b6000602082840312156133b4576133b3614469565b5b60006133c28482850161325b565b91505092915050565b600080604083850312156133e2576133e1614469565b5b60006133f08582860161325b565b92505060206134018582860161325b565b9150509250929050565b60008060006060848603121561342457613423614469565b5b60006134328682870161325b565b93505060206134438682870161325b565b925050604061345486828701613389565b9150509250925092565b6000806000806080858703121561347857613477614469565b5b60006134868782880161325b565b94505060206134978782880161325b565b93505060406134a887828801613389565b925050606085013567ffffffffffffffff8111156134c9576134c8614464565b5b6134d587828801613305565b91505092959194509250565b600080604083850312156134f8576134f7614469565b5b60006135068582860161325b565b9250506020613517858286016132c6565b9150509250929050565b6000806040838503121561353857613537614469565b5b60006135468582860161325b565b925050602061355785828601613389565b9150509250929050565b60008060006040848603121561357a57613579614469565b5b600084013567ffffffffffffffff81111561359857613597614464565b5b6135a486828701613270565b935093505060206135b786828701613389565b9150509250925092565b6000602082840312156135d7576135d6614469565b5b60006135e5848285016132db565b91505092915050565b60006020828403121561360457613603614469565b5b6000613612848285016132f0565b91505092915050565b6000806020838503121561363257613631614469565b5b600083013567ffffffffffffffff8111156136505761364f614464565b5b61365c85828601613333565b92509250509250929050565b60006020828403121561367e5761367d614469565b5b600061368c84828501613389565b91505092915050565b61369e816141d2565b82525050565b6136ad816141e4565b82525050565b60006136be8261406f565b6136c88185614085565b93506136d8818560208601614255565b6136e18161446e565b840191505092915050565b60006136f78261407a565b61370181856140a1565b9350613711818560208601614255565b61371a8161446e565b840191505092915050565b60006137308261407a565b61373a81856140b2565b935061374a818560208601614255565b80840191505092915050565b6000613763601e836140a1565b915061376e8261447f565b602082019050919050565b60006137866039836140a1565b9150613791826144a8565b604082019050919050565b60006137a96026836140a1565b91506137b4826144f7565b604082019050919050565b60006137cc602a836140a1565b91506137d782614546565b604082019050919050565b60006137ef6039836140a1565b91506137fa82614595565b604082019050919050565b60006138126024836140a1565b915061381d826145e4565b604082019050919050565b60006138356025836140a1565b915061384082614633565b604082019050919050565b60006138586031836140a1565b915061386382614682565b604082019050919050565b600061387b602b836140a1565b9150613886826146d1565b604082019050919050565b600061389e6012836140a1565b91506138a982614720565b602082019050919050565b60006138c16039836140a1565b91506138cc82614749565b604082019050919050565b60006138e4602b836140a1565b91506138ef82614798565b604082019050919050565b60006139076026836140a1565b9150613912826147e7565b604082019050919050565b600061392a6005836140b2565b915061393582614836565b600582019050919050565b600061394d6020836140a1565b91506139588261485f565b602082019050919050565b6000613970602f836140a1565b915061397b82614888565b604082019050919050565b6000613993601a836140a1565b915061399e826148d7565b602082019050919050565b60006139b66032836140a1565b91506139c182614900565b604082019050919050565b60006139d96022836140a1565b91506139e48261494f565b604082019050919050565b60006139fc600083614096565b9150613a078261499e565b600082019050919050565b6000613a1f6010836140a1565b9150613a2a826149a1565b602082019050919050565b6000613a426033836140a1565b9150613a4d826149ca565b604082019050919050565b6000613a656021836140a1565b9150613a7082614a19565b604082019050919050565b6000613a886028836140a1565b9150613a9382614a68565b604082019050919050565b6000613aab601c836140a1565b9150613ab682614ab7565b602082019050919050565b6000613ace601f836140a1565b9150613ad982614ae0565b602082019050919050565b6000613af1602f836140a1565b9150613afc82614b09565b604082019050919050565b6000613b14602d836140a1565b9150613b1f82614b58565b604082019050919050565b6000613b37602f836140a1565b9150613b4282614ba7565b604082019050919050565b6000613b5a6020836140a1565b9150613b6582614bf6565b602082019050919050565b613b798161423c565b82525050565b6000613b8b8285613725565b9150613b978284613725565b91508190509392505050565b6000613baf8284613725565b9150613bba8261391d565b915081905092915050565b6000613bd0826139ef565b9150819050919050565b6000602082019050613bef6000830184613695565b92915050565b6000608082019050613c0a6000830187613695565b613c176020830186613695565b613c246040830185613b70565b8181036060830152613c3681846136b3565b905095945050505050565b6000602082019050613c5660008301846136a4565b92915050565b60006020820190508181036000830152613c7681846136ec565b905092915050565b60006020820190508181036000830152613c9781613756565b9050919050565b60006020820190508181036000830152613cb781613779565b9050919050565b60006020820190508181036000830152613cd78161379c565b9050919050565b60006020820190508181036000830152613cf7816137bf565b9050919050565b60006020820190508181036000830152613d17816137e2565b9050919050565b60006020820190508181036000830152613d3781613805565b9050919050565b60006020820190508181036000830152613d5781613828565b9050919050565b60006020820190508181036000830152613d778161384b565b9050919050565b60006020820190508181036000830152613d978161386e565b9050919050565b60006020820190508181036000830152613db781613891565b9050919050565b60006020820190508181036000830152613dd7816138b4565b9050919050565b60006020820190508181036000830152613df7816138d7565b9050919050565b60006020820190508181036000830152613e17816138fa565b9050919050565b60006020820190508181036000830152613e3781613940565b9050919050565b60006020820190508181036000830152613e5781613963565b9050919050565b60006020820190508181036000830152613e7781613986565b9050919050565b60006020820190508181036000830152613e97816139a9565b9050919050565b60006020820190508181036000830152613eb7816139cc565b9050919050565b60006020820190508181036000830152613ed781613a12565b9050919050565b60006020820190508181036000830152613ef781613a35565b9050919050565b60006020820190508181036000830152613f1781613a58565b9050919050565b60006020820190508181036000830152613f3781613a7b565b9050919050565b60006020820190508181036000830152613f5781613a9e565b9050919050565b60006020820190508181036000830152613f7781613ac1565b9050919050565b60006020820190508181036000830152613f9781613ae4565b9050919050565b60006020820190508181036000830152613fb781613b07565b9050919050565b60006020820190508181036000830152613fd781613b2a565b9050919050565b60006020820190508181036000830152613ff781613b4d565b9050919050565b60006020820190506140136000830184613b70565b92915050565b6000614023614034565b905061402f82826142ba565b919050565b6000604051905090565b600067ffffffffffffffff82111561405957614058614421565b5b6140628261446e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c88261423c565b91506140d38361423c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561410857614107614365565b5b828201905092915050565b600061411e8261423c565b91506141298361423c565b92508261413957614138614394565b5b828204905092915050565b600061414f8261423c565b915061415a8361423c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561419357614192614365565b5b828202905092915050565b60006141a98261423c565b91506141b48361423c565b9250828210156141c7576141c6614365565b5b828203905092915050565b60006141dd8261421c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614273578082015181840152602081019050614258565b83811115614282576000848401525b50505050565b600060028204905060018216806142a057607f821691505b602082108114156142b4576142b36143c3565b5b50919050565b6142c38261446e565b810181811067ffffffffffffffff821117156142e2576142e1614421565b5b80604052505050565b60006142f68261423c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561432957614328614365565b5b600182019050919050565b600061433f8261423c565b915061434a8361423c565b92508261435a57614359614394565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f596f7520747269656420746f206d696e7420746f6f206d616e792044696e676160008201527f6c696e677320696e206f6e65207472616e73616374696f6e2e00000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f596f7527766520616c7265616479206d696e74656420746865206d61782e206160008201527f6d6f756e74206f6620667265652044696e67616c696e67732e00000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e74206f662060008201527f6574682e00000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f576527766520676976656e206f757420616c6c206f66206f757220667265652060008201527f44696e67616c696e67732e000000000000000000000000000000000000000000602082015250565b7f536e65616b7920736e65616b2c207365722c0000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5765277665206d696e74656420616c6c2044696e67616c696e67732e00000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f596f75722077616c6c6574206f776e7320746865206d61782e20616d6f756e7460008201527f206f662044696e67616c696e67732e0000000000000000000000000000000000602082015250565b7f4d696e74696e67206861736e2774206265656e20656e61626c6564207965742e600082015250565b614c28816141d2565b8114614c3357600080fd5b50565b614c3f816141e4565b8114614c4a57600080fd5b50565b614c56816141f0565b8114614c6157600080fd5b50565b614c6d8161423c565b8114614c7857600080fd5b5056fea26469706673582212208cc9f5de279664972487deff8e0809fbc56263b58967e86397a456527a5df69b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102255760003560e01c80637d55094d11610123578063b88d4fde116100ab578063dc33e6811161006f578063dc33e681146107ae578063e268e4d3146107eb578063e985e9c514610814578063f2fde38b14610851578063f968adbe1461087a57610225565b8063b88d4fde146106c9578063c6f6f216146106f2578063c87b56dd1461071b578063d10a1a2b14610758578063d12397301461078357610225565b806395d89b41116100f257806395d89b4114610605578063a0712d6814610630578063a22cb4651461064c578063a414673314610675578063a70273571461069e57610225565b80637d55094d1461056f5780638670d1ed146105865780638d859f3e146105af5780638da5cb5b146105da57610225565b806342842e0e116101b15780636c0360eb116101755780636c0360eb1461049c5780636d7c4a4b146104c75780636f9fb98a146104f057806370a082311461051b578063715018a61461055857610225565b806342842e0e146103b9578063453c2310146103e257806355f804b31461040d578063563aaf11146104365780636352211e1461045f57610225565b806318160ddd116101f857806318160ddd146102f857806323b872dd1461032357806332cb6b0c1461034c578063333e44e6146103775780633ccfd60b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906135c1565b6108a5565b60405161025e9190613c41565b60405180910390f35b34801561027357600080fd5b5061027c610987565b6040516102899190613c5c565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190613668565b610a19565b6040516102c69190613bda565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190613521565b610a9e565b005b34801561030457600080fd5b5061030d610bb7565b60405161031a9190613ffe565b60405180910390f35b34801561032f57600080fd5b5061034a6004803603810190610345919061340b565b610bc1565b005b34801561035857600080fd5b50610361610bd1565b60405161036e9190613ffe565b60405180910390f35b34801561038357600080fd5b5061038c610bd7565b6040516103999190613ffe565b60405180910390f35b3480156103ae57600080fd5b506103b7610bdd565b005b3480156103c557600080fd5b506103e060048036038101906103db919061340b565b610d5e565b005b3480156103ee57600080fd5b506103f7610d7e565b6040516104049190613ffe565b60405180910390f35b34801561041957600080fd5b50610434600480360381019061042f919061361b565b610d84565b005b34801561044257600080fd5b5061045d60048036038101906104589190613668565b610e16565b005b34801561046b57600080fd5b5061048660048036038101906104819190613668565b610e9c565b6040516104939190613bda565b60405180910390f35b3480156104a857600080fd5b506104b1610eb2565b6040516104be9190613c5c565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e99190613668565b610f40565b005b3480156104fc57600080fd5b50610505610fc6565b6040516105129190613ffe565b60405180910390f35b34801561052757600080fd5b50610542600480360381019061053d919061339e565b61104a565b60405161054f9190613ffe565b60405180910390f35b34801561056457600080fd5b5061056d611133565b005b34801561057b57600080fd5b506105846111bb565b005b34801561059257600080fd5b506105ad60048036038101906105a89190613561565b611263565b005b3480156105bb57600080fd5b506105c46113b0565b6040516105d19190613ffe565b60405180910390f35b3480156105e657600080fd5b506105ef6113bb565b6040516105fc9190613bda565b60405180910390f35b34801561061157600080fd5b5061061a6113e4565b6040516106279190613c5c565b60405180910390f35b61064a60048036038101906106459190613668565b611476565b005b34801561065857600080fd5b50610673600480360381019061066e91906134e1565b611744565b005b34801561068157600080fd5b5061069c60048036038101906106979190613668565b6118c5565b005b3480156106aa57600080fd5b506106b3611bf2565b6040516106c09190613ffe565b60405180910390f35b3480156106d557600080fd5b506106f060048036038101906106eb919061345e565b611bf8565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613668565b611c54565b005b34801561072757600080fd5b50610742600480360381019061073d9190613668565b611cda565b60405161074f9190613c5c565b60405180910390f35b34801561076457600080fd5b5061076d611d30565b60405161077a9190613ffe565b60405180910390f35b34801561078f57600080fd5b50610798611d36565b6040516107a59190613c41565b60405180910390f35b3480156107ba57600080fd5b506107d560048036038101906107d0919061339e565b611d49565b6040516107e29190613ffe565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d9190613668565b611d5b565b005b34801561082057600080fd5b5061083b600480360381019061083691906133cb565b611de1565b6040516108489190613c41565b60405180910390f35b34801561085d57600080fd5b506108786004803603810190610873919061339e565b611e75565b005b34801561088657600080fd5b5061088f611f6d565b60405161089c9190613ffe565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610980575061097f82611f73565b5b9050919050565b60606002805461099690614288565b80601f01602080910402602001604051908101604052809291908181526020018280546109c290614288565b8015610a0f5780601f106109e457610100808354040283529160200191610a0f565b820191906000526020600020905b8154815290600101906020018083116109f257829003601f168201915b5050505050905090565b6000610a2482611fdd565b610a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5a90613f9e565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aa982610e9c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1190613e9e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b39611feb565b73ffffffffffffffffffffffffffffffffffffffff161480610b685750610b6781610b62611feb565b611de1565b5b610ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9e90613dbe565b60405180910390fd5b610bb2838383611ff3565b505050565b6000600154905090565b610bcc8383836120a5565b505050565b61271081565b600d5481565b610be5611feb565b73ffffffffffffffffffffffffffffffffffffffff16610c036113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610c59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5090613e1e565b60405180910390fd5b60026008541415610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613f5e565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ccd90613bc5565b60006040518083038185875af1925050503d8060008114610d0a576040519150601f19603f3d011682016040523d82523d6000602084013e610d0f565b606091505b5050905080610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90613ebe565b60405180910390fd5b506001600881905550565b610d7983838360405180602001604052806000815250611bf8565b505050565b600b5481565b610d8c611feb565b73ffffffffffffffffffffffffffffffffffffffff16610daa6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df790613e1e565b60405180910390fd5b818160099190610e1192919061313c565b505050565b610e1e611feb565b73ffffffffffffffffffffffffffffffffffffffff16610e3c6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990613e1e565b60405180910390fd5b80600d8190555050565b6000610ea7826125e5565b600001519050919050565b60098054610ebf90614288565b80601f0160208091040260200160405190810160405280929190818152602001828054610eeb90614288565b8015610f385780601f10610f0d57610100808354040283529160200191610f38565b820191906000526020600020905b815481529060010190602001808311610f1b57829003601f168201915b505050505081565b610f48611feb565b73ffffffffffffffffffffffffffffffffffffffff16610f666113bb565b73ffffffffffffffffffffffffffffffffffffffff1614610fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb390613e1e565b60405180910390fd5b80600c8190555050565b6000610fd0611feb565b73ffffffffffffffffffffffffffffffffffffffff16610fee6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103b90613e1e565b60405180910390fd5b47905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613dde565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61113b611feb565b73ffffffffffffffffffffffffffffffffffffffff166111596113bb565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690613e1e565b60405180910390fd5b6111b9600061277f565b565b6111c3611feb565b73ffffffffffffffffffffffffffffffffffffffff166111e16113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e90613e1e565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61126b611feb565b73ffffffffffffffffffffffffffffffffffffffff166112896113bb565b73ffffffffffffffffffffffffffffffffffffffff16146112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690613e1e565b60405180910390fd5b6000838390509050600082826112f59190614144565b9050600161271061130691906140bd565b8161130f610bb7565b61131991906140bd565b10611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090613f3e565b60405180910390fd5b60005b828110156113a85761139586868381811061137a576113796143f2565b5b905060200201602081019061138f919061339e565b85612843565b80806113a0906142eb565b91505061135c565b505050505050565b660bb9551fc2400081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546113f390614288565b80601f016020809104026020016040519081016040528092919081815260200182805461141f90614288565b801561146c5780601f106114415761010080835404028352916020019161146c565b820191906000526020600020905b81548152906001019060200180831161144f57829003601f168201915b5050505050905090565b80600f60009054906101000a900460ff166114c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bd90613fde565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b90613d9e565b60405180910390fd5b600161271061154391906140bd565b8161154c610bb7565b61155691906140bd565b10611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90613f3e565b60405180910390fd5b600081116115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090613c7e565b60405180910390fd5b6002600854141561161f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161690613f5e565b60405180910390fd5b6002600881905550660bb9551fc240008261163a9190614144565b341461167b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167290613d1e565b60405180910390fd5b6001600b5461168a91906140bd565b8261169433611d49565b61169e91906140bd565b106116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590613fbe565b60405180910390fd5b6001600a546116ed91906140bd565b821061172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613c9e565b60405180910390fd5b6117383383612843565b60016008819055505050565b61174c611feb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b190613e5e565b60405180910390fd5b80600760006117c7611feb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611874611feb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b99190613c41565b60405180910390a35050565b80600f60009054906101000a900460ff16611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90613fde565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197a90613d9e565b60405180910390fd5b600161271061199291906140bd565b8161199b610bb7565b6119a591906140bd565b106119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90613f3e565b60405180910390fd5b60008111611a28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1f90613c7e565b60405180910390fd5b60026008541415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613f5e565b60405180910390fd5b60026008819055506001600d54611a8591906140bd565b82600e54611a9391906140bd565b10611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613d7e565b60405180910390fd5b6001600c54611ae291906140bd565b82601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b2d91906140bd565b10611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490613cfe565b60405180910390fd5b81600e6000828254611b7f91906140bd565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bd591906140bd565b92505081905550611be63383612843565b60016008819055505050565b600c5481565b611c038484846120a5565b611c0f84848484612861565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613ede565b60405180910390fd5b50505050565b611c5c611feb565b73ffffffffffffffffffffffffffffffffffffffff16611c7a6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613e1e565b60405180910390fd5b80600a8190555050565b60606000611ce7836129f8565b90506000815111611d075760405180602001604052806000815250611d28565b80604051602001611d189190613ba3565b6040516020818303038152906040525b915050919050565b600e5481565b600f60009054906101000a900460ff1681565b6000611d5482612aa0565b9050919050565b611d63611feb565b73ffffffffffffffffffffffffffffffffffffffff16611d816113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611dd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce90613e1e565b60405180910390fd5b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e7d611feb565b73ffffffffffffffffffffffffffffffffffffffff16611e9b6113bb565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890613e1e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5890613cbe565b60405180910390fd5b611f6a8161277f565b50565b600a5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120b0826125e5565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120d7611feb565b73ffffffffffffffffffffffffffffffffffffffff16148061213357506120fc611feb565b73ffffffffffffffffffffffffffffffffffffffff1661211b84610a19565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214f575061214e8260000151612149611feb565b611de1565b5b905080612191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218890613e7e565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fa90613dfe565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226a90613d3e565b60405180910390fd5b6122808585856001612b89565b6122906000848460000151611ff3565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612575576124d481611fdd565b156125745782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125de8585856001612b8f565b5050505050565b6125ed6131c2565b6125f682611fdd565b612635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262c90613cde565b60405180910390fd5b60008290505b6000811061273e576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461272f57809250505061277a565b5080806001900391505061263b565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277190613f7e565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61285d828260405180602001604052806000815250612b95565b5050565b60006128828473ffffffffffffffffffffffffffffffffffffffff16612ba7565b156129eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ab611feb565b8786866040518563ffffffff1660e01b81526004016128cd9493929190613bf5565b602060405180830381600087803b1580156128e757600080fd5b505af192505050801561291857506040513d601f19601f8201168201806040525081019061291591906135ee565b60015b61299b573d8060008114612948576040519150601f19603f3d011682016040523d82523d6000602084013e61294d565b606091505b50600081511415612993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298a90613ede565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129f0565b600190505b949350505050565b6060612a0382611fdd565b612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990613e3e565b60405180910390fd5b6000612a4c612bca565b9050600081511415612a6d5760405180602001604052806000815250612a98565b80612a7784612c5c565b604051602001612a88929190613b7f565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890613d5e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b612ba28383836001612dbd565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060098054612bd990614288565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0590614288565b8015612c525780601f10612c2757610100808354040283529160200191612c52565b820191906000526020600020905b815481529060010190602001808311612c3557829003601f168201915b5050505050905090565b60606000821415612ca4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612db8565b600082905060005b60008214612cd6578080612cbf906142eb565b915050600a82612ccf9190614113565b9150612cac565b60008167ffffffffffffffff811115612cf257612cf1614421565b5b6040519080825280601f01601f191660200182016040528015612d245781602001600182028036833780820191505090505b5090505b60008514612db157600182612d3d919061419e565b9150600a85612d4c9190614334565b6030612d5891906140bd565b60f81b818381518110612d6e57612d6d6143f2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612daa9190614113565b9450612d28565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2b90613efe565b60405180910390fd5b6000841415612e78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6f90613f1e565b60405180910390fd5b612e856000868387612b89565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561311f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561310a576130ca6000888488612861565b613109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310090613ede565b60405180910390fd5b5b81806001019250508080600101915050613053565b5080600181905550506131356000868387612b8f565b5050505050565b82805461314890614288565b90600052602060002090601f01602090048101928261316a57600085556131b1565b82601f1061318357803560ff19168380011785556131b1565b828001600101855582156131b1579182015b828111156131b0578235825591602001919060010190613195565b5b5090506131be91906131fc565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156132155760008160009055506001016131fd565b5090565b600061322c6132278461403e565b614019565b9050828152602081018484840111156132485761324761445f565b5b613253848285614246565b509392505050565b60008135905061326a81614c1f565b92915050565b60008083601f84011261328657613285614455565b5b8235905067ffffffffffffffff8111156132a3576132a2614450565b5b6020830191508360208202830111156132bf576132be61445a565b5b9250929050565b6000813590506132d581614c36565b92915050565b6000813590506132ea81614c4d565b92915050565b6000815190506132ff81614c4d565b92915050565b600082601f83011261331a57613319614455565b5b813561332a848260208601613219565b91505092915050565b60008083601f84011261334957613348614455565b5b8235905067ffffffffffffffff81111561336657613365614450565b5b6020830191508360018202830111156133825761338161445a565b5b9250929050565b60008135905061339881614c64565b92915050565b6000602082840312156133b4576133b3614469565b5b60006133c28482850161325b565b91505092915050565b600080604083850312156133e2576133e1614469565b5b60006133f08582860161325b565b92505060206134018582860161325b565b9150509250929050565b60008060006060848603121561342457613423614469565b5b60006134328682870161325b565b93505060206134438682870161325b565b925050604061345486828701613389565b9150509250925092565b6000806000806080858703121561347857613477614469565b5b60006134868782880161325b565b94505060206134978782880161325b565b93505060406134a887828801613389565b925050606085013567ffffffffffffffff8111156134c9576134c8614464565b5b6134d587828801613305565b91505092959194509250565b600080604083850312156134f8576134f7614469565b5b60006135068582860161325b565b9250506020613517858286016132c6565b9150509250929050565b6000806040838503121561353857613537614469565b5b60006135468582860161325b565b925050602061355785828601613389565b9150509250929050565b60008060006040848603121561357a57613579614469565b5b600084013567ffffffffffffffff81111561359857613597614464565b5b6135a486828701613270565b935093505060206135b786828701613389565b9150509250925092565b6000602082840312156135d7576135d6614469565b5b60006135e5848285016132db565b91505092915050565b60006020828403121561360457613603614469565b5b6000613612848285016132f0565b91505092915050565b6000806020838503121561363257613631614469565b5b600083013567ffffffffffffffff8111156136505761364f614464565b5b61365c85828601613333565b92509250509250929050565b60006020828403121561367e5761367d614469565b5b600061368c84828501613389565b91505092915050565b61369e816141d2565b82525050565b6136ad816141e4565b82525050565b60006136be8261406f565b6136c88185614085565b93506136d8818560208601614255565b6136e18161446e565b840191505092915050565b60006136f78261407a565b61370181856140a1565b9350613711818560208601614255565b61371a8161446e565b840191505092915050565b60006137308261407a565b61373a81856140b2565b935061374a818560208601614255565b80840191505092915050565b6000613763601e836140a1565b915061376e8261447f565b602082019050919050565b60006137866039836140a1565b9150613791826144a8565b604082019050919050565b60006137a96026836140a1565b91506137b4826144f7565b604082019050919050565b60006137cc602a836140a1565b91506137d782614546565b604082019050919050565b60006137ef6039836140a1565b91506137fa82614595565b604082019050919050565b60006138126024836140a1565b915061381d826145e4565b604082019050919050565b60006138356025836140a1565b915061384082614633565b604082019050919050565b60006138586031836140a1565b915061386382614682565b604082019050919050565b600061387b602b836140a1565b9150613886826146d1565b604082019050919050565b600061389e6012836140a1565b91506138a982614720565b602082019050919050565b60006138c16039836140a1565b91506138cc82614749565b604082019050919050565b60006138e4602b836140a1565b91506138ef82614798565b604082019050919050565b60006139076026836140a1565b9150613912826147e7565b604082019050919050565b600061392a6005836140b2565b915061393582614836565b600582019050919050565b600061394d6020836140a1565b91506139588261485f565b602082019050919050565b6000613970602f836140a1565b915061397b82614888565b604082019050919050565b6000613993601a836140a1565b915061399e826148d7565b602082019050919050565b60006139b66032836140a1565b91506139c182614900565b604082019050919050565b60006139d96022836140a1565b91506139e48261494f565b604082019050919050565b60006139fc600083614096565b9150613a078261499e565b600082019050919050565b6000613a1f6010836140a1565b9150613a2a826149a1565b602082019050919050565b6000613a426033836140a1565b9150613a4d826149ca565b604082019050919050565b6000613a656021836140a1565b9150613a7082614a19565b604082019050919050565b6000613a886028836140a1565b9150613a9382614a68565b604082019050919050565b6000613aab601c836140a1565b9150613ab682614ab7565b602082019050919050565b6000613ace601f836140a1565b9150613ad982614ae0565b602082019050919050565b6000613af1602f836140a1565b9150613afc82614b09565b604082019050919050565b6000613b14602d836140a1565b9150613b1f82614b58565b604082019050919050565b6000613b37602f836140a1565b9150613b4282614ba7565b604082019050919050565b6000613b5a6020836140a1565b9150613b6582614bf6565b602082019050919050565b613b798161423c565b82525050565b6000613b8b8285613725565b9150613b978284613725565b91508190509392505050565b6000613baf8284613725565b9150613bba8261391d565b915081905092915050565b6000613bd0826139ef565b9150819050919050565b6000602082019050613bef6000830184613695565b92915050565b6000608082019050613c0a6000830187613695565b613c176020830186613695565b613c246040830185613b70565b8181036060830152613c3681846136b3565b905095945050505050565b6000602082019050613c5660008301846136a4565b92915050565b60006020820190508181036000830152613c7681846136ec565b905092915050565b60006020820190508181036000830152613c9781613756565b9050919050565b60006020820190508181036000830152613cb781613779565b9050919050565b60006020820190508181036000830152613cd78161379c565b9050919050565b60006020820190508181036000830152613cf7816137bf565b9050919050565b60006020820190508181036000830152613d17816137e2565b9050919050565b60006020820190508181036000830152613d3781613805565b9050919050565b60006020820190508181036000830152613d5781613828565b9050919050565b60006020820190508181036000830152613d778161384b565b9050919050565b60006020820190508181036000830152613d978161386e565b9050919050565b60006020820190508181036000830152613db781613891565b9050919050565b60006020820190508181036000830152613dd7816138b4565b9050919050565b60006020820190508181036000830152613df7816138d7565b9050919050565b60006020820190508181036000830152613e17816138fa565b9050919050565b60006020820190508181036000830152613e3781613940565b9050919050565b60006020820190508181036000830152613e5781613963565b9050919050565b60006020820190508181036000830152613e7781613986565b9050919050565b60006020820190508181036000830152613e97816139a9565b9050919050565b60006020820190508181036000830152613eb7816139cc565b9050919050565b60006020820190508181036000830152613ed781613a12565b9050919050565b60006020820190508181036000830152613ef781613a35565b9050919050565b60006020820190508181036000830152613f1781613a58565b9050919050565b60006020820190508181036000830152613f3781613a7b565b9050919050565b60006020820190508181036000830152613f5781613a9e565b9050919050565b60006020820190508181036000830152613f7781613ac1565b9050919050565b60006020820190508181036000830152613f9781613ae4565b9050919050565b60006020820190508181036000830152613fb781613b07565b9050919050565b60006020820190508181036000830152613fd781613b2a565b9050919050565b60006020820190508181036000830152613ff781613b4d565b9050919050565b60006020820190506140136000830184613b70565b92915050565b6000614023614034565b905061402f82826142ba565b919050565b6000604051905090565b600067ffffffffffffffff82111561405957614058614421565b5b6140628261446e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c88261423c565b91506140d38361423c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561410857614107614365565b5b828201905092915050565b600061411e8261423c565b91506141298361423c565b92508261413957614138614394565b5b828204905092915050565b600061414f8261423c565b915061415a8361423c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561419357614192614365565b5b828202905092915050565b60006141a98261423c565b91506141b48361423c565b9250828210156141c7576141c6614365565b5b828203905092915050565b60006141dd8261421c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614273578082015181840152602081019050614258565b83811115614282576000848401525b50505050565b600060028204905060018216806142a057607f821691505b602082108114156142b4576142b36143c3565b5b50919050565b6142c38261446e565b810181811067ffffffffffffffff821117156142e2576142e1614421565b5b80604052505050565b60006142f68261423c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561432957614328614365565b5b600182019050919050565b600061433f8261423c565b915061434a8361423c565b92508261435a57614359614394565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20302e0000600082015250565b7f596f7520747269656420746f206d696e7420746f6f206d616e792044696e676160008201527f6c696e677320696e206f6e65207472616e73616374696f6e2e00000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f596f7527766520616c7265616479206d696e74656420746865206d61782e206160008201527f6d6f756e74206f6620667265652044696e67616c696e67732e00000000000000602082015250565b7f506c656173652073656e642074686520657861637420616d6f756e74206f662060008201527f6574682e00000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f576527766520676976656e206f757420616c6c206f66206f757220667265652060008201527f44696e67616c696e67732e000000000000000000000000000000000000000000602082015250565b7f536e65616b7920736e65616b2c207365722c0000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f5765277665206d696e74656420616c6c2044696e67616c696e67732e00000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f596f75722077616c6c6574206f776e7320746865206d61782e20616d6f756e7460008201527f206f662044696e67616c696e67732e0000000000000000000000000000000000602082015250565b7f4d696e74696e67206861736e2774206265656e20656e61626c6564207965742e600082015250565b614c28816141d2565b8114614c3357600080fd5b50565b614c3f816141e4565b8114614c4a57600080fd5b50565b614c56816141f0565b8114614c6157600080fd5b50565b614c6d8161423c565b8114614c7857600080fd5b5056fea26469706673582212208cc9f5de279664972487deff8e0809fbc56263b58967e86397a456527a5df69b64736f6c63430008070033

Deployed Bytecode Sourcemap

40370:4346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27470:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29245:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30807:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30328:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27307:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31683:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40515:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40668:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44542:171;;;;;;;;;;;;;:::i;:::-;;31916:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40593:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43902:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43992:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29054:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40437:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44294:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43408:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27827:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2660:103;;;;;;;;;;;;;:::i;:::-;;43817:80;;;;;;;;;;;;;:::i;:::-;;42305:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40467:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2009:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29414:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41501:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31093:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41900:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40629:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32164:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44090:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43014:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40703:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40736:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43523:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44184:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31452:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2918:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40561:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27470:293;27572:4;27620:25;27605:40;;;:11;:40;;;;:101;;;;27673:33;27658:48;;;:11;:48;;;;27605:101;:150;;;;27719:36;27743:11;27719:23;:36::i;:::-;27605:150;27589:166;;27470:293;;;:::o;29245:100::-;29299:13;29332:5;29325:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29245:100;:::o;30807:214::-;30875:7;30903:16;30911:7;30903;:16::i;:::-;30895:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30989:15;:24;31005:7;30989:24;;;;;;;;;;;;;;;;;;;;;30982:31;;30807:214;;;:::o;30328:413::-;30401:13;30417:24;30433:7;30417:15;:24::i;:::-;30401:40;;30466:5;30460:11;;:2;:11;;;;30452:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30561:5;30545:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30570:37;30587:5;30594:12;:10;:12::i;:::-;30570:16;:37::i;:::-;30545:62;30523:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30705:28;30714:2;30718:7;30727:5;30705:8;:28::i;:::-;30390:351;30328:413;;:::o;27307:91::-;27351:7;27378:12;;27371:19;;27307:91;:::o;31683:162::-;31809:28;31819:4;31825:2;31829:7;31809:9;:28::i;:::-;31683:162;;;:::o;40515:42::-;40552:5;40515:42;:::o;40668:31::-;;;;:::o;44542:171::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1:::1;11705:7;;:19;;11697:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1;11838:7;:18;;;;44600:12:::2;44618:10;:15;;44641:21;44618:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44599:68;;;44680:7;44672:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;44594:119;11063:1:::1;12017:7;:22;;;;44542:171::o:0;31916:177::-;32046:39;32063:4;32069:2;32073:7;32046:39;;;;;;;;;;;;:16;:39::i;:::-;31916:177;;;:::o;40593:32::-;;;;:::o;43902:85::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43978:4:::1;;43968:7;:14;;;;;;;:::i;:::-;;43902:85:::0;;:::o;43992:93::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44070:10:::1;44058:9;:22;;;;43992:93:::0;:::o;29054:124::-;29118:7;29145:20;29157:7;29145:11;:20::i;:::-;:25;;;29138:32;;29054:124;;;:::o;40437:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44294:121::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44393:17:::1;44374:16;:36;;;;44294:121:::0;:::o;43408:110::-;43471:7;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43492:21:::1;43485:28;;43408:110:::0;:::o;27827:221::-;27891:7;27936:1;27919:19;;:5;:19;;;;27911:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28012:12;:19;28025:5;28012:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28004:36;;27997:43;;27827:221;;;:::o;2660:103::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2725:30:::1;2752:1;2725:18;:30::i;:::-;2660:103::o:0;43817:80::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43881:11:::1;;;;;;;;;;;43880:12;43866:11;;:26;;;;;;;;;;;;;;;;;;43817:80::o:0;42305:366::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42403:21:::1;42427:10;;:17;;42403:41;;42449:11;42479:9;42463:13;:25;;;;:::i;:::-;42449:39;;42538:1;40552:5;42525:14;;;;:::i;:::-;42519:3;42503:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:36;42495:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;42584:6;42579:88;42600:13;42596:1;:17;42579:88;;;42626:35;42636:10;;42647:1;42636:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;42651:9;42626;:35::i;:::-;42615:3;;;;;:::i;:::-;;;;42579:88;;;;42398:273;;42305:366:::0;;;:::o;40467:44::-;40499:12;40467:44;:::o;2009:87::-;2055:7;2082:6;;;;;;;;;;;2075:13;;2009:87;:::o;29414:104::-;29470:13;29503:7;29496:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29414:104;:::o;41501:394::-;41554:3;41151:11;;;;;;;;;;;41143:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41226:9;41212:23;;:10;:23;;;41204:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;41306:1;40552:5;41293:14;;;;:::i;:::-;41287:3;41271:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:36;41263:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41359:1;41353:3;:7;41345:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1:::1;11705:7;;:19;;11697:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1;11838:7;:18;;;;40499:12:::2;41598:3;:11;;;;:::i;:::-;41585:9;:24;41577:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41711:1;41696:12;;:16;;;;:::i;:::-;41690:3;41663:24;41676:10;41663:12;:24::i;:::-;:30;;;;:::i;:::-;:49;41655:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;41794:1;41783:8;;:12;;;;:::i;:::-;41777:3;:18;41769:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;41864:26;41874:10;41886:3;41864:9;:26::i;:::-;11063:1:::1;12017:7;:22;;;;41501:394:::0;;:::o;31093:288::-;31200:12;:10;:12::i;:::-;31188:24;;:8;:24;;;;31180:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31301:8;31256:18;:32;31275:12;:10;:12::i;:::-;31256:32;;;;;;;;;;;;;;;:42;31289:8;31256:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31354:8;31325:48;;31340:12;:10;:12::i;:::-;31325:48;;;31364:8;31325:48;;;;;;:::i;:::-;;;;;;;;31093:288;;:::o;41900:400::-;41949:3;41151:11;;;;;;;;;;;41143:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;41226:9;41212:23;;:10;:23;;;41204:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;41306:1;40552:5;41293:14;;;;:::i;:::-;41287:3;41271:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:36;41263:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41359:1;41353:3;:7;41345:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1:::1;11705:7;;:19;;11697:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11107:1;11838:7;:18;;;;42011:1:::2;41999:9;;:13;;;;:::i;:::-;41993:3;41980:10;;:16;;;;:::i;:::-;:32;41972:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;42132:1;42113:16;;:20;;;;:::i;:::-;42107:3;42073:19;:31;42093:10;42073:31;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:60;42065:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;42216:3;42202:10;;:17;;;;;;;:::i;:::-;;;;;;;;42259:3;42224:19;:31;42244:10;42224:31;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;42269:26;42279:10;42291:3;42269:9;:26::i;:::-;11063:1:::1;12017:7;:22;;;;41900:400:::0;;:::o;40629:35::-;;;;:::o;32164:355::-;32323:28;32333:4;32339:2;32343:7;32323:9;:28::i;:::-;32384:48;32407:4;32413:2;32417:7;32426:5;32384:22;:48::i;:::-;32362:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;32164:355;;;;:::o;44090:89::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44165:9:::1;44154:8;:20;;;;44090:89:::0;:::o;43014:237::-;43087:13;43113:17;43133:23;43148:7;43133:14;:23::i;:::-;43113:43;;43196:1;43182:3;43176:17;:21;:67;;;;;;;;;;;;;;;;;43224:3;43207:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;43176:67;43169:74;;;43014:237;;;:::o;40703:29::-;;;;:::o;40736:31::-;;;;;;;;;;;;;:::o;43523:104::-;43581:7;43602:20;43616:5;43602:13;:20::i;:::-;43595:27;;43523:104;;;:::o;44184:105::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44271:13:::1;44256:12;:28;;;;44184:105:::0;:::o;31452:164::-;31549:4;31573:18;:25;31592:5;31573:25;;;;;;;;;;;;;;;:35;31599:8;31573:35;;;;;;;;;;;;;;;;;;;;;;;;;31566:42;;31452:164;;;;:::o;2918:201::-;2240:12;:10;:12::i;:::-;2229:23;;:7;:5;:7::i;:::-;:23;;;2221:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3027:1:::1;3007:22;;:8;:22;;;;2999:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3083:28;3102:8;3083:18;:28::i;:::-;2918:201:::0;:::o;40561:28::-;;;;:::o;25449:157::-;25534:4;25573:25;25558:40;;;:11;:40;;;;25551:47;;25449:157;;;:::o;32774:111::-;32831:4;32865:12;;32855:7;:22;32848:29;;32774:111;;;:::o;727:98::-;780:7;807:10;800:17;;727:98;:::o;37554:196::-;37696:2;37669:15;:24;37685:7;37669:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37734:7;37730:2;37714:28;;37723:5;37714:28;;;;;;;;;;;;37554:196;;;:::o;35502:1934::-;35617:35;35655:20;35667:7;35655:11;:20::i;:::-;35617:58;;35688:22;35730:13;:18;;;35714:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;35785:12;:10;:12::i;:::-;35761:36;;:20;35773:7;35761:11;:20::i;:::-;:36;;;35714:83;:146;;;;35810:50;35827:13;:18;;;35847:12;:10;:12::i;:::-;35810:16;:50::i;:::-;35714:146;35688:173;;35882:17;35874:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;35997:4;35975:26;;:13;:18;;;:26;;;35967:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36077:1;36063:16;;:2;:16;;;;36055:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36134:43;36156:4;36162:2;36166:7;36175:1;36134:21;:43::i;:::-;36242:49;36259:1;36263:7;36272:13;:18;;;36242:8;:49::i;:::-;36609:1;36579:12;:18;36592:4;36579:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36649:1;36621:12;:16;36634:2;36621:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36691:2;36663:11;:20;36675:7;36663:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36749:15;36704:11;:20;36716:7;36704:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37005:19;37037:1;37027:7;:11;37005:33;;37094:1;37053:43;;:11;:24;37065:11;37053:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37049:275;;;37117:20;37125:11;37117:7;:20::i;:::-;37113:200;;;37190:13;:18;;;37158:11;:24;37170:11;37158:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37269:13;:28;;;37227:11;:24;37239:11;37227:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37113:200;37049:275;36558:773;37367:7;37363:2;37348:27;;37357:4;37348:27;;;;;;;;;;;;37386:42;37407:4;37413:2;37417:7;37426:1;37386:20;:42::i;:::-;35606:1830;;35502:1934;;;:::o;28487:505::-;28548:21;;:::i;:::-;28590:16;28598:7;28590;:16::i;:::-;28582:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28688:12;28703:7;28688:22;;28683:225;28720:1;28712:4;:9;28683:225;;28746:31;28780:11;:17;28792:4;28780:17;;;;;;;;;;;28746:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28842:1;28816:28;;:9;:14;;;:28;;;28812:85;;28872:9;28865:16;;;;;;28812:85;28731:177;28723:6;;;;;;;;28683:225;;;;28927:57;;;;;;;;;;:::i;:::-;;;;;;;;28487:505;;;;:::o;3279:191::-;3353:16;3372:6;;;;;;;;;;;3353:25;;3398:8;3389:6;;:17;;;;;;;;;;;;;;;;;;3453:8;3422:40;;3443:8;3422:40;;;;;;;;;;;;3342:128;3279:191;:::o;32893:104::-;32962:27;32972:2;32976:8;32962:27;;;;;;;;;;;;:9;:27::i;:::-;32893:104;;:::o;38315:804::-;38470:4;38491:15;:2;:13;;;:15::i;:::-;38487:625;;;38543:2;38527:36;;;38564:12;:10;:12::i;:::-;38578:4;38584:7;38593:5;38527:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38523:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38790:1;38773:6;:13;:18;38769:273;;;38816:61;;;;;;;;;;:::i;:::-;;;;;;;;38769:273;38992:6;38986:13;38977:6;38973:2;38969:15;38962:38;38523:534;38660:45;;;38650:55;;;:6;:55;;;;38643:62;;;;;38487:625;39096:4;39089:11;;38315:804;;;;;;;:::o;29589:335::-;29662:13;29696:16;29704:7;29696;:16::i;:::-;29688:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29777:21;29801:10;:8;:10::i;:::-;29777:34;;29854:1;29835:7;29829:21;:26;;:87;;;;;;;;;;;;;;;;;29882:7;29891:18;:7;:16;:18::i;:::-;29865:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29829:87;29822:94;;;29589:335;;;:::o;28056:229::-;28117:7;28162:1;28145:19;;:5;:19;;;;28137:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28244:12;:19;28257:5;28244:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28236:41;;28229:48;;28056:229;;;:::o;39607:159::-;;;;;:::o;40178:158::-;;;;;:::o;33360:163::-;33483:32;33489:2;33493:8;33503:5;33510:4;33483:5;:32::i;:::-;33360:163;;;:::o;15176:326::-;15236:4;15493:1;15471:7;:19;;;:23;15464:30;;15176:326;;;:::o;42901:108::-;42961:13;42994:7;42987:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42901:108;:::o;22819:723::-;22875:13;23105:1;23096:5;:10;23092:53;;;23123:10;;;;;;;;;;;;;;;;;;;;;23092:53;23155:12;23170:5;23155:20;;23186:14;23211:78;23226:1;23218:4;:9;23211:78;;23244:8;;;;;:::i;:::-;;;;23275:2;23267:10;;;;;:::i;:::-;;;23211:78;;;23299:19;23331:6;23321:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23299:39;;23349:154;23365:1;23356:5;:10;23349:154;;23393:1;23383:11;;;;;:::i;:::-;;;23460:2;23452:5;:10;;;;:::i;:::-;23439:2;:24;;;;:::i;:::-;23426:39;;23409:6;23416;23409:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23489:2;23480:11;;;;;:::i;:::-;;;23349:154;;;23527:6;23513:21;;;;;22819:723;;;;:::o;33782:1466::-;33921:20;33944:12;;33921:35;;33989:1;33975:16;;:2;:16;;;;33967:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34060:1;34048:8;:13;;34040:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34119:61;34149:1;34153:2;34157:12;34171:8;34119:21;:61::i;:::-;34486:8;34450:12;:16;34463:2;34450:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34547:8;34506:12;:16;34519:2;34506:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34602:2;34569:11;:25;34581:12;34569:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34665:15;34615:11;:25;34627:12;34615:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34694:20;34717:12;34694:35;;34747:9;34742:379;34762:8;34758:1;:12;34742:379;;;34822:12;34818:2;34797:38;;34814:1;34797:38;;;;;;;;;;;;34854:4;34850:229;;;34909:59;34940:1;34944:2;34948:12;34962:5;34909:22;:59::i;:::-;34879:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;34850:229;35095:14;;;;;;;34772:3;;;;;;;34742:379;;;;35148:12;35133;:27;;;;34429:739;35180:60;35209:1;35213:2;35217:12;35231:8;35180:20;:60::i;:::-;33910:1338;33782:1466;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1959:553::-;2017:8;2027:6;2077:3;2070:4;2062:6;2058:17;2054:27;2044:122;;2085:79;;:::i;:::-;2044:122;2198:6;2185:20;2175:30;;2228:18;2220:6;2217:30;2214:117;;;2250:79;;:::i;:::-;2214:117;2364:4;2356:6;2352:17;2340:29;;2418:3;2410:4;2402:6;2398:17;2388:8;2384:32;2381:41;2378:128;;;2425:79;;:::i;:::-;2378:128;1959:553;;;;;:::o;2518:139::-;2564:5;2602:6;2589:20;2580:29;;2618:33;2645:5;2618:33;:::i;:::-;2518:139;;;;:::o;2663:329::-;2722:6;2771:2;2759:9;2750:7;2746:23;2742:32;2739:119;;;2777:79;;:::i;:::-;2739:119;2897:1;2922:53;2967:7;2958:6;2947:9;2943:22;2922:53;:::i;:::-;2912:63;;2868:117;2663:329;;;;:::o;2998:474::-;3066:6;3074;3123:2;3111:9;3102:7;3098:23;3094:32;3091:119;;;3129:79;;:::i;:::-;3091:119;3249:1;3274:53;3319:7;3310:6;3299:9;3295:22;3274:53;:::i;:::-;3264:63;;3220:117;3376:2;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3347:118;2998:474;;;;;:::o;3478:619::-;3555:6;3563;3571;3620:2;3608:9;3599:7;3595:23;3591:32;3588:119;;;3626:79;;:::i;:::-;3588:119;3746:1;3771:53;3816:7;3807:6;3796:9;3792:22;3771:53;:::i;:::-;3761:63;;3717:117;3873:2;3899:53;3944:7;3935:6;3924:9;3920:22;3899:53;:::i;:::-;3889:63;;3844:118;4001:2;4027:53;4072:7;4063:6;4052:9;4048:22;4027:53;:::i;:::-;4017:63;;3972:118;3478:619;;;;;:::o;4103:943::-;4198:6;4206;4214;4222;4271:3;4259:9;4250:7;4246:23;4242:33;4239:120;;;4278:79;;:::i;:::-;4239:120;4398:1;4423:53;4468:7;4459:6;4448:9;4444:22;4423:53;:::i;:::-;4413:63;;4369:117;4525:2;4551:53;4596:7;4587:6;4576:9;4572:22;4551:53;:::i;:::-;4541:63;;4496:118;4653:2;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4624:118;4809:2;4798:9;4794:18;4781:32;4840:18;4832:6;4829:30;4826:117;;;4862:79;;:::i;:::-;4826:117;4967:62;5021:7;5012:6;5001:9;4997:22;4967:62;:::i;:::-;4957:72;;4752:287;4103:943;;;;;;;:::o;5052:468::-;5117:6;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:53;5370:7;5361:6;5350:9;5346:22;5325:53;:::i;:::-;5315:63;;5271:117;5427:2;5453:50;5495:7;5486:6;5475:9;5471:22;5453:50;:::i;:::-;5443:60;;5398:115;5052:468;;;;;:::o;5526:474::-;5594:6;5602;5651:2;5639:9;5630:7;5626:23;5622:32;5619:119;;;5657:79;;:::i;:::-;5619:119;5777:1;5802:53;5847:7;5838:6;5827:9;5823:22;5802:53;:::i;:::-;5792:63;;5748:117;5904:2;5930:53;5975:7;5966:6;5955:9;5951:22;5930:53;:::i;:::-;5920:63;;5875:118;5526:474;;;;;:::o;6006:704::-;6101:6;6109;6117;6166:2;6154:9;6145:7;6141:23;6137:32;6134:119;;;6172:79;;:::i;:::-;6134:119;6320:1;6309:9;6305:17;6292:31;6350:18;6342:6;6339:30;6336:117;;;6372:79;;:::i;:::-;6336:117;6485:80;6557:7;6548:6;6537:9;6533:22;6485:80;:::i;:::-;6467:98;;;;6263:312;6614:2;6640:53;6685:7;6676:6;6665:9;6661:22;6640:53;:::i;:::-;6630:63;;6585:118;6006:704;;;;;:::o;6716:327::-;6774:6;6823:2;6811:9;6802:7;6798:23;6794:32;6791:119;;;6829:79;;:::i;:::-;6791:119;6949:1;6974:52;7018:7;7009:6;6998:9;6994:22;6974:52;:::i;:::-;6964:62;;6920:116;6716:327;;;;:::o;7049:349::-;7118:6;7167:2;7155:9;7146:7;7142:23;7138:32;7135:119;;;7173:79;;:::i;:::-;7135:119;7293:1;7318:63;7373:7;7364:6;7353:9;7349:22;7318:63;:::i;:::-;7308:73;;7264:127;7049:349;;;;:::o;7404:529::-;7475:6;7483;7532:2;7520:9;7511:7;7507:23;7503:32;7500:119;;;7538:79;;:::i;:::-;7500:119;7686:1;7675:9;7671:17;7658:31;7716:18;7708:6;7705:30;7702:117;;;7738:79;;:::i;:::-;7702:117;7851:65;7908:7;7899:6;7888:9;7884:22;7851:65;:::i;:::-;7833:83;;;;7629:297;7404:529;;;;;:::o;7939:329::-;7998:6;8047:2;8035:9;8026:7;8022:23;8018:32;8015:119;;;8053:79;;:::i;:::-;8015:119;8173:1;8198:53;8243:7;8234:6;8223:9;8219:22;8198:53;:::i;:::-;8188:63;;8144:117;7939:329;;;;:::o;8274:118::-;8361:24;8379:5;8361:24;:::i;:::-;8356:3;8349:37;8274:118;;:::o;8398:109::-;8479:21;8494:5;8479:21;:::i;:::-;8474:3;8467:34;8398:109;;:::o;8513:360::-;8599:3;8627:38;8659:5;8627:38;:::i;:::-;8681:70;8744:6;8739:3;8681:70;:::i;:::-;8674:77;;8760:52;8805:6;8800:3;8793:4;8786:5;8782:16;8760:52;:::i;:::-;8837:29;8859:6;8837:29;:::i;:::-;8832:3;8828:39;8821:46;;8603:270;8513:360;;;;:::o;8879:364::-;8967:3;8995:39;9028:5;8995:39;:::i;:::-;9050:71;9114:6;9109:3;9050:71;:::i;:::-;9043:78;;9130:52;9175:6;9170:3;9163:4;9156:5;9152:16;9130:52;:::i;:::-;9207:29;9229:6;9207:29;:::i;:::-;9202:3;9198:39;9191:46;;8971:272;8879:364;;;;:::o;9249:377::-;9355:3;9383:39;9416:5;9383:39;:::i;:::-;9438:89;9520:6;9515:3;9438:89;:::i;:::-;9431:96;;9536:52;9581:6;9576:3;9569:4;9562:5;9558:16;9536:52;:::i;:::-;9613:6;9608:3;9604:16;9597:23;;9359:267;9249:377;;;;:::o;9632:366::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:400::-;14628:3;14649:84;14731:1;14726:3;14649:84;:::i;:::-;14642:91;;14742:93;14831:3;14742:93;:::i;:::-;14860:1;14855:3;14851:11;14844:18;;14468:400;;;:::o;14874:366::-;15016:3;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15113:93;15202:3;15113:93;:::i;:::-;15231:2;15226:3;15222:12;15215:19;;14874:366;;;:::o;15246:::-;15388:3;15409:67;15473:2;15468:3;15409:67;:::i;:::-;15402:74;;15485:93;15574:3;15485:93;:::i;:::-;15603:2;15598:3;15594:12;15587:19;;15246:366;;;:::o;15618:::-;15760:3;15781:67;15845:2;15840:3;15781:67;:::i;:::-;15774:74;;15857:93;15946:3;15857:93;:::i;:::-;15975:2;15970:3;15966:12;15959:19;;15618:366;;;:::o;15990:::-;16132:3;16153:67;16217:2;16212:3;16153:67;:::i;:::-;16146:74;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;15990:366;;;:::o;16362:::-;16504:3;16525:67;16589:2;16584:3;16525:67;:::i;:::-;16518:74;;16601:93;16690:3;16601:93;:::i;:::-;16719:2;16714:3;16710:12;16703:19;;16362:366;;;:::o;16734:398::-;16893:3;16914:83;16995:1;16990:3;16914:83;:::i;:::-;16907:90;;17006:93;17095:3;17006:93;:::i;:::-;17124:1;17119:3;17115:11;17108:18;;16734:398;;;:::o;17138:366::-;17280:3;17301:67;17365:2;17360:3;17301:67;:::i;:::-;17294:74;;17377:93;17466:3;17377:93;:::i;:::-;17495:2;17490:3;17486:12;17479:19;;17138:366;;;:::o;17510:::-;17652:3;17673:67;17737:2;17732:3;17673:67;:::i;:::-;17666:74;;17749:93;17838:3;17749:93;:::i;:::-;17867:2;17862:3;17858:12;17851:19;;17510:366;;;:::o;17882:::-;18024:3;18045:67;18109:2;18104:3;18045:67;:::i;:::-;18038:74;;18121:93;18210:3;18121:93;:::i;:::-;18239:2;18234:3;18230:12;18223:19;;17882:366;;;:::o;18254:::-;18396:3;18417:67;18481:2;18476:3;18417:67;:::i;:::-;18410:74;;18493:93;18582:3;18493:93;:::i;:::-;18611:2;18606:3;18602:12;18595:19;;18254:366;;;:::o;18626:::-;18768:3;18789:67;18853:2;18848:3;18789:67;:::i;:::-;18782:74;;18865:93;18954:3;18865:93;:::i;:::-;18983:2;18978:3;18974:12;18967:19;;18626:366;;;:::o;18998:::-;19140:3;19161:67;19225:2;19220:3;19161:67;:::i;:::-;19154:74;;19237:93;19326:3;19237:93;:::i;:::-;19355:2;19350:3;19346:12;19339:19;;18998:366;;;:::o;19370:::-;19512:3;19533:67;19597:2;19592:3;19533:67;:::i;:::-;19526:74;;19609:93;19698:3;19609:93;:::i;:::-;19727:2;19722:3;19718:12;19711:19;;19370:366;;;:::o;19742:::-;19884:3;19905:67;19969:2;19964:3;19905:67;:::i;:::-;19898:74;;19981:93;20070:3;19981:93;:::i;:::-;20099:2;20094:3;20090:12;20083:19;;19742:366;;;:::o;20114:::-;20256:3;20277:67;20341:2;20336:3;20277:67;:::i;:::-;20270:74;;20353:93;20442:3;20353:93;:::i;:::-;20471:2;20466:3;20462:12;20455:19;;20114:366;;;:::o;20486:::-;20628:3;20649:67;20713:2;20708:3;20649:67;:::i;:::-;20642:74;;20725:93;20814:3;20725:93;:::i;:::-;20843:2;20838:3;20834:12;20827:19;;20486:366;;;:::o;20858:118::-;20945:24;20963:5;20945:24;:::i;:::-;20940:3;20933:37;20858:118;;:::o;20982:435::-;21162:3;21184:95;21275:3;21266:6;21184:95;:::i;:::-;21177:102;;21296:95;21387:3;21378:6;21296:95;:::i;:::-;21289:102;;21408:3;21401:10;;20982:435;;;;;:::o;21423:541::-;21656:3;21678:95;21769:3;21760:6;21678:95;:::i;:::-;21671:102;;21790:148;21934:3;21790:148;:::i;:::-;21783:155;;21955:3;21948:10;;21423:541;;;;:::o;21970:379::-;22154:3;22176:147;22319:3;22176:147;:::i;:::-;22169:154;;22340:3;22333:10;;21970:379;;;:::o;22355:222::-;22448:4;22486:2;22475:9;22471:18;22463:26;;22499:71;22567:1;22556:9;22552:17;22543:6;22499:71;:::i;:::-;22355:222;;;;:::o;22583:640::-;22778:4;22816:3;22805:9;22801:19;22793:27;;22830:71;22898:1;22887:9;22883:17;22874:6;22830:71;:::i;:::-;22911:72;22979:2;22968:9;22964:18;22955:6;22911:72;:::i;:::-;22993;23061:2;23050:9;23046:18;23037:6;22993:72;:::i;:::-;23112:9;23106:4;23102:20;23097:2;23086:9;23082:18;23075:48;23140:76;23211:4;23202:6;23140:76;:::i;:::-;23132:84;;22583:640;;;;;;;:::o;23229:210::-;23316:4;23354:2;23343:9;23339:18;23331:26;;23367:65;23429:1;23418:9;23414:17;23405:6;23367:65;:::i;:::-;23229:210;;;;:::o;23445:313::-;23558:4;23596:2;23585:9;23581:18;23573:26;;23645:9;23639:4;23635:20;23631:1;23620:9;23616:17;23609:47;23673:78;23746:4;23737:6;23673:78;:::i;:::-;23665:86;;23445:313;;;;:::o;23764:419::-;23930:4;23968:2;23957:9;23953:18;23945:26;;24017:9;24011:4;24007:20;24003:1;23992:9;23988:17;23981:47;24045:131;24171:4;24045:131;:::i;:::-;24037:139;;23764:419;;;:::o;24189:::-;24355:4;24393:2;24382:9;24378:18;24370:26;;24442:9;24436:4;24432:20;24428:1;24417:9;24413:17;24406:47;24470:131;24596:4;24470:131;:::i;:::-;24462:139;;24189:419;;;:::o;24614:::-;24780:4;24818:2;24807:9;24803:18;24795:26;;24867:9;24861:4;24857:20;24853:1;24842:9;24838:17;24831:47;24895:131;25021:4;24895:131;:::i;:::-;24887:139;;24614:419;;;:::o;25039:::-;25205:4;25243:2;25232:9;25228:18;25220:26;;25292:9;25286:4;25282:20;25278:1;25267:9;25263:17;25256:47;25320:131;25446:4;25320:131;:::i;:::-;25312:139;;25039:419;;;:::o;25464:::-;25630:4;25668:2;25657:9;25653:18;25645:26;;25717:9;25711:4;25707:20;25703:1;25692:9;25688:17;25681:47;25745:131;25871:4;25745:131;:::i;:::-;25737:139;;25464:419;;;:::o;25889:::-;26055:4;26093:2;26082:9;26078:18;26070:26;;26142:9;26136:4;26132:20;26128:1;26117:9;26113:17;26106:47;26170:131;26296:4;26170:131;:::i;:::-;26162:139;;25889:419;;;:::o;26314:::-;26480:4;26518:2;26507:9;26503:18;26495:26;;26567:9;26561:4;26557:20;26553:1;26542:9;26538:17;26531:47;26595:131;26721:4;26595:131;:::i;:::-;26587:139;;26314:419;;;:::o;26739:::-;26905:4;26943:2;26932:9;26928:18;26920:26;;26992:9;26986:4;26982:20;26978:1;26967:9;26963:17;26956:47;27020:131;27146:4;27020:131;:::i;:::-;27012:139;;26739:419;;;:::o;27164:::-;27330:4;27368:2;27357:9;27353:18;27345:26;;27417:9;27411:4;27407:20;27403:1;27392:9;27388:17;27381:47;27445:131;27571:4;27445:131;:::i;:::-;27437:139;;27164:419;;;:::o;27589:::-;27755:4;27793:2;27782:9;27778:18;27770:26;;27842:9;27836:4;27832:20;27828:1;27817:9;27813:17;27806:47;27870:131;27996:4;27870:131;:::i;:::-;27862:139;;27589:419;;;:::o;28014:::-;28180:4;28218:2;28207:9;28203:18;28195:26;;28267:9;28261:4;28257:20;28253:1;28242:9;28238:17;28231:47;28295:131;28421:4;28295:131;:::i;:::-;28287:139;;28014:419;;;:::o;28439:::-;28605:4;28643:2;28632:9;28628:18;28620:26;;28692:9;28686:4;28682:20;28678:1;28667:9;28663:17;28656:47;28720:131;28846:4;28720:131;:::i;:::-;28712:139;;28439:419;;;:::o;28864:::-;29030:4;29068:2;29057:9;29053:18;29045:26;;29117:9;29111:4;29107:20;29103:1;29092:9;29088:17;29081:47;29145:131;29271:4;29145:131;:::i;:::-;29137:139;;28864:419;;;:::o;29289:::-;29455:4;29493:2;29482:9;29478:18;29470:26;;29542:9;29536:4;29532:20;29528:1;29517:9;29513:17;29506:47;29570:131;29696:4;29570:131;:::i;:::-;29562:139;;29289:419;;;:::o;29714:::-;29880:4;29918:2;29907:9;29903:18;29895:26;;29967:9;29961:4;29957:20;29953:1;29942:9;29938:17;29931:47;29995:131;30121:4;29995:131;:::i;:::-;29987:139;;29714:419;;;:::o;30139:::-;30305:4;30343:2;30332:9;30328:18;30320:26;;30392:9;30386:4;30382:20;30378:1;30367:9;30363:17;30356:47;30420:131;30546:4;30420:131;:::i;:::-;30412:139;;30139:419;;;:::o;30564:::-;30730:4;30768:2;30757:9;30753:18;30745:26;;30817:9;30811:4;30807:20;30803:1;30792:9;30788:17;30781:47;30845:131;30971:4;30845:131;:::i;:::-;30837:139;;30564:419;;;:::o;30989:::-;31155:4;31193:2;31182:9;31178:18;31170:26;;31242:9;31236:4;31232:20;31228:1;31217:9;31213:17;31206:47;31270:131;31396:4;31270:131;:::i;:::-;31262:139;;30989:419;;;:::o;31414:::-;31580:4;31618:2;31607:9;31603:18;31595:26;;31667:9;31661:4;31657:20;31653:1;31642:9;31638:17;31631:47;31695:131;31821:4;31695:131;:::i;:::-;31687:139;;31414:419;;;:::o;31839:::-;32005:4;32043:2;32032:9;32028:18;32020:26;;32092:9;32086:4;32082:20;32078:1;32067:9;32063:17;32056:47;32120:131;32246:4;32120:131;:::i;:::-;32112:139;;31839:419;;;:::o;32264:::-;32430:4;32468:2;32457:9;32453:18;32445:26;;32517:9;32511:4;32507:20;32503:1;32492:9;32488:17;32481:47;32545:131;32671:4;32545:131;:::i;:::-;32537:139;;32264:419;;;:::o;32689:::-;32855:4;32893:2;32882:9;32878:18;32870:26;;32942:9;32936:4;32932:20;32928:1;32917:9;32913:17;32906:47;32970:131;33096:4;32970:131;:::i;:::-;32962:139;;32689:419;;;:::o;33114:::-;33280:4;33318:2;33307:9;33303:18;33295:26;;33367:9;33361:4;33357:20;33353:1;33342:9;33338:17;33331:47;33395:131;33521:4;33395:131;:::i;:::-;33387:139;;33114:419;;;:::o;33539:::-;33705:4;33743:2;33732:9;33728:18;33720:26;;33792:9;33786:4;33782:20;33778:1;33767:9;33763:17;33756:47;33820:131;33946:4;33820:131;:::i;:::-;33812:139;;33539:419;;;:::o;33964:::-;34130:4;34168:2;34157:9;34153:18;34145:26;;34217:9;34211:4;34207:20;34203:1;34192:9;34188:17;34181:47;34245:131;34371:4;34245:131;:::i;:::-;34237:139;;33964:419;;;:::o;34389:::-;34555:4;34593:2;34582:9;34578:18;34570:26;;34642:9;34636:4;34632:20;34628:1;34617:9;34613:17;34606:47;34670:131;34796:4;34670:131;:::i;:::-;34662:139;;34389:419;;;:::o;34814:::-;34980:4;35018:2;35007:9;35003:18;34995:26;;35067:9;35061:4;35057:20;35053:1;35042:9;35038:17;35031:47;35095:131;35221:4;35095:131;:::i;:::-;35087:139;;34814:419;;;:::o;35239:::-;35405:4;35443:2;35432:9;35428:18;35420:26;;35492:9;35486:4;35482:20;35478:1;35467:9;35463:17;35456:47;35520:131;35646:4;35520:131;:::i;:::-;35512:139;;35239:419;;;:::o;35664:222::-;35757:4;35795:2;35784:9;35780:18;35772:26;;35808:71;35876:1;35865:9;35861:17;35852:6;35808:71;:::i;:::-;35664:222;;;;:::o;35892:129::-;35926:6;35953:20;;:::i;:::-;35943:30;;35982:33;36010:4;36002:6;35982:33;:::i;:::-;35892:129;;;:::o;36027:75::-;36060:6;36093:2;36087:9;36077:19;;36027:75;:::o;36108:307::-;36169:4;36259:18;36251:6;36248:30;36245:56;;;36281:18;;:::i;:::-;36245:56;36319:29;36341:6;36319:29;:::i;:::-;36311:37;;36403:4;36397;36393:15;36385:23;;36108:307;;;:::o;36421:98::-;36472:6;36506:5;36500:12;36490:22;;36421:98;;;:::o;36525:99::-;36577:6;36611:5;36605:12;36595:22;;36525:99;;;:::o;36630:168::-;36713:11;36747:6;36742:3;36735:19;36787:4;36782:3;36778:14;36763:29;;36630:168;;;;:::o;36804:147::-;36905:11;36942:3;36927:18;;36804:147;;;;:::o;36957:169::-;37041:11;37075:6;37070:3;37063:19;37115:4;37110:3;37106:14;37091:29;;36957:169;;;;:::o;37132:148::-;37234:11;37271:3;37256:18;;37132:148;;;;:::o;37286:305::-;37326:3;37345:20;37363:1;37345:20;:::i;:::-;37340:25;;37379:20;37397:1;37379:20;:::i;:::-;37374:25;;37533:1;37465:66;37461:74;37458:1;37455:81;37452:107;;;37539:18;;:::i;:::-;37452:107;37583:1;37580;37576:9;37569:16;;37286:305;;;;:::o;37597:185::-;37637:1;37654:20;37672:1;37654:20;:::i;:::-;37649:25;;37688:20;37706:1;37688:20;:::i;:::-;37683:25;;37727:1;37717:35;;37732:18;;:::i;:::-;37717:35;37774:1;37771;37767:9;37762:14;;37597:185;;;;:::o;37788:348::-;37828:7;37851:20;37869:1;37851:20;:::i;:::-;37846:25;;37885:20;37903:1;37885:20;:::i;:::-;37880:25;;38073:1;38005:66;38001:74;37998:1;37995:81;37990:1;37983:9;37976:17;37972:105;37969:131;;;38080:18;;:::i;:::-;37969:131;38128:1;38125;38121:9;38110:20;;37788:348;;;;:::o;38142:191::-;38182:4;38202:20;38220:1;38202:20;:::i;:::-;38197:25;;38236:20;38254:1;38236:20;:::i;:::-;38231:25;;38275:1;38272;38269:8;38266:34;;;38280:18;;:::i;:::-;38266:34;38325:1;38322;38318:9;38310:17;;38142:191;;;;:::o;38339:96::-;38376:7;38405:24;38423:5;38405:24;:::i;:::-;38394:35;;38339:96;;;:::o;38441:90::-;38475:7;38518:5;38511:13;38504:21;38493:32;;38441:90;;;:::o;38537:149::-;38573:7;38613:66;38606:5;38602:78;38591:89;;38537:149;;;:::o;38692:126::-;38729:7;38769:42;38762:5;38758:54;38747:65;;38692:126;;;:::o;38824:77::-;38861:7;38890:5;38879:16;;38824:77;;;:::o;38907:154::-;38991:6;38986:3;38981;38968:30;39053:1;39044:6;39039:3;39035:16;39028:27;38907:154;;;:::o;39067:307::-;39135:1;39145:113;39159:6;39156:1;39153:13;39145:113;;;39244:1;39239:3;39235:11;39229:18;39225:1;39220:3;39216:11;39209:39;39181:2;39178:1;39174:10;39169:15;;39145:113;;;39276:6;39273:1;39270:13;39267:101;;;39356:1;39347:6;39342:3;39338:16;39331:27;39267:101;39116:258;39067:307;;;:::o;39380:320::-;39424:6;39461:1;39455:4;39451:12;39441:22;;39508:1;39502:4;39498:12;39529:18;39519:81;;39585:4;39577:6;39573:17;39563:27;;39519:81;39647:2;39639:6;39636:14;39616:18;39613:38;39610:84;;;39666:18;;:::i;:::-;39610:84;39431:269;39380:320;;;:::o;39706:281::-;39789:27;39811:4;39789:27;:::i;:::-;39781:6;39777:40;39919:6;39907:10;39904:22;39883:18;39871:10;39868:34;39865:62;39862:88;;;39930:18;;:::i;:::-;39862:88;39970:10;39966:2;39959:22;39749:238;39706:281;;:::o;39993:233::-;40032:3;40055:24;40073:5;40055:24;:::i;:::-;40046:33;;40101:66;40094:5;40091:77;40088:103;;;40171:18;;:::i;:::-;40088:103;40218:1;40211:5;40207:13;40200:20;;39993:233;;;:::o;40232:176::-;40264:1;40281:20;40299:1;40281:20;:::i;:::-;40276:25;;40315:20;40333:1;40315:20;:::i;:::-;40310:25;;40354:1;40344:35;;40359:18;;:::i;:::-;40344:35;40400:1;40397;40393:9;40388:14;;40232:176;;;;:::o;40414:180::-;40462:77;40459:1;40452:88;40559:4;40556:1;40549:15;40583:4;40580:1;40573:15;40600:180;40648:77;40645:1;40638:88;40745:4;40742:1;40735:15;40769:4;40766:1;40759:15;40786:180;40834:77;40831:1;40824:88;40931:4;40928:1;40921:15;40955:4;40952:1;40945:15;40972:180;41020:77;41017:1;41010:88;41117:4;41114:1;41107:15;41141:4;41138:1;41131:15;41158:180;41206:77;41203:1;41196:88;41303:4;41300:1;41293:15;41327:4;41324:1;41317:15;41344:117;41453:1;41450;41443:12;41467:117;41576:1;41573;41566:12;41590:117;41699:1;41696;41689:12;41713:117;41822:1;41819;41812:12;41836:117;41945:1;41942;41935:12;41959:117;42068:1;42065;42058:12;42082:102;42123:6;42174:2;42170:7;42165:2;42158:5;42154:14;42150:28;42140:38;;42082:102;;;:::o;42190:180::-;42330:32;42326:1;42318:6;42314:14;42307:56;42190:180;:::o;42376:244::-;42516:34;42512:1;42504:6;42500:14;42493:58;42585:27;42580:2;42572:6;42568:15;42561:52;42376:244;:::o;42626:225::-;42766:34;42762:1;42754:6;42750:14;42743:58;42835:8;42830:2;42822:6;42818:15;42811:33;42626:225;:::o;42857:229::-;42997:34;42993:1;42985:6;42981:14;42974:58;43066:12;43061:2;43053:6;43049:15;43042:37;42857:229;:::o;43092:244::-;43232:34;43228:1;43220:6;43216:14;43209:58;43301:27;43296:2;43288:6;43284:15;43277:52;43092:244;:::o;43342:223::-;43482:34;43478:1;43470:6;43466:14;43459:58;43551:6;43546:2;43538:6;43534:15;43527:31;43342:223;:::o;43571:224::-;43711:34;43707:1;43699:6;43695:14;43688:58;43780:7;43775:2;43767:6;43763:15;43756:32;43571:224;:::o;43801:236::-;43941:34;43937:1;43929:6;43925:14;43918:58;44010:19;44005:2;43997:6;43993:15;43986:44;43801:236;:::o;44043:230::-;44183:34;44179:1;44171:6;44167:14;44160:58;44252:13;44247:2;44239:6;44235:15;44228:38;44043:230;:::o;44279:168::-;44419:20;44415:1;44407:6;44403:14;44396:44;44279:168;:::o;44453:244::-;44593:34;44589:1;44581:6;44577:14;44570:58;44662:27;44657:2;44649:6;44645:15;44638:52;44453:244;:::o;44703:230::-;44843:34;44839:1;44831:6;44827:14;44820:58;44912:13;44907:2;44899:6;44895:15;44888:38;44703:230;:::o;44939:225::-;45079:34;45075:1;45067:6;45063:14;45056:58;45148:8;45143:2;45135:6;45131:15;45124:33;44939:225;:::o;45170:155::-;45310:7;45306:1;45298:6;45294:14;45287:31;45170:155;:::o;45331:182::-;45471:34;45467:1;45459:6;45455:14;45448:58;45331:182;:::o;45519:234::-;45659:34;45655:1;45647:6;45643:14;45636:58;45728:17;45723:2;45715:6;45711:15;45704:42;45519:234;:::o;45759:176::-;45899:28;45895:1;45887:6;45883:14;45876:52;45759:176;:::o;45941:237::-;46081:34;46077:1;46069:6;46065:14;46058:58;46150:20;46145:2;46137:6;46133:15;46126:45;45941:237;:::o;46184:221::-;46324:34;46320:1;46312:6;46308:14;46301:58;46393:4;46388:2;46380:6;46376:15;46369:29;46184:221;:::o;46411:114::-;;:::o;46531:166::-;46671:18;46667:1;46659:6;46655:14;46648:42;46531:166;:::o;46703:238::-;46843:34;46839:1;46831:6;46827:14;46820:58;46912:21;46907:2;46899:6;46895:15;46888:46;46703:238;:::o;46947:220::-;47087:34;47083:1;47075:6;47071:14;47064:58;47156:3;47151:2;47143:6;47139:15;47132:28;46947:220;:::o;47173:227::-;47313:34;47309:1;47301:6;47297:14;47290:58;47382:10;47377:2;47369:6;47365:15;47358:35;47173:227;:::o;47406:178::-;47546:30;47542:1;47534:6;47530:14;47523:54;47406:178;:::o;47590:181::-;47730:33;47726:1;47718:6;47714:14;47707:57;47590:181;:::o;47777:234::-;47917:34;47913:1;47905:6;47901:14;47894:58;47986:17;47981:2;47973:6;47969:15;47962:42;47777:234;:::o;48017:232::-;48157:34;48153:1;48145:6;48141:14;48134:58;48226:15;48221:2;48213:6;48209:15;48202:40;48017:232;:::o;48255:234::-;48395:34;48391:1;48383:6;48379:14;48372:58;48464:17;48459:2;48451:6;48447:15;48440:42;48255:234;:::o;48495:182::-;48635:34;48631:1;48623:6;48619:14;48612:58;48495:182;:::o;48683:122::-;48756:24;48774:5;48756:24;:::i;:::-;48749:5;48746:35;48736:63;;48795:1;48792;48785:12;48736:63;48683:122;:::o;48811:116::-;48881:21;48896:5;48881:21;:::i;:::-;48874:5;48871:32;48861:60;;48917:1;48914;48907:12;48861:60;48811:116;:::o;48933:120::-;49005:23;49022:5;49005:23;:::i;:::-;48998:5;48995:34;48985:62;;49043:1;49040;49033:12;48985:62;48933:120;:::o;49059:122::-;49132:24;49150:5;49132:24;:::i;:::-;49125:5;49122:35;49112:63;;49171:1;49168;49161:12;49112:63;49059:122;:::o

Swarm Source

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