ETH Price: $3,448.35 (+1.46%)

Token

CosaMonstraBoss (CMB)
 

Overview

Max Total Supply

1,322 CMB

Holders

424

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
iwannabee.eth
Balance
4 CMB
0xdf1fa21aad71c50e642fca3aa4332da17bbea409
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:
CosaMonstraBoss

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// File: contracts/cityboss.sol

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

// File: @openzeppelin/contracts/utils/Strings.sol
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    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;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _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);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @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 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}




pragma solidity >=0.8.9 <0.9.0;




contract CosaMonstraBoss is Ownable, ERC721A {
    
    
    uint public totalMinted = 0;
    string public baseURI;
    uint public maxPerTransaction = 500;  
    uint public collectionSize = 1322;
    address private com = 0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9;
    

    constructor() ERC721A("CosaMonstraBoss", "CMB"){
        

        // mint first to company
        _safeMint(0x439fCAe2ac5020c64a14DA26D1277F4C0BD53dE9,1);
        totalMinted +=1;
    }


    // airdrop boss to multiple wallets 
    function airdrop(address[] memory _wallets) public onlyOwner{
        
        require(_wallets.length <= maxPerTransaction, "Max per transaction limit reached");
        require(totalMinted +  _wallets.length  <= collectionSize, "not enough tokens left");
        for(uint i = 0; i < _wallets.length; i++){
            _safeMint(_wallets[i], 1);
            totalMinted += 1;
        }
            
    }
    
    // airdrop to one wallet
    function airdropToWallet(address  wallet, uint count) public onlyOwner{
        require(count > 0, "mint at least one token");
        require(count <= maxPerTransaction, "Max per transaction limit reached");
        require(totalMinted +  count  <= collectionSize, "not enough tokens left");
        _safeMint(wallet, count);
        totalMinted += count;
    }  
    
    //burn boss
    function burn(uint tokenId) public {
        require(_msgSender() == ownerOf(tokenId), "Caller is not owner nor approved");
        _burn(tokenId);
        totalMinted -=1;
    }

    //burn boss by big boss
    function burnByBoss(uint tokenId) public onlyOwner{
        _burn(tokenId);
        totalMinted -=1;
    }

    // set per transaction token limit
    function setTransactionLimit(uint _limit) external onlyOwner{
        maxPerTransaction = _limit;
    }

    // get per transaction token limit
    function getTransactionLimit() public view returns(uint){
        return maxPerTransaction;
    }

    
    // set collection supply
    function setCollectionSize(uint supply) external onlyOwner {
        collectionSize = supply;
    }

    // get collection supply
    function getCollectionSize() public view returns(uint){
        return collectionSize;
    }

    // set base URI
    function setBaseUri(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

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

    function setCOMWallet(address adrs) external onlyOwner{
        com = adrs;
    }

    // take out
    function withdraw() external onlyOwner {
        payable(com).transfer(address(this).balance); 
    }
    
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdropToWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnByBoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectionSize","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":"getCollectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","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":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"address","name":"adrs","type":"address"}],"name":"setCOMWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setCollectionSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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"}]

608060405260006009556101f4600b5561052a600c5573439fcae2ac5020c64a14da26d1277f4c0bd53de9600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007757600080fd5b506040518060400160405280600f81526020017f436f73614d6f6e73747261426f737300000000000000000000000000000000008152506040518060400160405280600381526020017f434d42000000000000000000000000000000000000000000000000000000000081525062000104620000f86200019760201b60201c565b6200019f60201b60201c565b81600390805190602001906200011c92919062000846565b5080600490805190602001906200013592919062000846565b50620001466200026360201b60201c565b60018190555050506200017573439fcae2ac5020c64a14da26d1277f4c0bd53de960016200026860201b60201c565b6001600960008282546200018a91906200092f565b9250508190555062000bd3565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b6200028a8282604051806020016040528060008152506200028e60201b60201c565b5050565b620002a38383836001620002a860201b60201c565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000317576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000353576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003686000868387620006a560201b60201c565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200054057506200053f8773ffffffffffffffffffffffffffffffffffffffff16620006ab60201b620016cd1760201c565b5b1562000613575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620005be6000888480600101955088620006ce60201b60201c565b620005f5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415620005475782600154146200060d57600080fd5b62000680565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000614575b8160018190555050506200069e60008683876200084060201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006fc6200019760201b60201c565b8786866040518563ffffffff1660e01b815260040162000720949392919062000a86565b602060405180830381600087803b1580156200073b57600080fd5b505af19250505080156200076f57506040513d601f19601f820116820180604052508101906200076c919062000b3c565b60015b620007ed573d8060008114620007a2576040519150601f19603f3d011682016040523d82523d6000602084013e620007a7565b606091505b50600081511415620007e5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620008549062000b9d565b90600052602060002090601f016020900481019282620008785760008555620008c4565b82601f106200089357805160ff1916838001178555620008c4565b82800160010185558215620008c4579182015b82811115620008c3578251825591602001919060010190620008a6565b5b509050620008d39190620008d7565b5090565b5b80821115620008f2576000816000905550600101620008d8565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200093c82620008f6565b91506200094983620008f6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000981576200098062000900565b5b828201905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009b9826200098c565b9050919050565b620009cb81620009ac565b82525050565b620009dc81620008f6565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000a1e57808201518184015260208101905062000a01565b8381111562000a2e576000848401525b50505050565b6000601f19601f8301169050919050565b600062000a5282620009e2565b62000a5e8185620009ed565b935062000a70818560208601620009fe565b62000a7b8162000a34565b840191505092915050565b600060808201905062000a9d6000830187620009c0565b62000aac6020830186620009c0565b62000abb6040830185620009d1565b818103606083015262000acf818462000a45565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000b168162000adf565b811462000b2257600080fd5b50565b60008151905062000b368162000b0b565b92915050565b60006020828403121562000b555762000b5462000ada565b5b600062000b658482850162000b25565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bb657607f821691505b6020821081141562000bcd5762000bcc62000b6e565b5b50919050565b613bc28062000be36000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612e00565b6105dd565b60405161021c9190612e48565b60405180910390f35b61022d6105ef565b60405161023a9190612efc565b60405180910390f35b61025d60048036038101906102589190612f54565b610681565b60405161026a9190612fc2565b60405180910390f35b61028d60048036038101906102889190613009565b6106fd565b005b6102a960048036038101906102a49190612f54565b610808565b005b6102b36108aa565b6040516102c09190613058565b60405180910390f35b6102e360048036038101906102de9190613073565b6108c1565b005b6102ff60048036038101906102fa9190613009565b6108d1565b005b610309610a4e565b005b61032560048036038101906103209190613073565b610b35565b005b610341600480360381019061033c9190612f54565b610b55565b005b61034b610bf8565b6040516103589190613058565b60405180910390f35b610369610bfe565b6040516103769190613058565b60405180910390f35b61039960048036038101906103949190612f54565b610c04565b6040516103a69190612fc2565b60405180910390f35b6103c960048036038101906103c49190612f54565b610c1a565b005b6103d3610ca0565b6040516103e09190612efc565b60405180910390f35b61040360048036038101906103fe91906130c6565b610d2e565b6040516104109190613058565b60405180910390f35b610421610dfe565b005b61042b610e86565b6040516104389190613058565b60405180910390f35b61045b6004803603810190610456919061323b565b610e90565b005b610465611007565b6040516104729190612fc2565b60405180910390f35b610483611030565b6040516104909190612efc565b60405180910390f35b6104b360048036038101906104ae9190613339565b6110c2565b005b6104cf60048036038101906104ca91906133ae565b611158565b005b6104d96112d0565b6040516104e69190613058565b60405180910390f35b61050960048036038101906105049190612f54565b6112d6565b005b6105256004803603810190610520919061348f565b61135c565b005b61052f6113d8565b60405161053c9190613058565b60405180910390f35b61055f600480360381019061055a9190612f54565b6113e2565b60405161056c9190612efc565b60405180910390f35b61058f600480360381019061058a91906130c6565b611481565b005b6105ab60048036038101906105a69190613512565b611541565b6040516105b89190612e48565b60405180910390f35b6105db60048036038101906105d691906130c6565b6115d5565b005b60006105e8826116f0565b9050919050565b6060600380546105fe90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90613581565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117d2565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c04565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610770576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078f611820565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c157506107bf816107ba611820565b611541565b155b156107f8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610803838383611828565b505050565b610810611820565b73ffffffffffffffffffffffffffffffffffffffff1661082e611007565b73ffffffffffffffffffffffffffffffffffffffff1614610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906135ff565b60405180910390fd5b61088d816118da565b6001600960008282546108a0919061364e565b9250508190555050565b60006108b46118e8565b6002546001540303905090565b6108cc8383836118ed565b505050565b6108d9611820565b73ffffffffffffffffffffffffffffffffffffffff166108f7611007565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610944906135ff565b60405180910390fd5b60008111610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906136ce565b60405180910390fd5b600b548111156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613760565b60405180910390fd5b600c54816009546109e69190613780565b1115610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613822565b60405180910390fd5b610a318282611da3565b8060096000828254610a439190613780565b925050819055505050565b610a56611820565b73ffffffffffffffffffffffffffffffffffffffff16610a74611007565b73ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906135ff565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b32573d6000803e3d6000fd5b50565b610b508383836040518060200160405280600081525061135c565b505050565b610b5e81610c04565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611820565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061388e565b60405180910390fd5b610bdb816118da565b600160096000828254610bee919061364e565b9250508190555050565b600c5481565b600b5481565b6000610c0f82611dc1565b600001519050919050565b610c22611820565b73ffffffffffffffffffffffffffffffffffffffff16610c40611007565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906135ff565b60405180910390fd5b80600b8190555050565b600a8054610cad90613581565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd990613581565b8015610d265780601f10610cfb57610100808354040283529160200191610d26565b820191906000526020600020905b815481529060010190602001808311610d0957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e06611820565b73ffffffffffffffffffffffffffffffffffffffff16610e24611007565b73ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906135ff565b60405180910390fd5b610e846000612050565b565b6000600c54905090565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611007565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906135ff565b60405180910390fd5b600b5481511115610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613760565b60405180910390fd5b600c548151600954610f649190613780565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613822565b60405180910390fd5b60005b815181101561100357610fd6828281518110610fc757610fc66138ae565b5b60200260200101516001611da3565b600160096000828254610fe99190613780565b925050819055508080610ffb906138dd565b915050610fa8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103f90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613581565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050905090565b6110ca611820565b73ffffffffffffffffffffffffffffffffffffffff166110e8611007565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906135ff565b60405180910390fd5b80600a9080519060200190611154929190612cae565b5050565b611160611820565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111d2611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661127f611820565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c49190612e48565b60405180910390a35050565b60095481565b6112de611820565b73ffffffffffffffffffffffffffffffffffffffff166112fc611007565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906135ff565b60405180910390fd5b80600c8190555050565b6113678484846118ed565b6113868373ffffffffffffffffffffffffffffffffffffffff166116cd565b801561139b575061139984848484612114565b155b156113d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113ed826117d2565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d612274565b905060008151141561144e5760405180602001604052806000815250611479565b8061145884612306565b604051602001611469929190613962565b6040516020818303038152906040525b915050919050565b611489611820565b73ffffffffffffffffffffffffffffffffffffffff166114a7611007565b73ffffffffffffffffffffffffffffffffffffffff16146114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f4906135ff565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115dd611820565b73ffffffffffffffffffffffffffffffffffffffff166115fb611007565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906135ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906139f8565b60405180910390fd5b6116ca81612050565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117cb57506117ca82612467565b5b9050919050565b6000816117dd6118e8565b111580156117ec575060015482105b8015611819575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118e58160006124d1565b50565b600090565b60006118f882611dc1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611963576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611984611820565b73ffffffffffffffffffffffffffffffffffffffff1614806119b357506119b2856119ad611820565b611541565b5b806119f857506119c1611820565b73ffffffffffffffffffffffffffffffffffffffff166119e084610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa585858560016128c1565b611ab160008487611828565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d31576001548214611d3057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9c85858560016128c7565b5050505050565b611dbd8282604051806020016040528060008152506128cd565b5050565b611dc9612d34565b600082905080611dd76118e8565b11158015611de6575060015481105b15612019576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611efb57809250505061204b565b5b60011561201657818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201157809250505061204b565b611efc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213a611820565b8786866040518563ffffffff1660e01b815260040161215c9493929190613a6d565b602060405180830381600087803b15801561217657600080fd5b505af19250505080156121a757506040513d601f19601f820116820180604052508101906121a49190613ace565b60015b612221573d80600081146121d7576040519150601f19603f3d011682016040523d82523d6000602084013e6121dc565b606091505b50600081511415612219576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461228390613581565b80601f01602080910402602001604051908101604052809291908181526020018280546122af90613581565b80156122fc5780601f106122d1576101008083540402835291602001916122fc565b820191906000526020600020905b8154815290600101906020018083116122df57829003601f168201915b5050505050905090565b6060600082141561234e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612462565b600082905060005b60008214612380578080612369906138dd565b915050600a826123799190613b2a565b9150612356565b60008167ffffffffffffffff81111561239c5761239b6130f8565b5b6040519080825280601f01601f1916602001820160405280156123ce5781602001600182028036833780820191505090505b5090505b6000851461245b576001826123e7919061364e565b9150600a856123f69190613b5b565b60306124029190613780565b60f81b818381518110612418576124176138ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124549190613b2a565b94506123d2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124dc83611dc1565b905060008160000151905082156125bd5760008173ffffffffffffffffffffffffffffffffffffffff1661250e611820565b73ffffffffffffffffffffffffffffffffffffffff16148061253d575061253c82612537611820565b611541565b5b80612582575061254b611820565b73ffffffffffffffffffffffffffffffffffffffff1661256a86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125cb8160008660016128c1565b6125d760008583611828565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561283b57600154821461283a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a98160008660016128c7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128da83838360016128df565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561294d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612988576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299560008683876128c1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b5f5750612b5e8773ffffffffffffffffffffffffffffffffffffffff166116cd565b5b15612c25575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000888480600101955088612114565b612c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b65578260015414612c2057600080fd5b612c91565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c26575b816001819055505050612ca760008683876128c7565b5050505050565b828054612cba90613581565b90600052602060002090601f016020900481019282612cdc5760008555612d23565b82601f10612cf557805160ff1916838001178555612d23565b82800160010185558215612d23579182015b82811115612d22578251825591602001919060010190612d07565b5b509050612d309190612d77565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d90576000816000905550600101612d78565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ddd81612da8565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600060208284031215612e1657612e15612d9e565b5b6000612e2484828501612deb565b91505092915050565b60008115159050919050565b612e4281612e2d565b82525050565b6000602082019050612e5d6000830184612e39565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9d578082015181840152602081019050612e82565b83811115612eac576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ece82612e63565b612ed88185612e6e565b9350612ee8818560208601612e7f565b612ef181612eb2565b840191505092915050565b60006020820190508181036000830152612f168184612ec3565b905092915050565b6000819050919050565b612f3181612f1e565b8114612f3c57600080fd5b50565b600081359050612f4e81612f28565b92915050565b600060208284031215612f6a57612f69612d9e565b5b6000612f7884828501612f3f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fac82612f81565b9050919050565b612fbc81612fa1565b82525050565b6000602082019050612fd76000830184612fb3565b92915050565b612fe681612fa1565b8114612ff157600080fd5b50565b60008135905061300381612fdd565b92915050565b600080604083850312156130205761301f612d9e565b5b600061302e85828601612ff4565b925050602061303f85828601612f3f565b9150509250929050565b61305281612f1e565b82525050565b600060208201905061306d6000830184613049565b92915050565b60008060006060848603121561308c5761308b612d9e565b5b600061309a86828701612ff4565b93505060206130ab86828701612ff4565b92505060406130bc86828701612f3f565b9150509250925092565b6000602082840312156130dc576130db612d9e565b5b60006130ea84828501612ff4565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313082612eb2565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612d94565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b602082029050602081019050919050565b600080fd5b60006131b76131b284613173565b613158565b905080838252602082019050602084028301858111156131da576131d961319f565b5b835b8181101561320357806131ef8882612ff4565b8452602084019350506020810190506131dc565b5050509392505050565b600082601f830112613222576132216130f3565b5b81356132328482602086016131a4565b91505092915050565b60006020828403121561325157613250612d9e565b5b600082013567ffffffffffffffff81111561326f5761326e612da3565b5b61327b8482850161320d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156132a4576132a36130f8565b5b6132ad82612eb2565b9050602081019050919050565b82818337600083830152505050565b60006132dc6132d784613289565b613158565b9050828152602081018484840111156132f8576132f7613284565b5b6133038482856132ba565b509392505050565b600082601f8301126133205761331f6130f3565b5b81356133308482602086016132c9565b91505092915050565b60006020828403121561334f5761334e612d9e565b5b600082013567ffffffffffffffff81111561336d5761336c612da3565b5b6133798482850161330b565b91505092915050565b61338b81612e2d565b811461339657600080fd5b50565b6000813590506133a881613382565b92915050565b600080604083850312156133c5576133c4612d9e565b5b60006133d385828601612ff4565b92505060206133e485828601613399565b9150509250929050565b600067ffffffffffffffff821115613409576134086130f8565b5b61341282612eb2565b9050602081019050919050565b600061343261342d846133ee565b613158565b90508281526020810184848401111561344e5761344d613284565b5b6134598482856132ba565b509392505050565b600082601f830112613476576134756130f3565b5b813561348684826020860161341f565b91505092915050565b600080600080608085870312156134a9576134a8612d9e565b5b60006134b787828801612ff4565b94505060206134c887828801612ff4565b93505060406134d987828801612f3f565b925050606085013567ffffffffffffffff8111156134fa576134f9612da3565b5b61350687828801613461565b91505092959194509250565b6000806040838503121561352957613528612d9e565b5b600061353785828601612ff4565b925050602061354885828601612ff4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359957607f821691505b602082108114156135ad576135ac613552565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e9602083612e6e565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365982612f1e565b915061366483612f1e565b9250828210156136775761367661361f565b5b828203905092915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006136b8601783612e6e565b91506136c382613682565b602082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602183612e6e565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612f1e565b915061379683612f1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137cb576137ca61361f565b5b828201905092915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b600061380c601683612e6e565b9150613817826137d6565b602082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000613878602083612e6e565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138e882612f1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391b5761391a61361f565b5b600182019050919050565b600081905092915050565b600061393c82612e63565b6139468185613926565b9350613956818560208601612e7f565b80840191505092915050565b600061396e8285613931565b915061397a8284613931565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139e2602683612e6e565b91506139ed82613986565b604082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a3f82613a18565b613a498185613a23565b9350613a59818560208601612e7f565b613a6281612eb2565b840191505092915050565b6000608082019050613a826000830187612fb3565b613a8f6020830186612fb3565b613a9c6040830185613049565b8181036060830152613aae8184613a34565b905095945050505050565b600081519050613ac881612dd4565b92915050565b600060208284031215613ae457613ae3612d9e565b5b6000613af284828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b3582612f1e565b9150613b4083612f1e565b925082613b5057613b4f613afb565b5b828204905092915050565b6000613b6682612f1e565b9150613b7183612f1e565b925082613b8157613b80613afb565b5b82820690509291505056fea26469706673582212203b50bebd41b87cffaebad11c251cc58b1aaac70995303ae646ecdf8f6ce4f43b64736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063a2309ff8116100a2578063c87b56dd11610071578063c87b56dd14610545578063da47f76714610575578063e985e9c514610591578063f2fde38b146105c1576101f0565b8063a2309ff8146104d1578063aca8ffe7146104ef578063b88d4fde1461050b578063c3743cff14610527576101f0565b80638da5cb5b116100de5780638da5cb5b1461045d57806395d89b411461047b578063a0bcfc7f14610499578063a22cb465146104b5576101f0565b806370a08231146103e9578063715018a6146104195780637155c1ea14610423578063729ad39e14610441576101f0565b80633ccfd60b116101875780634b980d67116101565780634b980d67146103615780636352211e1461037f57806364bfa546146103af5780636c0360eb146103cb576101f0565b80633ccfd60b1461030157806342842e0e1461030b57806342966c681461032757806345c0f53314610343576101f0565b80630c6ea51c116101c35780630c6ea51c1461028f57806318160ddd146102ab57806323b872dd146102c957806323d98917146102e5576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612e00565b6105dd565b60405161021c9190612e48565b60405180910390f35b61022d6105ef565b60405161023a9190612efc565b60405180910390f35b61025d60048036038101906102589190612f54565b610681565b60405161026a9190612fc2565b60405180910390f35b61028d60048036038101906102889190613009565b6106fd565b005b6102a960048036038101906102a49190612f54565b610808565b005b6102b36108aa565b6040516102c09190613058565b60405180910390f35b6102e360048036038101906102de9190613073565b6108c1565b005b6102ff60048036038101906102fa9190613009565b6108d1565b005b610309610a4e565b005b61032560048036038101906103209190613073565b610b35565b005b610341600480360381019061033c9190612f54565b610b55565b005b61034b610bf8565b6040516103589190613058565b60405180910390f35b610369610bfe565b6040516103769190613058565b60405180910390f35b61039960048036038101906103949190612f54565b610c04565b6040516103a69190612fc2565b60405180910390f35b6103c960048036038101906103c49190612f54565b610c1a565b005b6103d3610ca0565b6040516103e09190612efc565b60405180910390f35b61040360048036038101906103fe91906130c6565b610d2e565b6040516104109190613058565b60405180910390f35b610421610dfe565b005b61042b610e86565b6040516104389190613058565b60405180910390f35b61045b6004803603810190610456919061323b565b610e90565b005b610465611007565b6040516104729190612fc2565b60405180910390f35b610483611030565b6040516104909190612efc565b60405180910390f35b6104b360048036038101906104ae9190613339565b6110c2565b005b6104cf60048036038101906104ca91906133ae565b611158565b005b6104d96112d0565b6040516104e69190613058565b60405180910390f35b61050960048036038101906105049190612f54565b6112d6565b005b6105256004803603810190610520919061348f565b61135c565b005b61052f6113d8565b60405161053c9190613058565b60405180910390f35b61055f600480360381019061055a9190612f54565b6113e2565b60405161056c9190612efc565b60405180910390f35b61058f600480360381019061058a91906130c6565b611481565b005b6105ab60048036038101906105a69190613512565b611541565b6040516105b89190612e48565b60405180910390f35b6105db60048036038101906105d691906130c6565b6115d5565b005b60006105e8826116f0565b9050919050565b6060600380546105fe90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461062a90613581565b80156106775780601f1061064c57610100808354040283529160200191610677565b820191906000526020600020905b81548152906001019060200180831161065a57829003601f168201915b5050505050905090565b600061068c826117d2565b6106c2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070882610c04565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610770576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661078f611820565b73ffffffffffffffffffffffffffffffffffffffff16141580156107c157506107bf816107ba611820565b611541565b155b156107f8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610803838383611828565b505050565b610810611820565b73ffffffffffffffffffffffffffffffffffffffff1661082e611007565b73ffffffffffffffffffffffffffffffffffffffff1614610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087b906135ff565b60405180910390fd5b61088d816118da565b6001600960008282546108a0919061364e565b9250508190555050565b60006108b46118e8565b6002546001540303905090565b6108cc8383836118ed565b505050565b6108d9611820565b73ffffffffffffffffffffffffffffffffffffffff166108f7611007565b73ffffffffffffffffffffffffffffffffffffffff161461094d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610944906135ff565b60405180910390fd5b60008111610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906136ce565b60405180910390fd5b600b548111156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cc90613760565b60405180910390fd5b600c54816009546109e69190613780565b1115610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90613822565b60405180910390fd5b610a318282611da3565b8060096000828254610a439190613780565b925050819055505050565b610a56611820565b73ffffffffffffffffffffffffffffffffffffffff16610a74611007565b73ffffffffffffffffffffffffffffffffffffffff1614610aca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac1906135ff565b60405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b32573d6000803e3d6000fd5b50565b610b508383836040518060200160405280600081525061135c565b505050565b610b5e81610c04565b73ffffffffffffffffffffffffffffffffffffffff16610b7c611820565b73ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc99061388e565b60405180910390fd5b610bdb816118da565b600160096000828254610bee919061364e565b9250508190555050565b600c5481565b600b5481565b6000610c0f82611dc1565b600001519050919050565b610c22611820565b73ffffffffffffffffffffffffffffffffffffffff16610c40611007565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906135ff565b60405180910390fd5b80600b8190555050565b600a8054610cad90613581565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd990613581565b8015610d265780601f10610cfb57610100808354040283529160200191610d26565b820191906000526020600020905b815481529060010190602001808311610d0957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d96576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e06611820565b73ffffffffffffffffffffffffffffffffffffffff16610e24611007565b73ffffffffffffffffffffffffffffffffffffffff1614610e7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e71906135ff565b60405180910390fd5b610e846000612050565b565b6000600c54905090565b610e98611820565b73ffffffffffffffffffffffffffffffffffffffff16610eb6611007565b73ffffffffffffffffffffffffffffffffffffffff1614610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f03906135ff565b60405180910390fd5b600b5481511115610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4990613760565b60405180910390fd5b600c548151600954610f649190613780565b1115610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613822565b60405180910390fd5b60005b815181101561100357610fd6828281518110610fc757610fc66138ae565b5b60200260200101516001611da3565b600160096000828254610fe99190613780565b925050819055508080610ffb906138dd565b915050610fa8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461103f90613581565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613581565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b5050505050905090565b6110ca611820565b73ffffffffffffffffffffffffffffffffffffffff166110e8611007565b73ffffffffffffffffffffffffffffffffffffffff161461113e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611135906135ff565b60405180910390fd5b80600a9080519060200190611154929190612cae565b5050565b611160611820565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c5576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006111d2611820565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661127f611820565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112c49190612e48565b60405180910390a35050565b60095481565b6112de611820565b73ffffffffffffffffffffffffffffffffffffffff166112fc611007565b73ffffffffffffffffffffffffffffffffffffffff1614611352576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611349906135ff565b60405180910390fd5b80600c8190555050565b6113678484846118ed565b6113868373ffffffffffffffffffffffffffffffffffffffff166116cd565b801561139b575061139984848484612114565b155b156113d2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000600b54905090565b60606113ed826117d2565b611423576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061142d612274565b905060008151141561144e5760405180602001604052806000815250611479565b8061145884612306565b604051602001611469929190613962565b6040516020818303038152906040525b915050919050565b611489611820565b73ffffffffffffffffffffffffffffffffffffffff166114a7611007565b73ffffffffffffffffffffffffffffffffffffffff16146114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f4906135ff565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115dd611820565b73ffffffffffffffffffffffffffffffffffffffff166115fb611007565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611648906135ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906139f8565b60405180910390fd5b6116ca81612050565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117bb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117cb57506117ca82612467565b5b9050919050565b6000816117dd6118e8565b111580156117ec575060015482105b8015611819575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6118e58160006124d1565b50565b600090565b60006118f882611dc1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611963576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611984611820565b73ffffffffffffffffffffffffffffffffffffffff1614806119b357506119b2856119ad611820565b611541565b5b806119f857506119c1611820565b73ffffffffffffffffffffffffffffffffffffffff166119e084610681565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a31576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611a98576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa585858560016128c1565b611ab160008487611828565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d31576001548214611d3057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d9c85858560016128c7565b5050505050565b611dbd8282604051806020016040528060008152506128cd565b5050565b611dc9612d34565b600082905080611dd76118e8565b11158015611de6575060015481105b15612019576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161201757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611efb57809250505061204b565b5b60011561201657818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461201157809250505061204b565b611efc565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213a611820565b8786866040518563ffffffff1660e01b815260040161215c9493929190613a6d565b602060405180830381600087803b15801561217657600080fd5b505af19250505080156121a757506040513d601f19601f820116820180604052508101906121a49190613ace565b60015b612221573d80600081146121d7576040519150601f19603f3d011682016040523d82523d6000602084013e6121dc565b606091505b50600081511415612219576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461228390613581565b80601f01602080910402602001604051908101604052809291908181526020018280546122af90613581565b80156122fc5780601f106122d1576101008083540402835291602001916122fc565b820191906000526020600020905b8154815290600101906020018083116122df57829003601f168201915b5050505050905090565b6060600082141561234e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612462565b600082905060005b60008214612380578080612369906138dd565b915050600a826123799190613b2a565b9150612356565b60008167ffffffffffffffff81111561239c5761239b6130f8565b5b6040519080825280601f01601f1916602001820160405280156123ce5781602001600182028036833780820191505090505b5090505b6000851461245b576001826123e7919061364e565b9150600a856123f69190613b5b565b60306124029190613780565b60f81b818381518110612418576124176138ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124549190613b2a565b94506123d2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006124dc83611dc1565b905060008160000151905082156125bd5760008173ffffffffffffffffffffffffffffffffffffffff1661250e611820565b73ffffffffffffffffffffffffffffffffffffffff16148061253d575061253c82612537611820565b611541565b5b80612582575061254b611820565b73ffffffffffffffffffffffffffffffffffffffff1661256a86610681565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806125bb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b6125cb8160008660016128c1565b6125d760008583611828565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561283b57600154821461283a57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128a98160008660016128c7565b60026000815480929190600101919050555050505050565b50505050565b50505050565b6128da83838360016128df565b505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561294d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612988576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61299560008683876128c1565b83600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612b5f5750612b5e8773ffffffffffffffffffffffffffffffffffffffff166116cd565b5b15612c25575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bd46000888480600101955088612114565b612c0a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612b65578260015414612c2057600080fd5b612c91565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612c26575b816001819055505050612ca760008683876128c7565b5050505050565b828054612cba90613581565b90600052602060002090601f016020900481019282612cdc5760008555612d23565b82601f10612cf557805160ff1916838001178555612d23565b82800160010185558215612d23579182015b82811115612d22578251825591602001919060010190612d07565b5b509050612d309190612d77565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d90576000816000905550600101612d78565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ddd81612da8565b8114612de857600080fd5b50565b600081359050612dfa81612dd4565b92915050565b600060208284031215612e1657612e15612d9e565b5b6000612e2484828501612deb565b91505092915050565b60008115159050919050565b612e4281612e2d565b82525050565b6000602082019050612e5d6000830184612e39565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e9d578082015181840152602081019050612e82565b83811115612eac576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ece82612e63565b612ed88185612e6e565b9350612ee8818560208601612e7f565b612ef181612eb2565b840191505092915050565b60006020820190508181036000830152612f168184612ec3565b905092915050565b6000819050919050565b612f3181612f1e565b8114612f3c57600080fd5b50565b600081359050612f4e81612f28565b92915050565b600060208284031215612f6a57612f69612d9e565b5b6000612f7884828501612f3f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fac82612f81565b9050919050565b612fbc81612fa1565b82525050565b6000602082019050612fd76000830184612fb3565b92915050565b612fe681612fa1565b8114612ff157600080fd5b50565b60008135905061300381612fdd565b92915050565b600080604083850312156130205761301f612d9e565b5b600061302e85828601612ff4565b925050602061303f85828601612f3f565b9150509250929050565b61305281612f1e565b82525050565b600060208201905061306d6000830184613049565b92915050565b60008060006060848603121561308c5761308b612d9e565b5b600061309a86828701612ff4565b93505060206130ab86828701612ff4565b92505060406130bc86828701612f3f565b9150509250925092565b6000602082840312156130dc576130db612d9e565b5b60006130ea84828501612ff4565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61313082612eb2565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612d94565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b602082029050602081019050919050565b600080fd5b60006131b76131b284613173565b613158565b905080838252602082019050602084028301858111156131da576131d961319f565b5b835b8181101561320357806131ef8882612ff4565b8452602084019350506020810190506131dc565b5050509392505050565b600082601f830112613222576132216130f3565b5b81356132328482602086016131a4565b91505092915050565b60006020828403121561325157613250612d9e565b5b600082013567ffffffffffffffff81111561326f5761326e612da3565b5b61327b8482850161320d565b91505092915050565b600080fd5b600067ffffffffffffffff8211156132a4576132a36130f8565b5b6132ad82612eb2565b9050602081019050919050565b82818337600083830152505050565b60006132dc6132d784613289565b613158565b9050828152602081018484840111156132f8576132f7613284565b5b6133038482856132ba565b509392505050565b600082601f8301126133205761331f6130f3565b5b81356133308482602086016132c9565b91505092915050565b60006020828403121561334f5761334e612d9e565b5b600082013567ffffffffffffffff81111561336d5761336c612da3565b5b6133798482850161330b565b91505092915050565b61338b81612e2d565b811461339657600080fd5b50565b6000813590506133a881613382565b92915050565b600080604083850312156133c5576133c4612d9e565b5b60006133d385828601612ff4565b92505060206133e485828601613399565b9150509250929050565b600067ffffffffffffffff821115613409576134086130f8565b5b61341282612eb2565b9050602081019050919050565b600061343261342d846133ee565b613158565b90508281526020810184848401111561344e5761344d613284565b5b6134598482856132ba565b509392505050565b600082601f830112613476576134756130f3565b5b813561348684826020860161341f565b91505092915050565b600080600080608085870312156134a9576134a8612d9e565b5b60006134b787828801612ff4565b94505060206134c887828801612ff4565b93505060406134d987828801612f3f565b925050606085013567ffffffffffffffff8111156134fa576134f9612da3565b5b61350687828801613461565b91505092959194509250565b6000806040838503121561352957613528612d9e565b5b600061353785828601612ff4565b925050602061354885828601612ff4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061359957607f821691505b602082108114156135ad576135ac613552565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135e9602083612e6e565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365982612f1e565b915061366483612f1e565b9250828210156136775761367661361f565b5b828203905092915050565b7f6d696e74206174206c65617374206f6e6520746f6b656e000000000000000000600082015250565b60006136b8601783612e6e565b91506136c382613682565b602082019050919050565b600060208201905081810360008301526136e7816136ab565b9050919050565b7f4d617820706572207472616e73616374696f6e206c696d69742072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061374a602183612e6e565b9150613755826136ee565b604082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b600061378b82612f1e565b915061379683612f1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156137cb576137ca61361f565b5b828201905092915050565b7f6e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b600061380c601683612e6e565b9150613817826137d6565b602082019050919050565b6000602082019050818103600083015261383b816137ff565b9050919050565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b6000613878602083612e6e565b915061388382613842565b602082019050919050565b600060208201905081810360008301526138a78161386b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138e882612f1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561391b5761391a61361f565b5b600182019050919050565b600081905092915050565b600061393c82612e63565b6139468185613926565b9350613956818560208601612e7f565b80840191505092915050565b600061396e8285613931565b915061397a8284613931565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139e2602683612e6e565b91506139ed82613986565b604082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a3f82613a18565b613a498185613a23565b9350613a59818560208601612e7f565b613a6281612eb2565b840191505092915050565b6000608082019050613a826000830187612fb3565b613a8f6020830186612fb3565b613a9c6040830185613049565b8181036060830152613aae8184613a34565b905095945050505050565b600081519050613ac881612dd4565b92915050565b600060208284031215613ae457613ae3612d9e565b5b6000613af284828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b3582612f1e565b9150613b4083612f1e565b925082613b5057613b4f613afb565b5b828204905092915050565b6000613b6682612f1e565b9150613b7183612f1e565b925082613b8157613b80613afb565b5b82820690509291505056fea26469706673582212203b50bebd41b87cffaebad11c251cc58b1aaac70995303ae646ecdf8f6ce4f43b64736f6c63430008090033

Deployed Bytecode Sourcemap

47924:2997:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50756:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33232:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34735:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34298:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49532:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29368:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35600:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48914:368;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50577:103;;;:::i;:::-;;35841:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49313:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48094:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48050:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49689:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48022:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30488:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7837:103;;;:::i;:::-;;50124:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48458:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7186:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33401:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50247:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35011:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47988:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49985:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36097:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49842:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33576:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50469:83;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35369:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8095:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50756:162;50850:4;50874:36;50898:11;50874:23;:36::i;:::-;50867:43;;50756:162;;;:::o;33232:100::-;33286:13;33319:5;33312:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33232:100;:::o;34735:204::-;34803:7;34828:16;34836:7;34828;:16::i;:::-;34823:64;;34853:34;;;;;;;;;;;;;;34823:64;34907:15;:24;34923:7;34907:24;;;;;;;;;;;;;;;;;;;;;34900:31;;34735:204;;;:::o;34298:371::-;34371:13;34387:24;34403:7;34387:15;:24::i;:::-;34371:40;;34432:5;34426:11;;:2;:11;;;34422:48;;;34446:24;;;;;;;;;;;;;;34422:48;34503:5;34487:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34513:37;34530:5;34537:12;:10;:12::i;:::-;34513:16;:37::i;:::-;34512:38;34487:63;34483:138;;;34574:35;;;;;;;;;;;;;;34483:138;34633:28;34642:2;34646:7;34655:5;34633:8;:28::i;:::-;34360:309;34298:371;;:::o;49532:109::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49593:14:::1;49599:7;49593:5;:14::i;:::-;49632:1;49618:11;;:15;;;;;;;:::i;:::-;;;;;;;;49532:109:::0;:::o;29368:303::-;29412:7;29637:15;:13;:15::i;:::-;29622:12;;29606:13;;:28;:46;29599:53;;29368:303;:::o;35600:170::-;35734:28;35744:4;35750:2;35754:7;35734:9;:28::i;:::-;35600:170;;;:::o;48914:368::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49011:1:::1;49003:5;:9;48995:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;49068:17;;49059:5;:26;;49051:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;49167:14;;49157:5;49142:11;;:20;;;;:::i;:::-;:39;;49134:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;49219:24;49229:6;49237:5;49219:9;:24::i;:::-;49269:5;49254:11;;:20;;;;;;;:::i;:::-;;;;;;;;48914:368:::0;;:::o;50577:103::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:3:::1;;;;;;;;;;;50627:21;;:44;50649:21;50627:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50577:103::o:0;35841:185::-;35979:39;35996:4;36002:2;36006:7;35979:39;;;;;;;;;;;;:16;:39::i;:::-;35841:185;;;:::o;49313:182::-;49383:16;49391:7;49383;:16::i;:::-;49367:32;;:12;:10;:12::i;:::-;:32;;;49359:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49447:14;49453:7;49447:5;:14::i;:::-;49486:1;49472:11;;:15;;;;;;;:::i;:::-;;;;;;;;49313:182;:::o;48094:33::-;;;;:::o;48050:35::-;;;;:::o;33040:125::-;33104:7;33131:21;33144:7;33131:12;:21::i;:::-;:26;;;33124:33;;33040:125;;;:::o;49689:105::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49780:6:::1;49760:17;:26;;;;49689:105:::0;:::o;48022:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30488:206::-;30552:7;30593:1;30576:19;;:5;:19;;;30572:60;;;30604:28;;;;;;;;;;;;;;30572:60;30658:12;:19;30671:5;30658:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30650:36;;30643:43;;30488:206;;;:::o;7837:103::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7902:30:::1;7929:1;7902:18;:30::i;:::-;7837:103::o:0;50124:94::-;50173:4;50196:14;;50189:21;;50124:94;:::o;48458:414::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48566:17:::1;;48547:8;:15;:36;;48539:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;48675:14;;48655:8;:15;48640:11;;:30;;;;:::i;:::-;:49;;48632:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;48731:6;48727:124;48747:8;:15;48743:1;:19;48727:124;;;48783:25;48793:8;48802:1;48793:11;;;;;;;;:::i;:::-;;;;;;;;48806:1;48783:9;:25::i;:::-;48838:1;48823:11;;:16;;;;;;;:::i;:::-;;;;;;;;48764:3;;;;;:::i;:::-;;;;48727:124;;;;48458:414:::0;:::o;7186:87::-;7232:7;7259:6;;;;;;;;;;;7252:13;;7186:87;:::o;33401:104::-;33457:13;33490:7;33483:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33401:104;:::o;50247:92::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50327:4:::1;50317:7;:14;;;;;;;;;;;;:::i;:::-;;50247:92:::0;:::o;35011:287::-;35122:12;:10;:12::i;:::-;35110:24;;:8;:24;;;35106:54;;;35143:17;;;;;;;;;;;;;;35106:54;35218:8;35173:18;:32;35192:12;:10;:12::i;:::-;35173:32;;;;;;;;;;;;;;;:42;35206:8;35173:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35271:8;35242:48;;35257:12;:10;:12::i;:::-;35242:48;;;35281:8;35242:48;;;;;;:::i;:::-;;;;;;;;35011:287;;:::o;47988:27::-;;;;:::o;49985:101::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50072:6:::1;50055:14;:23;;;;49985:101:::0;:::o;36097:369::-;36264:28;36274:4;36280:2;36284:7;36264:9;:28::i;:::-;36307:15;:2;:13;;;:15::i;:::-;:76;;;;;36327:56;36358:4;36364:2;36368:7;36377:5;36327:30;:56::i;:::-;36326:57;36307:76;36303:156;;;36407:40;;;;;;;;;;;;;;36303:156;36097:369;;;;:::o;49842:99::-;49893:4;49916:17;;49909:24;;49842:99;:::o;33576:318::-;33649:13;33680:16;33688:7;33680;:16::i;:::-;33675:59;;33705:29;;;;;;;;;;;;;;33675:59;33747:21;33771:10;:8;:10::i;:::-;33747:34;;33824:1;33805:7;33799:21;:26;;:87;;;;;;;;;;;;;;;;;33852:7;33861:18;:7;:16;:18::i;:::-;33835:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33799:87;33792:94;;;33576:318;;;:::o;50469:83::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50540:4:::1;50534:3;;:10;;;;;;;;;;;;;;;;;;50469:83:::0;:::o;35369:164::-;35466:4;35490:18;:25;35509:5;35490:25;;;;;;;;;;;;;;;:35;35516:8;35490:35;;;;;;;;;;;;;;;;;;;;;;;;;35483:42;;35369:164;;;;:::o;8095:201::-;7417:12;:10;:12::i;:::-;7406:23;;:7;:5;:7::i;:::-;:23;;;7398:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8204:1:::1;8184:22;;:8;:22;;;;8176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8260:28;8279:8;8260:18;:28::i;:::-;8095:201:::0;:::o;9887:326::-;9947:4;10204:1;10182:7;:19;;;:23;10175:30;;9887:326;;;:::o;30119:305::-;30221:4;30273:25;30258:40;;;:11;:40;;;;:105;;;;30330:33;30315:48;;;:11;:48;;;;30258:105;:158;;;;30380:36;30404:11;30380:23;:36::i;:::-;30258:158;30238:178;;30119:305;;;:::o;36721:187::-;36778:4;36821:7;36802:15;:13;:15::i;:::-;:26;;:53;;;;;36842:13;;36832:7;:23;36802:53;:98;;;;;36873:11;:20;36885:7;36873:20;;;;;;;;;;;:27;;;;;;;;;;;;36872:28;36802:98;36795:105;;36721:187;;;:::o;5910:98::-;5963:7;5990:10;5983:17;;5910:98;:::o;44891:196::-;45033:2;45006:15;:24;45022:7;45006:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45071:7;45067:2;45051:28;;45060:5;45051:28;;;;;;;;;;;;44891:196;;;:::o;42047:89::-;42107:21;42113:7;42122:5;42107;:21::i;:::-;42047:89;:::o;29142:92::-;29198:7;29142:92;:::o;39834:2130::-;39949:35;39987:21;40000:7;39987:12;:21::i;:::-;39949:59;;40047:4;40025:26;;:13;:18;;;:26;;;40021:67;;40060:28;;;;;;;;;;;;;;40021:67;40101:22;40143:4;40127:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40164:36;40181:4;40187:12;:10;:12::i;:::-;40164:16;:36::i;:::-;40127:73;:126;;;;40241:12;:10;:12::i;:::-;40217:36;;:20;40229:7;40217:11;:20::i;:::-;:36;;;40127:126;40101:153;;40272:17;40267:66;;40298:35;;;;;;;;;;;;;;40267:66;40362:1;40348:16;;:2;:16;;;40344:52;;;40373:23;;;;;;;;;;;;;;40344:52;40409:43;40431:4;40437:2;40441:7;40450:1;40409:21;:43::i;:::-;40517:35;40534:1;40538:7;40547:4;40517:8;:35::i;:::-;40878:1;40848:12;:18;40861:4;40848:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40922:1;40894:12;:16;40907:2;40894:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40940:31;40974:11;:20;40986:7;40974:20;;;;;;;;;;;40940:54;;41025:2;41009:8;:13;;;:18;;;;;;;;;;;;;;;;;;41075:15;41042:8;:23;;;:49;;;;;;;;;;;;;;;;;;41343:19;41375:1;41365:7;:11;41343:33;;41391:31;41425:11;:24;41437:11;41425:24;;;;;;;;;;;41391:58;;41493:1;41468:27;;:8;:13;;;;;;;;;;;;:27;;;41464:384;;;41678:13;;41663:11;:28;41659:174;;41732:4;41716:8;:13;;;:20;;;;;;;;;;;;;;;;;;41785:13;:28;;;41759:8;:23;;;:54;;;;;;;;;;;;;;;;;;41659:174;41464:384;40823:1036;;;41895:7;41891:2;41876:27;;41885:4;41876:27;;;;;;;;;;;;41914:42;41935:4;41941:2;41945:7;41954:1;41914:20;:42::i;:::-;39938:2026;;39834:2130;;;:::o;36916:104::-;36985:27;36995:2;36999:8;36985:27;;;;;;;;;;;;:9;:27::i;:::-;36916:104;;:::o;31869:1109::-;31931:21;;:::i;:::-;31965:12;31980:7;31965:22;;32048:4;32029:15;:13;:15::i;:::-;:23;;:47;;;;;32063:13;;32056:4;:20;32029:47;32025:886;;;32097:31;32131:11;:17;32143:4;32131:17;;;;;;;;;;;32097:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32172:9;:16;;;32167:729;;32243:1;32217:28;;:9;:14;;;:28;;;32213:101;;32281:9;32274:16;;;;;;32213:101;32616:261;32623:4;32616:261;;;32656:6;;;;;;;;32701:11;:17;32713:4;32701:17;;;;;;;;;;;32689:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32775:1;32749:28;;:9;:14;;;:28;;;32745:109;;32817:9;32810:16;;;;;;32745:109;32616:261;;;32167:729;32078:833;32025:886;32939:31;;;;;;;;;;;;;;31869:1109;;;;:::o;8456:191::-;8530:16;8549:6;;;;;;;;;;;8530:25;;8575:8;8566:6;;:17;;;;;;;;;;;;;;;;;;8630:8;8599:40;;8620:8;8599:40;;;;;;;;;;;;8519:128;8456:191;:::o;45579:667::-;45742:4;45779:2;45763:36;;;45800:12;:10;:12::i;:::-;45814:4;45820:7;45829:5;45763:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45759:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46014:1;45997:6;:13;:18;45993:235;;;46043:40;;;;;;;;;;;;;;45993:235;46186:6;46180:13;46171:6;46167:2;46163:15;46156:38;45759:480;45892:45;;;45882:55;;;:6;:55;;;;45875:62;;;45579:667;;;;;;:::o;50353:108::-;50413:13;50446:7;50439:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50353:108;:::o;3472:723::-;3528:13;3758:1;3749:5;:10;3745:53;;;3776:10;;;;;;;;;;;;;;;;;;;;;3745:53;3808:12;3823:5;3808:20;;3839:14;3864:78;3879:1;3871:4;:9;3864:78;;3897:8;;;;;:::i;:::-;;;;3928:2;3920:10;;;;;:::i;:::-;;;3864:78;;;3952:19;3984:6;3974:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3952:39;;4002:154;4018:1;4009:5;:10;4002:154;;4046:1;4036:11;;;;;:::i;:::-;;;4113:2;4105:5;:10;;;;:::i;:::-;4092:2;:24;;;;:::i;:::-;4079:39;;4062:6;4069;4062:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4142:2;4133:11;;;;;:::i;:::-;;;4002:154;;;4180:6;4166:21;;;;;3472:723;;;;:::o;19970:157::-;20055:4;20094:25;20079:40;;;:11;:40;;;;20072:47;;19970:157;;;:::o;42365:2408::-;42445:35;42483:21;42496:7;42483:12;:21::i;:::-;42445:59;;42517:12;42532:13;:18;;;42517:33;;42567:13;42563:290;;;42597:22;42639:4;42623:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;42664:36;42681:4;42687:12;:10;:12::i;:::-;42664:16;:36::i;:::-;42623:77;:134;;;;42745:12;:10;:12::i;:::-;42721:36;;:20;42733:7;42721:11;:20::i;:::-;:36;;;42623:134;42597:161;;42780:17;42775:66;;42806:35;;;;;;;;;;;;;;42775:66;42582:271;42563:290;42865:51;42887:4;42901:1;42905:7;42914:1;42865:21;:51::i;:::-;42981:35;42998:1;43002:7;43011:4;42981:8;:35::i;:::-;43312:31;43346:12;:18;43359:4;43346:18;;;;;;;;;;;;;;;43312:52;;43402:1;43379:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43446:1;43418:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43546:31;43580:11;:20;43592:7;43580:20;;;;;;;;;;;43546:54;;43631:4;43615:8;:13;;;:20;;;;;;;;;;;;;;;;;;43683:15;43650:8;:23;;;:49;;;;;;;;;;;;;;;;;;43732:4;43714:8;:15;;;:22;;;;;;;;;;;;;;;;;;43984:19;44016:1;44006:7;:11;43984:33;;44032:31;44066:11;:24;44078:11;44066:24;;;;;;;;;;;44032:58;;44134:1;44109:27;;:8;:13;;;;;;;;;;;;:27;;;44105:384;;;44319:13;;44304:11;:28;44300:174;;44373:4;44357:8;:13;;;:20;;;;;;;;;;;;;;;;;;44426:13;:28;;;44400:8;:23;;;:54;;;;;;;;;;;;;;;;;;44300:174;44105:384;43287:1213;;;;44544:7;44540:1;44517:35;;44526:4;44517:35;;;;;;;;;;;;44563:50;44584:4;44598:1;44602:7;44611:1;44563:20;:50::i;:::-;44740:12;;:14;;;;;;;;;;;;;42434:2339;;42365:2408;;:::o;46894:159::-;;;;;:::o;47712:158::-;;;;;:::o;37383:163::-;37506:32;37512:2;37516:8;37526:5;37533:4;37506:5;:32::i;:::-;37383:163;;;:::o;37805:1775::-;37944:20;37967:13;;37944:36;;38009:1;37995:16;;:2;:16;;;37991:48;;;38020:19;;;;;;;;;;;;;;37991:48;38066:1;38054:8;:13;38050:44;;;38076:18;;;;;;;;;;;;;;38050:44;38107:61;38137:1;38141:2;38145:12;38159:8;38107:21;:61::i;:::-;38480:8;38445:12;:16;38458:2;38445:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38544:8;38504:12;:16;38517:2;38504:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38603:2;38570:11;:25;38582:12;38570:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38670:15;38620:11;:25;38632:12;38620:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38703:20;38726:12;38703:35;;38753:11;38782:8;38767:12;:23;38753:37;;38811:4;:23;;;;;38819:15;:2;:13;;;:15::i;:::-;38811:23;38807:641;;;38855:314;38911:12;38907:2;38886:38;;38903:1;38886:38;;;;;;;;;;;;38952:69;38991:1;38995:2;38999:14;;;;;;39015:5;38952:30;:69::i;:::-;38947:174;;39057:40;;;;;;;;;;;;;;38947:174;39164:3;39148:12;:19;;38855:314;;39250:12;39233:13;;:29;39229:43;;39264:8;;;39229:43;38807:641;;;39313:120;39369:14;;;;;;39365:2;39344:40;;39361:1;39344:40;;;;;;;;;;;;39428:3;39412:12;:19;;39313:120;;38807:641;39478:12;39462:13;:28;;;;38420:1082;;39512:60;39541:1;39545:2;39549:12;39563:8;39512:20;:60::i;:::-;37933:1647;37805:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:117::-;9201:1;9198;9191:12;9215:308;9277:4;9367:18;9359:6;9356:30;9353:56;;;9389:18;;:::i;:::-;9353:56;9427:29;9449:6;9427:29;:::i;:::-;9419:37;;9511:4;9505;9501:15;9493:23;;9215:308;;;:::o;9529:154::-;9613:6;9608:3;9603;9590:30;9675:1;9666:6;9661:3;9657:16;9650:27;9529:154;;;:::o;9689:412::-;9767:5;9792:66;9808:49;9850:6;9808:49;:::i;:::-;9792:66;:::i;:::-;9783:75;;9881:6;9874:5;9867:21;9919:4;9912:5;9908:16;9957:3;9948:6;9943:3;9939:16;9936:25;9933:112;;;9964:79;;:::i;:::-;9933:112;10054:41;10088:6;10083:3;10078;10054:41;:::i;:::-;9773:328;9689:412;;;;;:::o;10121:340::-;10177:5;10226:3;10219:4;10211:6;10207:17;10203:27;10193:122;;10234:79;;:::i;:::-;10193:122;10351:6;10338:20;10376:79;10451:3;10443:6;10436:4;10428:6;10424:17;10376:79;:::i;:::-;10367:88;;10183:278;10121:340;;;;:::o;10467:509::-;10536:6;10585:2;10573:9;10564:7;10560:23;10556:32;10553:119;;;10591:79;;:::i;:::-;10553:119;10739:1;10728:9;10724:17;10711:31;10769:18;10761:6;10758:30;10755:117;;;10791:79;;:::i;:::-;10755:117;10896:63;10951:7;10942:6;10931:9;10927:22;10896:63;:::i;:::-;10886:73;;10682:287;10467:509;;;;:::o;10982:116::-;11052:21;11067:5;11052:21;:::i;:::-;11045:5;11042:32;11032:60;;11088:1;11085;11078:12;11032:60;10982:116;:::o;11104:133::-;11147:5;11185:6;11172:20;11163:29;;11201:30;11225:5;11201:30;:::i;:::-;11104:133;;;;:::o;11243:468::-;11308:6;11316;11365:2;11353:9;11344:7;11340:23;11336:32;11333:119;;;11371:79;;:::i;:::-;11333:119;11491:1;11516:53;11561:7;11552:6;11541:9;11537:22;11516:53;:::i;:::-;11506:63;;11462:117;11618:2;11644:50;11686:7;11677:6;11666:9;11662:22;11644:50;:::i;:::-;11634:60;;11589:115;11243:468;;;;;:::o;11717:307::-;11778:4;11868:18;11860:6;11857:30;11854:56;;;11890:18;;:::i;:::-;11854:56;11928:29;11950:6;11928:29;:::i;:::-;11920:37;;12012:4;12006;12002:15;11994:23;;11717:307;;;:::o;12030:410::-;12107:5;12132:65;12148:48;12189:6;12148:48;:::i;:::-;12132:65;:::i;:::-;12123:74;;12220:6;12213:5;12206:21;12258:4;12251:5;12247:16;12296:3;12287:6;12282:3;12278:16;12275:25;12272:112;;;12303:79;;:::i;:::-;12272:112;12393:41;12427:6;12422:3;12417;12393:41;:::i;:::-;12113:327;12030:410;;;;;:::o;12459:338::-;12514:5;12563:3;12556:4;12548:6;12544:17;12540:27;12530:122;;12571:79;;:::i;:::-;12530:122;12688:6;12675:20;12713:78;12787:3;12779:6;12772:4;12764:6;12760:17;12713:78;:::i;:::-;12704:87;;12520:277;12459:338;;;;:::o;12803:943::-;12898:6;12906;12914;12922;12971:3;12959:9;12950:7;12946:23;12942:33;12939:120;;;12978:79;;:::i;:::-;12939:120;13098:1;13123:53;13168:7;13159:6;13148:9;13144:22;13123:53;:::i;:::-;13113:63;;13069:117;13225:2;13251:53;13296:7;13287:6;13276:9;13272:22;13251:53;:::i;:::-;13241:63;;13196:118;13353:2;13379:53;13424:7;13415:6;13404:9;13400:22;13379:53;:::i;:::-;13369:63;;13324:118;13509:2;13498:9;13494:18;13481:32;13540:18;13532:6;13529:30;13526:117;;;13562:79;;:::i;:::-;13526:117;13667:62;13721:7;13712:6;13701:9;13697:22;13667:62;:::i;:::-;13657:72;;13452:287;12803:943;;;;;;;:::o;13752:474::-;13820:6;13828;13877:2;13865:9;13856:7;13852:23;13848:32;13845:119;;;13883:79;;:::i;:::-;13845:119;14003:1;14028:53;14073:7;14064:6;14053:9;14049:22;14028:53;:::i;:::-;14018:63;;13974:117;14130:2;14156:53;14201:7;14192:6;14181:9;14177:22;14156:53;:::i;:::-;14146:63;;14101:118;13752:474;;;;;:::o;14232:180::-;14280:77;14277:1;14270:88;14377:4;14374:1;14367:15;14401:4;14398:1;14391:15;14418:320;14462:6;14499:1;14493:4;14489:12;14479:22;;14546:1;14540:4;14536:12;14567:18;14557:81;;14623:4;14615:6;14611:17;14601:27;;14557:81;14685:2;14677:6;14674:14;14654:18;14651:38;14648:84;;;14704:18;;:::i;:::-;14648:84;14469:269;14418:320;;;:::o;14744:182::-;14884:34;14880:1;14872:6;14868:14;14861:58;14744:182;:::o;14932:366::-;15074:3;15095:67;15159:2;15154:3;15095:67;:::i;:::-;15088:74;;15171:93;15260:3;15171:93;:::i;:::-;15289:2;15284:3;15280:12;15273:19;;14932:366;;;:::o;15304:419::-;15470:4;15508:2;15497:9;15493:18;15485:26;;15557:9;15551:4;15547:20;15543:1;15532:9;15528:17;15521:47;15585:131;15711:4;15585:131;:::i;:::-;15577:139;;15304:419;;;:::o;15729:180::-;15777:77;15774:1;15767:88;15874:4;15871:1;15864:15;15898:4;15895:1;15888:15;15915:191;15955:4;15975:20;15993:1;15975:20;:::i;:::-;15970:25;;16009:20;16027:1;16009:20;:::i;:::-;16004:25;;16048:1;16045;16042:8;16039:34;;;16053:18;;:::i;:::-;16039:34;16098:1;16095;16091:9;16083:17;;15915:191;;;;:::o;16112:173::-;16252:25;16248:1;16240:6;16236:14;16229:49;16112:173;:::o;16291:366::-;16433:3;16454:67;16518:2;16513:3;16454:67;:::i;:::-;16447:74;;16530:93;16619:3;16530:93;:::i;:::-;16648:2;16643:3;16639:12;16632:19;;16291:366;;;:::o;16663:419::-;16829:4;16867:2;16856:9;16852:18;16844:26;;16916:9;16910:4;16906:20;16902:1;16891:9;16887:17;16880:47;16944:131;17070:4;16944:131;:::i;:::-;16936:139;;16663:419;;;:::o;17088:220::-;17228:34;17224:1;17216:6;17212:14;17205:58;17297:3;17292:2;17284:6;17280:15;17273:28;17088:220;:::o;17314:366::-;17456:3;17477:67;17541:2;17536:3;17477:67;:::i;:::-;17470:74;;17553:93;17642:3;17553:93;:::i;:::-;17671:2;17666:3;17662:12;17655:19;;17314:366;;;:::o;17686:419::-;17852:4;17890:2;17879:9;17875:18;17867:26;;17939:9;17933:4;17929:20;17925:1;17914:9;17910:17;17903:47;17967:131;18093:4;17967:131;:::i;:::-;17959:139;;17686:419;;;:::o;18111:305::-;18151:3;18170:20;18188:1;18170:20;:::i;:::-;18165:25;;18204:20;18222:1;18204:20;:::i;:::-;18199:25;;18358:1;18290:66;18286:74;18283:1;18280:81;18277:107;;;18364:18;;:::i;:::-;18277:107;18408:1;18405;18401:9;18394:16;;18111:305;;;;:::o;18422:172::-;18562:24;18558:1;18550:6;18546:14;18539:48;18422:172;:::o;18600:366::-;18742:3;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18839:93;18928:3;18839:93;:::i;:::-;18957:2;18952:3;18948:12;18941:19;;18600:366;;;:::o;18972:419::-;19138:4;19176:2;19165:9;19161:18;19153:26;;19225:9;19219:4;19215:20;19211:1;19200:9;19196:17;19189:47;19253:131;19379:4;19253:131;:::i;:::-;19245:139;;18972:419;;;:::o;19397:182::-;19537:34;19533:1;19525:6;19521:14;19514:58;19397:182;:::o;19585:366::-;19727:3;19748:67;19812:2;19807:3;19748:67;:::i;:::-;19741:74;;19824:93;19913:3;19824:93;:::i;:::-;19942:2;19937:3;19933:12;19926:19;;19585:366;;;:::o;19957:419::-;20123:4;20161:2;20150:9;20146:18;20138:26;;20210:9;20204:4;20200:20;20196:1;20185:9;20181:17;20174:47;20238:131;20364:4;20238:131;:::i;:::-;20230:139;;19957:419;;;:::o;20382:180::-;20430:77;20427:1;20420:88;20527:4;20524:1;20517:15;20551:4;20548:1;20541:15;20568:233;20607:3;20630:24;20648:5;20630:24;:::i;:::-;20621:33;;20676:66;20669:5;20666:77;20663:103;;;20746:18;;:::i;:::-;20663:103;20793:1;20786:5;20782:13;20775:20;;20568:233;;;:::o;20807:148::-;20909:11;20946:3;20931:18;;20807:148;;;;:::o;20961:377::-;21067:3;21095:39;21128:5;21095:39;:::i;:::-;21150:89;21232:6;21227:3;21150:89;:::i;:::-;21143:96;;21248:52;21293:6;21288:3;21281:4;21274:5;21270:16;21248:52;:::i;:::-;21325:6;21320:3;21316:16;21309:23;;21071:267;20961:377;;;;:::o;21344:435::-;21524:3;21546:95;21637:3;21628:6;21546:95;:::i;:::-;21539:102;;21658:95;21749:3;21740:6;21658:95;:::i;:::-;21651:102;;21770:3;21763:10;;21344:435;;;;;:::o;21785:225::-;21925:34;21921:1;21913:6;21909:14;21902:58;21994:8;21989:2;21981:6;21977:15;21970:33;21785:225;:::o;22016:366::-;22158:3;22179:67;22243:2;22238:3;22179:67;:::i;:::-;22172:74;;22255:93;22344:3;22255:93;:::i;:::-;22373:2;22368:3;22364:12;22357:19;;22016:366;;;:::o;22388:419::-;22554:4;22592:2;22581:9;22577:18;22569:26;;22641:9;22635:4;22631:20;22627:1;22616:9;22612:17;22605:47;22669:131;22795:4;22669:131;:::i;:::-;22661:139;;22388:419;;;:::o;22813:98::-;22864:6;22898:5;22892:12;22882:22;;22813:98;;;:::o;22917:168::-;23000:11;23034:6;23029:3;23022:19;23074:4;23069:3;23065:14;23050:29;;22917:168;;;;:::o;23091:360::-;23177:3;23205:38;23237:5;23205:38;:::i;:::-;23259:70;23322:6;23317:3;23259:70;:::i;:::-;23252:77;;23338:52;23383:6;23378:3;23371:4;23364:5;23360:16;23338:52;:::i;:::-;23415:29;23437:6;23415:29;:::i;:::-;23410:3;23406:39;23399:46;;23181:270;23091:360;;;;:::o;23457:640::-;23652:4;23690:3;23679:9;23675:19;23667:27;;23704:71;23772:1;23761:9;23757:17;23748:6;23704:71;:::i;:::-;23785:72;23853:2;23842:9;23838:18;23829:6;23785:72;:::i;:::-;23867;23935:2;23924:9;23920:18;23911:6;23867:72;:::i;:::-;23986:9;23980:4;23976:20;23971:2;23960:9;23956:18;23949:48;24014:76;24085:4;24076:6;24014:76;:::i;:::-;24006:84;;23457:640;;;;;;;:::o;24103:141::-;24159:5;24190:6;24184:13;24175:22;;24206:32;24232:5;24206:32;:::i;:::-;24103:141;;;;:::o;24250:349::-;24319:6;24368:2;24356:9;24347:7;24343:23;24339:32;24336:119;;;24374:79;;:::i;:::-;24336:119;24494:1;24519:63;24574:7;24565:6;24554:9;24550:22;24519:63;:::i;:::-;24509:73;;24465:127;24250:349;;;;:::o;24605:180::-;24653:77;24650:1;24643:88;24750:4;24747:1;24740:15;24774:4;24771:1;24764:15;24791:185;24831:1;24848:20;24866:1;24848:20;:::i;:::-;24843:25;;24882:20;24900:1;24882:20;:::i;:::-;24877:25;;24921:1;24911:35;;24926:18;;:::i;:::-;24911:35;24968:1;24965;24961:9;24956:14;;24791:185;;;;:::o;24982:176::-;25014:1;25031:20;25049:1;25031:20;:::i;:::-;25026:25;;25065:20;25083:1;25065:20;:::i;:::-;25060:25;;25104:1;25094:35;;25109:18;;:::i;:::-;25094:35;25150:1;25147;25143:9;25138:14;;24982:176;;;;:::o

Swarm Source

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