ETH Price: $3,860.49 (-3.20%)

Token

Floaties (FLOAT)
 

Overview

Max Total Supply

3,333 FLOAT

Holders

1,473

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
amallama.eth
Balance
1 FLOAT
0xdA01b6Fe8E18c93a83Ad42a75334a2deBd8167aF
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:
FloatiesNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-16
*/

// SPDX-License-Identifier: MIT
 
pragma solidity ^0.8.0;
 
abstract contract ReentrancyGuard {
 
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
 
    uint256 private _status;
 
    constructor() {
        _status = _NOT_ENTERED;
    }
    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}
 
 
library MerkleProof {
 
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
 
    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)
        }
    }
}
 
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
 
    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);
    }
}
 
 
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
 
    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
 
 
abstract contract Ownable is Context {
    address private _owner;
 
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
 
    function owner() public view virtual returns (address) {
        return _owner;
    }
 
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
 
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
 
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
 
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
 
 
library Address {
 
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }
 
    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");
    }
 
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }
 
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
 
    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");
    }
 
    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);
    }
 
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
 
    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);
    }
 
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
 
    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);
    }
 
    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);
            }
        }
    }
}
 
 
interface IERC721Receiver {
 
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
 
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
 
 
abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
 
 
interface IERC721 is IERC165 {
 
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
 
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
 
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
 
    function balanceOf(address owner) external view returns (uint256 balance);
 
    function ownerOf(uint256 tokenId) external view returns (address owner);
 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
 
    function approve(address to, uint256 tokenId) external;
 
    function getApproved(uint256 tokenId) external view returns (address operator);
 
    function setApprovalForAll(address operator, bool _approved) external;
 
    function isApprovedForAll(address owner, address operator) external view returns (bool);
 
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
 
 
interface IERC721Enumerable is IERC721 {
 
    function totalSupply() external view returns (uint256);
 
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
 
    function tokenByIndex(uint256 index) external view returns (uint256);
}
 
 
interface IERC721Metadata is IERC721 {
 
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
 
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();
 
 
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 See {IERC721Enumerable-totalSupply}.
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        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) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        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 {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _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 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);
 
        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());
 
        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();
 
        _beforeTokenTransfers(from, to, tokenId, 1);
 
        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
 
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
 
            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
 
            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }
 
        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }
 
    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
 
        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);
 
        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);
 
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;
 
            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].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;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }
 
        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, 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 {}
}
 
 
error ReserveEmpty();
error AllReadyClaimed();
error AllBagFull();
error LowReserveLeft();
 
contract FloatiesNft is ERC721A, Ownable, ReentrancyGuard {
 
    using Strings for uint256;
 
    bytes32 public merkleRoot;
 
    string public uriPrefix = "";
    string public uriSuffix = ".json";
 
    uint256 public cost = 0.005 ether;
 
    uint256 public maxSupply = 3333;  
 
    uint public maxMintAmountPerTx;
    uint public walletLimit;
 
    bool public whitelistMintEnabled = false;
    bool public publicMintEnabled = false;
 
    mapping (address => bool) public WhitelistClaimed;
    mapping (address => uint256) public NftBag;
 
    constructor(uint _MaxTx, uint _MaxWallet) ERC721A("Floaties", "FLOAT") {
        setMaxTxLimit(_MaxTx);
        setMaxWalletLimit(_MaxWallet);
    }
 
    modifier mintCompliance(uint256 _mintAmount) {
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }
 
    modifier mintPriceCompliance(uint256 _mintAmount) {
        require(msg.value >= cost * _mintAmount, "Insufficient funds!");
        _;
    }
 
    function whitelistMint(bytes32[] calldata _merkleProof) public mintCompliance(1) {
        require(whitelistMintEnabled,"Whitelist Mint Paused!!");
        require(tx.origin == msg.sender,"Error: Invalid Caller!");
        address account = msg.sender;
        if(WhitelistClaimed[account]) {
            revert AllReadyClaimed();
        }
        bytes32 leaf = keccak256(abi.encodePacked(account));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid proof!");
        _safeMint(account, 1);
        WhitelistClaimed[account] = true;
    }
 
    function publicMint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) {
        require(publicMintEnabled,"Public Mint Paused!!");
        require(tx.origin == msg.sender,"Error: Invalid Caller!");
        require(_mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
        address account = msg.sender;
        if(NftBag[account] + _mintAmount > walletLimit) {
            revert AllBagFull();
        }
        _safeMint(account, _mintAmount);
        NftBag[account] += _mintAmount;
    }
 
 
    /* ========================  Owner Minter ========================= */
 
    function mintTeam(address _adr, uint256 _mintAmount) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_adr, _mintAmount);
    }
 
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;
 
        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            TokenOwnership memory ownership = _ownerships[currentTokenId];
 
            if (!ownership.burned && ownership.addr != address(0)) {
                latestOwnerAddress = ownership.addr;
            }
 
            if (latestOwnerAddress == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
 
                ownedTokenIndex++;
            }
 
            currentTokenId++;
        }
 
        return ownedTokenIds;
    }
 
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }
 
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
 
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : '';
    }
 
    function enableDisableWhitelistMint(bool _status) public onlyOwner {
        whitelistMintEnabled = _status;
    }
 
    function enableDisablePublicMint(bool _status) public onlyOwner {
        publicMintEnabled = _status;
    }
 
    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }
 
    function setMaxTxLimit(uint _value) public onlyOwner {
        maxMintAmountPerTx = _value;
    }
 
    function setMaxWalletLimit(uint _value) public onlyOwner {
        walletLimit = _value;
    }
 
    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }
 
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }
 
    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }
 
    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
        require(os);
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }
 
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_MaxTx","type":"uint256"},{"internalType":"uint256","name":"_MaxWallet","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllBagFull","type":"error"},{"inputs":[],"name":"AllReadyClaimed","type":"error"},{"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"},{"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":"","type":"address"}],"name":"NftBag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"enableDisablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"enableDisableWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adr","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600b90805190602001906200002b9291906200042f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000799291906200042f565b506611c37937e08000600d55610d05600e556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff021916908315150217905550348015620000ce57600080fd5b5060405162004f1638038062004f168339818101604052810190620000f49190620004f6565b6040518060400160405280600881526020017f466c6f61746965730000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f464c4f41540000000000000000000000000000000000000000000000000000008152508160029080519060200190620001789291906200042f565b508060039080519060200190620001919291906200042f565b50620001a2620001fc60201b60201c565b6000819055505050620001ca620001be6200020560201b60201c565b6200020d60201b60201c565b6001600981905550620001e382620002d360201b60201c565b620001f4816200036c60201b60201c565b50506200064e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e36200020560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003096200040560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003599062000564565b60405180910390fd5b80600f8190555050565b6200037c6200020560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003a26200040560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f29062000564565b60405180910390fd5b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200043d90620005a1565b90600052602060002090601f016020900481019282620004615760008555620004ad565b82601f106200047c57805160ff1916838001178555620004ad565b82800160010185558215620004ad579182015b82811115620004ac5782518255916020019190600101906200048f565b5b509050620004bc9190620004c0565b5090565b5b80821115620004db576000816000905550600101620004c1565b5090565b600081519050620004f08162000634565b92915050565b6000806040838503121562000510576200050f62000606565b5b60006200052085828601620004df565b92505060206200053385828601620004df565b9150509250929050565b60006200054c60208362000586565b915062000559826200060b565b602082019050919050565b600060208201905081810360008301526200057f816200053d565b9050919050565b600082825260208201905092915050565b6000819050919050565b60006002820490506001821680620005ba57607f821691505b60208210811415620005d157620005d0620005d7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200063f8162000597565b81146200064b57600080fd5b50565b6148b8806200065e6000396000f3fe6080604052600436106102465760003560e01c80636352211e1161013957806393f84cfe116100b6578063b88d4fde1161007a578063b88d4fde14610859578063bb75f98614610882578063c87b56dd146108ab578063d5abeb01146108e8578063e985e9c514610913578063f2fde38b1461095057610246565b806393f84cfe1461077457806394354fd01461079d57806395d89b41146107c8578063a22cb465146107f3578063ab1686ab1461081c57610246565b8063715018a6116100fd578063715018a6146106b7578063728d41c9146106ce5780637cb64759146106f75780637ec4a659146107205780638da5cb5b1461074957610246565b80636352211e146105ac57806364f5a5bb146105e95780636890c532146106125780636caede3d1461064f57806370a082311461067a57610246565b80632eb4a7ab116101c7578063438b63001161018b578063438b6300146104c757806344a0d68a14610504578063545d66cd1461052d5780635503a0e81461055657806362b99ad41461058157610246565b80632eb4a7ab14610408578063372f657c146104335780633c8463a11461045c5780633ccfd60b1461048757806342842e0e1461049e57610246565b806313faede61161020e57806313faede61461034457806316ba10e01461036f57806318160ddd1461039857806323b872dd146103c35780632db11544146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630f4161aa14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139b2565b610979565b60405161027f9190613f0a565b60405180910390f35b34801561029457600080fd5b5061029d610a5b565b6040516102aa9190613f40565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a55565b610aed565b6040516102e79190613e81565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906138cb565b610b69565b005b34801561032557600080fd5b5061032e610c74565b60405161033b9190613f0a565b60405180910390f35b34801561035057600080fd5b50610359610c87565b60405161036691906140c2565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613a0c565b610c8d565b005b3480156103a457600080fd5b506103ad610d23565b6040516103ba91906140c2565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906137b5565b610d3a565b005b61040660048036038101906104019190613a55565b610d4a565b005b34801561041457600080fd5b5061041d610fe6565b60405161042a9190613f25565b60405180910390f35b34801561043f57600080fd5b5061045a6004803603810190610455919061390b565b610fec565b005b34801561046857600080fd5b506104716112ad565b60405161047e91906140c2565b60405180910390f35b34801561049357600080fd5b5061049c6112b3565b005b3480156104aa57600080fd5b506104c560048036038101906104c091906137b5565b611405565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613748565b611425565b6040516104fb9190613ee8565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190613a55565b611640565b005b34801561053957600080fd5b50610554600480360381019061054f9190613958565b6116c6565b005b34801561056257600080fd5b5061056b61175f565b6040516105789190613f40565b60405180910390f35b34801561058d57600080fd5b506105966117ed565b6040516105a39190613f40565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613a55565b61187b565b6040516105e09190613e81565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613a55565b611891565b005b34801561061e57600080fd5b5061063960048036038101906106349190613748565b611917565b60405161064691906140c2565b60405180910390f35b34801561065b57600080fd5b5061066461192f565b6040516106719190613f0a565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613748565b611942565b6040516106ae91906140c2565b60405180910390f35b3480156106c357600080fd5b506106cc611a12565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613a55565b611a9a565b005b34801561070357600080fd5b5061071e60048036038101906107199190613985565b611b20565b005b34801561072c57600080fd5b5061074760048036038101906107429190613a0c565b611ba6565b005b34801561075557600080fd5b5061075e611c3c565b60405161076b9190613e81565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906138cb565b611c66565b005b3480156107a957600080fd5b506107b2611d49565b6040516107bf91906140c2565b60405180910390f35b3480156107d457600080fd5b506107dd611d4f565b6040516107ea9190613f40565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061388b565b611de1565b005b34801561082857600080fd5b50610843600480360381019061083e9190613748565b611f59565b6040516108509190613f0a565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613808565b611f79565b005b34801561088e57600080fd5b506108a960048036038101906108a49190613958565b611ff5565b005b3480156108b757600080fd5b506108d260048036038101906108cd9190613a55565b61208e565b6040516108df9190613f40565b60405180910390f35b3480156108f457600080fd5b506108fd612138565b60405161090a91906140c2565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190613775565b61213e565b6040516109479190613f0a565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613748565b6121d2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a545750610a53826122ca565b5b9050919050565b606060028054610a6a906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a96906143d5565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b5050505050905090565b6000610af882612334565b610b2e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b748261187b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bdc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bfb612382565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c2d5750610c2b81610c26612382565b61213e565b155b15610c64576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6f83838361238a565b505050565b601160019054906101000a900460ff1681565b600d5481565b610c95612382565b73ffffffffffffffffffffffffffffffffffffffff16610cb3611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613fe2565b60405180910390fd5b80600c9080519060200190610d1f9291906134ae565b5050565b6000610d2d61243c565b6001546000540303905090565b610d45838383612445565b505050565b80600e5481610d57610d23565b610d619190614200565b1115610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614022565b60405180910390fd5b8180600d54610db19190614287565b341015610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906140a2565b60405180910390fd5b601160019054906101000a900460ff16610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990613fc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614062565b60405180910390fd5b600f54831115610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90613fa2565b60405180910390fd5b600033905060105484601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f489190614200565b1115610f80576040517f13bcc66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8a8185612936565b83601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd99190614200565b9250508190555050505050565b600a5481565b6001600e5481610ffa610d23565b6110049190614200565b1115611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614022565b60405180910390fd5b601160009054906101000a900460ff16611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90614042565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614062565b60405180910390fd5b6000339050601260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561118b576040517f7a7a859000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160405160200161119e9190613e20565b604051602081830303815290604052805190602001209050611204858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612954565b611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90613f62565b60405180910390fd5b61124e826001612936565b6001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60105481565b6112bb612382565b73ffffffffffffffffffffffffffffffffffffffff166112d9611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690613fe2565b60405180910390fd5b60026009541415611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90614082565b60405180910390fd5b60026009819055506000611387611c3c565b73ffffffffffffffffffffffffffffffffffffffff16476040516113aa90613e6c565b60006040518083038185875af1925050503d80600081146113e7576040519150601f19603f3d011682016040523d82523d6000602084013e6113ec565b606091505b50509050806113fa57600080fd5b506001600981905550565b61142083838360405180602001604052806000815250611f79565b505050565b6060600061143283611942565b905060008167ffffffffffffffff8111156114505761144f614592565b5b60405190808252806020026020018201604052801561147e5781602001602082028036833780820191505090505b509050600061148b61243c565b90506000805b84821080156114a25750600e548311155b15611633576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156115af5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156115bc57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161f578385848151811061160457611603614563565b5b602002602001018181525050828061161b90614438565b9350505b838061162a90614438565b94505050611491565b8395505050505050919050565b611648612382565b73ffffffffffffffffffffffffffffffffffffffff16611666611c3c565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613fe2565b60405180910390fd5b80600d8190555050565b6116ce612382565b73ffffffffffffffffffffffffffffffffffffffff166116ec611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613fe2565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b600c805461176c906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611798906143d5565b80156117e55780601f106117ba576101008083540402835291602001916117e5565b820191906000526020600020905b8154815290600101906020018083116117c857829003601f168201915b505050505081565b600b80546117fa906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611826906143d5565b80156118735780601f1061184857610100808354040283529160200191611873565b820191906000526020600020905b81548152906001019060200180831161185657829003601f168201915b505050505081565b60006118868261296b565b600001519050919050565b611899612382565b73ffffffffffffffffffffffffffffffffffffffff166118b7611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fe2565b60405180910390fd5b80600f8190555050565b60136020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119aa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611a1a612382565b73ffffffffffffffffffffffffffffffffffffffff16611a38611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590613fe2565b60405180910390fd5b611a986000612bfa565b565b611aa2612382565b73ffffffffffffffffffffffffffffffffffffffff16611ac0611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613fe2565b60405180910390fd5b8060108190555050565b611b28612382565b73ffffffffffffffffffffffffffffffffffffffff16611b46611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613fe2565b60405180910390fd5b80600a8190555050565b611bae612382565b73ffffffffffffffffffffffffffffffffffffffff16611bcc611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613fe2565b60405180910390fd5b80600b9080519060200190611c389291906134ae565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600e5481611c73610d23565b611c7d9190614200565b1115611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614022565b60405180910390fd5b611cc6612382565b73ffffffffffffffffffffffffffffffffffffffff16611ce4611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613fe2565b60405180910390fd5b611d448383612936565b505050565b600f5481565b606060038054611d5e906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8a906143d5565b8015611dd75780601f10611dac57610100808354040283529160200191611dd7565b820191906000526020600020905b815481529060010190602001808311611dba57829003601f168201915b5050505050905090565b611de9612382565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e4e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e5b612382565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f08612382565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f4d9190613f0a565b60405180910390a35050565b60126020528060005260406000206000915054906101000a900460ff1681565b611f84848484612445565b611fa38373ffffffffffffffffffffffffffffffffffffffff16612cc0565b8015611fb85750611fb684848484612ce3565b155b15611fef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ffd612382565b73ffffffffffffffffffffffffffffffffffffffff1661201b611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613fe2565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606061209982612334565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614002565b60405180910390fd5b60006120e2612e43565b905060008151116121025760405180602001604052806000815250612130565b8061210c84612ed5565b600c60405160200161212093929190613e3b565b6040516020818303038152906040525b915050919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121da612382565b73ffffffffffffffffffffffffffffffffffffffff166121f8611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590613fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613f82565b60405180910390fd5b6122c781612bfa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161233f61243c565b1115801561234e575060005482105b801561237b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006124508261296b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612477612382565b73ffffffffffffffffffffffffffffffffffffffff1614806124aa57506124a982600001516124a4612382565b61213e565b5b806124ef57506124b8612382565b73ffffffffffffffffffffffffffffffffffffffff166124d784610aed565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612528576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612591576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125f8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126058585856001613036565b612615600084846000015161238a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128c6576000548110156128c55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292f858585600161303c565b5050505050565b612950828260405180602001604052806000815250613042565b5050565b6000826129618584613054565b1490509392505050565b612973613534565b60008290508061298161243c565b11158015612990575060005481105b15612bc3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bc157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612aa5578092505050612bf5565b5b600115612bc057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bbb578092505050612bf5565b612aa6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d09612382565b8786866040518563ffffffff1660e01b8152600401612d2b9493929190613e9c565b602060405180830381600087803b158015612d4557600080fd5b505af1925050508015612d7657506040513d601f19601f82011682018060405250810190612d7391906139df565b60015b612df0573d8060008114612da6576040519150601f19603f3d011682016040523d82523d6000602084013e612dab565b606091505b50600081511415612de8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612e52906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7e906143d5565b8015612ecb5780601f10612ea057610100808354040283529160200191612ecb565b820191906000526020600020905b815481529060010190602001808311612eae57829003601f168201915b5050505050905090565b60606000821415612f1d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613031565b600082905060005b60008214612f4f578080612f3890614438565b915050600a82612f489190614256565b9150612f25565b60008167ffffffffffffffff811115612f6b57612f6a614592565b5b6040519080825280601f01601f191660200182016040528015612f9d5781602001600182028036833780820191505090505b5090505b6000851461302a57600182612fb691906142e1565b9150600a85612fc591906144a5565b6030612fd19190614200565b60f81b818381518110612fe757612fe6614563565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130239190614256565b9450612fa1565b8093505050505b919050565b50505050565b50505050565b61304f83838360016130c9565b505050565b60008082905060005b84518110156130be57600085828151811061307b5761307a614563565b5b6020026020010151905080831161309d576130968382613497565b92506130aa565b6130a78184613497565b92505b5080806130b690614438565b91505061305d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613136576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613171576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61317e6000868387613036565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561334857506133478773ffffffffffffffffffffffffffffffffffffffff16612cc0565b5b1561340e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133bd6000888480600101955088612ce3565b6133f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561334e57826000541461340957600080fd5b61347a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561340f575b816000819055505050613490600086838761303c565b5050505050565b600082600052816020526040600020905092915050565b8280546134ba906143d5565b90600052602060002090601f0160209004810192826134dc5760008555613523565b82601f106134f557805160ff1916838001178555613523565b82800160010185558215613523579182015b82811115613522578251825591602001919060010190613507565b5b5090506135309190613577565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613590576000816000905550600101613578565b5090565b60006135a76135a284614102565b6140dd565b9050828152602081018484840111156135c3576135c26145d0565b5b6135ce848285614393565b509392505050565b60006135e96135e484614133565b6140dd565b905082815260208101848484011115613605576136046145d0565b5b613610848285614393565b509392505050565b6000813590506136278161480f565b92915050565b60008083601f840112613643576136426145c6565b5b8235905067ffffffffffffffff8111156136605761365f6145c1565b5b60208301915083602082028301111561367c5761367b6145cb565b5b9250929050565b60008135905061369281614826565b92915050565b6000813590506136a78161483d565b92915050565b6000813590506136bc81614854565b92915050565b6000815190506136d181614854565b92915050565b600082601f8301126136ec576136eb6145c6565b5b81356136fc848260208601613594565b91505092915050565b600082601f83011261371a576137196145c6565b5b813561372a8482602086016135d6565b91505092915050565b6000813590506137428161486b565b92915050565b60006020828403121561375e5761375d6145da565b5b600061376c84828501613618565b91505092915050565b6000806040838503121561378c5761378b6145da565b5b600061379a85828601613618565b92505060206137ab85828601613618565b9150509250929050565b6000806000606084860312156137ce576137cd6145da565b5b60006137dc86828701613618565b93505060206137ed86828701613618565b92505060406137fe86828701613733565b9150509250925092565b60008060008060808587031215613822576138216145da565b5b600061383087828801613618565b945050602061384187828801613618565b935050604061385287828801613733565b925050606085013567ffffffffffffffff811115613873576138726145d5565b5b61387f878288016136d7565b91505092959194509250565b600080604083850312156138a2576138a16145da565b5b60006138b085828601613618565b92505060206138c185828601613683565b9150509250929050565b600080604083850312156138e2576138e16145da565b5b60006138f085828601613618565b925050602061390185828601613733565b9150509250929050565b60008060208385031215613922576139216145da565b5b600083013567ffffffffffffffff8111156139405761393f6145d5565b5b61394c8582860161362d565b92509250509250929050565b60006020828403121561396e5761396d6145da565b5b600061397c84828501613683565b91505092915050565b60006020828403121561399b5761399a6145da565b5b60006139a984828501613698565b91505092915050565b6000602082840312156139c8576139c76145da565b5b60006139d6848285016136ad565b91505092915050565b6000602082840312156139f5576139f46145da565b5b6000613a03848285016136c2565b91505092915050565b600060208284031215613a2257613a216145da565b5b600082013567ffffffffffffffff811115613a4057613a3f6145d5565b5b613a4c84828501613705565b91505092915050565b600060208284031215613a6b57613a6a6145da565b5b6000613a7984828501613733565b91505092915050565b6000613a8e8383613e02565b60208301905092915050565b613aa381614315565b82525050565b613aba613ab582614315565b614481565b82525050565b6000613acb82614189565b613ad581856141b7565b9350613ae083614164565b8060005b83811015613b11578151613af88882613a82565b9750613b03836141aa565b925050600181019050613ae4565b5085935050505092915050565b613b2781614327565b82525050565b613b3681614333565b82525050565b6000613b4782614194565b613b5181856141c8565b9350613b618185602086016143a2565b613b6a816145df565b840191505092915050565b6000613b808261419f565b613b8a81856141e4565b9350613b9a8185602086016143a2565b613ba3816145df565b840191505092915050565b6000613bb98261419f565b613bc381856141f5565b9350613bd38185602086016143a2565b80840191505092915050565b60008154613bec816143d5565b613bf681866141f5565b94506001821660008114613c115760018114613c2257613c55565b60ff19831686528186019350613c55565b613c2b85614174565b60005b83811015613c4d57815481890152600182019150602081019050613c2e565b838801955050505b50505092915050565b6000613c6b600e836141e4565b9150613c76826145fd565b602082019050919050565b6000613c8e6026836141e4565b9150613c9982614626565b604082019050919050565b6000613cb16014836141e4565b9150613cbc82614675565b602082019050919050565b6000613cd46014836141e4565b9150613cdf8261469e565b602082019050919050565b6000613cf76020836141e4565b9150613d02826146c7565b602082019050919050565b6000613d1a602f836141e4565b9150613d25826146f0565b604082019050919050565b6000613d3d6000836141d9565b9150613d488261473f565b600082019050919050565b6000613d606014836141e4565b9150613d6b82614742565b602082019050919050565b6000613d836017836141e4565b9150613d8e8261476b565b602082019050919050565b6000613da66016836141e4565b9150613db182614794565b602082019050919050565b6000613dc9601f836141e4565b9150613dd4826147bd565b602082019050919050565b6000613dec6013836141e4565b9150613df7826147e6565b602082019050919050565b613e0b81614389565b82525050565b613e1a81614389565b82525050565b6000613e2c8284613aa9565b60148201915081905092915050565b6000613e478286613bae565b9150613e538285613bae565b9150613e5f8284613bdf565b9150819050949350505050565b6000613e7782613d30565b9150819050919050565b6000602082019050613e966000830184613a9a565b92915050565b6000608082019050613eb16000830187613a9a565b613ebe6020830186613a9a565b613ecb6040830185613e11565b8181036060830152613edd8184613b3c565b905095945050505050565b60006020820190508181036000830152613f028184613ac0565b905092915050565b6000602082019050613f1f6000830184613b1e565b92915050565b6000602082019050613f3a6000830184613b2d565b92915050565b60006020820190508181036000830152613f5a8184613b75565b905092915050565b60006020820190508181036000830152613f7b81613c5e565b9050919050565b60006020820190508181036000830152613f9b81613c81565b9050919050565b60006020820190508181036000830152613fbb81613ca4565b9050919050565b60006020820190508181036000830152613fdb81613cc7565b9050919050565b60006020820190508181036000830152613ffb81613cea565b9050919050565b6000602082019050818103600083015261401b81613d0d565b9050919050565b6000602082019050818103600083015261403b81613d53565b9050919050565b6000602082019050818103600083015261405b81613d76565b9050919050565b6000602082019050818103600083015261407b81613d99565b9050919050565b6000602082019050818103600083015261409b81613dbc565b9050919050565b600060208201905081810360008301526140bb81613ddf565b9050919050565b60006020820190506140d76000830184613e11565b92915050565b60006140e76140f8565b90506140f38282614407565b919050565b6000604051905090565b600067ffffffffffffffff82111561411d5761411c614592565b5b614126826145df565b9050602081019050919050565b600067ffffffffffffffff82111561414e5761414d614592565b5b614157826145df565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061420b82614389565b915061421683614389565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561424b5761424a6144d6565b5b828201905092915050565b600061426182614389565b915061426c83614389565b92508261427c5761427b614505565b5b828204905092915050565b600061429282614389565b915061429d83614389565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142d6576142d56144d6565b5b828202905092915050565b60006142ec82614389565b91506142f783614389565b92508282101561430a576143096144d6565b5b828203905092915050565b600061432082614369565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143c05780820151818401526020810190506143a5565b838111156143cf576000848401525b50505050565b600060028204905060018216806143ed57607f821691505b6020821081141561440157614400614534565b5b50919050565b614410826145df565b810181811067ffffffffffffffff8211171561442f5761442e614592565b5b80604052505050565b600061444382614389565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614476576144756144d6565b5b600182019050919050565b600061448c82614493565b9050919050565b600061449e826145f0565b9050919050565b60006144b082614389565b91506144bb83614389565b9250826144cb576144ca614505565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f5075626c6963204d696e74205061757365642121000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f57686974656c697374204d696e74205061757365642121000000000000000000600082015250565b7f4572726f723a20496e76616c69642043616c6c65722100000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61481881614315565b811461482357600080fd5b50565b61482f81614327565b811461483a57600080fd5b50565b61484681614333565b811461485157600080fd5b50565b61485d8161433d565b811461486857600080fd5b50565b61487481614389565b811461487f57600080fd5b5056fea26469706673582212206c902600e8eab0994bde5fde0135b7e683884ee348a02548e82ef4b37b19afe464736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636352211e1161013957806393f84cfe116100b6578063b88d4fde1161007a578063b88d4fde14610859578063bb75f98614610882578063c87b56dd146108ab578063d5abeb01146108e8578063e985e9c514610913578063f2fde38b1461095057610246565b806393f84cfe1461077457806394354fd01461079d57806395d89b41146107c8578063a22cb465146107f3578063ab1686ab1461081c57610246565b8063715018a6116100fd578063715018a6146106b7578063728d41c9146106ce5780637cb64759146106f75780637ec4a659146107205780638da5cb5b1461074957610246565b80636352211e146105ac57806364f5a5bb146105e95780636890c532146106125780636caede3d1461064f57806370a082311461067a57610246565b80632eb4a7ab116101c7578063438b63001161018b578063438b6300146104c757806344a0d68a14610504578063545d66cd1461052d5780635503a0e81461055657806362b99ad41461058157610246565b80632eb4a7ab14610408578063372f657c146104335780633c8463a11461045c5780633ccfd60b1461048757806342842e0e1461049e57610246565b806313faede61161020e57806313faede61461034457806316ba10e01461036f57806318160ddd1461039857806323b872dd146103c35780632db11544146103ec57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f05780630f4161aa14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139b2565b610979565b60405161027f9190613f0a565b60405180910390f35b34801561029457600080fd5b5061029d610a5b565b6040516102aa9190613f40565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a55565b610aed565b6040516102e79190613e81565b60405180910390f35b3480156102fc57600080fd5b50610317600480360381019061031291906138cb565b610b69565b005b34801561032557600080fd5b5061032e610c74565b60405161033b9190613f0a565b60405180910390f35b34801561035057600080fd5b50610359610c87565b60405161036691906140c2565b60405180910390f35b34801561037b57600080fd5b5061039660048036038101906103919190613a0c565b610c8d565b005b3480156103a457600080fd5b506103ad610d23565b6040516103ba91906140c2565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e591906137b5565b610d3a565b005b61040660048036038101906104019190613a55565b610d4a565b005b34801561041457600080fd5b5061041d610fe6565b60405161042a9190613f25565b60405180910390f35b34801561043f57600080fd5b5061045a6004803603810190610455919061390b565b610fec565b005b34801561046857600080fd5b506104716112ad565b60405161047e91906140c2565b60405180910390f35b34801561049357600080fd5b5061049c6112b3565b005b3480156104aa57600080fd5b506104c560048036038101906104c091906137b5565b611405565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613748565b611425565b6040516104fb9190613ee8565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190613a55565b611640565b005b34801561053957600080fd5b50610554600480360381019061054f9190613958565b6116c6565b005b34801561056257600080fd5b5061056b61175f565b6040516105789190613f40565b60405180910390f35b34801561058d57600080fd5b506105966117ed565b6040516105a39190613f40565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce9190613a55565b61187b565b6040516105e09190613e81565b60405180910390f35b3480156105f557600080fd5b50610610600480360381019061060b9190613a55565b611891565b005b34801561061e57600080fd5b5061063960048036038101906106349190613748565b611917565b60405161064691906140c2565b60405180910390f35b34801561065b57600080fd5b5061066461192f565b6040516106719190613f0a565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613748565b611942565b6040516106ae91906140c2565b60405180910390f35b3480156106c357600080fd5b506106cc611a12565b005b3480156106da57600080fd5b506106f560048036038101906106f09190613a55565b611a9a565b005b34801561070357600080fd5b5061071e60048036038101906107199190613985565b611b20565b005b34801561072c57600080fd5b5061074760048036038101906107429190613a0c565b611ba6565b005b34801561075557600080fd5b5061075e611c3c565b60405161076b9190613e81565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906138cb565b611c66565b005b3480156107a957600080fd5b506107b2611d49565b6040516107bf91906140c2565b60405180910390f35b3480156107d457600080fd5b506107dd611d4f565b6040516107ea9190613f40565b60405180910390f35b3480156107ff57600080fd5b5061081a6004803603810190610815919061388b565b611de1565b005b34801561082857600080fd5b50610843600480360381019061083e9190613748565b611f59565b6040516108509190613f0a565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613808565b611f79565b005b34801561088e57600080fd5b506108a960048036038101906108a49190613958565b611ff5565b005b3480156108b757600080fd5b506108d260048036038101906108cd9190613a55565b61208e565b6040516108df9190613f40565b60405180910390f35b3480156108f457600080fd5b506108fd612138565b60405161090a91906140c2565b60405180910390f35b34801561091f57600080fd5b5061093a60048036038101906109359190613775565b61213e565b6040516109479190613f0a565b60405180910390f35b34801561095c57600080fd5b5061097760048036038101906109729190613748565b6121d2565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a545750610a53826122ca565b5b9050919050565b606060028054610a6a906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a96906143d5565b8015610ae35780601f10610ab857610100808354040283529160200191610ae3565b820191906000526020600020905b815481529060010190602001808311610ac657829003601f168201915b5050505050905090565b6000610af882612334565b610b2e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b748261187b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bdc576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bfb612382565b73ffffffffffffffffffffffffffffffffffffffff1614158015610c2d5750610c2b81610c26612382565b61213e565b155b15610c64576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c6f83838361238a565b505050565b601160019054906101000a900460ff1681565b600d5481565b610c95612382565b73ffffffffffffffffffffffffffffffffffffffff16610cb3611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614610d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0090613fe2565b60405180910390fd5b80600c9080519060200190610d1f9291906134ae565b5050565b6000610d2d61243c565b6001546000540303905090565b610d45838383612445565b505050565b80600e5481610d57610d23565b610d619190614200565b1115610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990614022565b60405180910390fd5b8180600d54610db19190614287565b341015610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea906140a2565b60405180910390fd5b601160019054906101000a900460ff16610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3990613fc2565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614062565b60405180910390fd5b600f54831115610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90613fa2565b60405180910390fd5b600033905060105484601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f489190614200565b1115610f80576040517f13bcc66b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8a8185612936565b83601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd99190614200565b9250508190555050505050565b600a5481565b6001600e5481610ffa610d23565b6110049190614200565b1115611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c90614022565b60405180910390fd5b601160009054906101000a900460ff16611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b90614042565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614062565b60405180910390fd5b6000339050601260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561118b576040517f7a7a859000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008160405160200161119e9190613e20565b604051602081830303815290604052805190602001209050611204858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600a5483612954565b611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a90613f62565b60405180910390fd5b61124e826001612936565b6001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050565b60105481565b6112bb612382565b73ffffffffffffffffffffffffffffffffffffffff166112d9611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132690613fe2565b60405180910390fd5b60026009541415611375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136c90614082565b60405180910390fd5b60026009819055506000611387611c3c565b73ffffffffffffffffffffffffffffffffffffffff16476040516113aa90613e6c565b60006040518083038185875af1925050503d80600081146113e7576040519150601f19603f3d011682016040523d82523d6000602084013e6113ec565b606091505b50509050806113fa57600080fd5b506001600981905550565b61142083838360405180602001604052806000815250611f79565b505050565b6060600061143283611942565b905060008167ffffffffffffffff8111156114505761144f614592565b5b60405190808252806020026020018201604052801561147e5781602001602082028036833780820191505090505b509050600061148b61243c565b90506000805b84821080156114a25750600e548311155b15611633576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511580156115af5750600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614155b156115bc57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561161f578385848151811061160457611603614563565b5b602002602001018181525050828061161b90614438565b9350505b838061162a90614438565b94505050611491565b8395505050505050919050565b611648612382565b73ffffffffffffffffffffffffffffffffffffffff16611666611c3c565b73ffffffffffffffffffffffffffffffffffffffff16146116bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b390613fe2565b60405180910390fd5b80600d8190555050565b6116ce612382565b73ffffffffffffffffffffffffffffffffffffffff166116ec611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613fe2565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b600c805461176c906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611798906143d5565b80156117e55780601f106117ba576101008083540402835291602001916117e5565b820191906000526020600020905b8154815290600101906020018083116117c857829003601f168201915b505050505081565b600b80546117fa906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611826906143d5565b80156118735780601f1061184857610100808354040283529160200191611873565b820191906000526020600020905b81548152906001019060200180831161185657829003601f168201915b505050505081565b60006118868261296b565b600001519050919050565b611899612382565b73ffffffffffffffffffffffffffffffffffffffff166118b7611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190490613fe2565b60405180910390fd5b80600f8190555050565b60136020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119aa576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611a1a612382565b73ffffffffffffffffffffffffffffffffffffffff16611a38611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590613fe2565b60405180910390fd5b611a986000612bfa565b565b611aa2612382565b73ffffffffffffffffffffffffffffffffffffffff16611ac0611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90613fe2565b60405180910390fd5b8060108190555050565b611b28612382565b73ffffffffffffffffffffffffffffffffffffffff16611b46611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613fe2565b60405180910390fd5b80600a8190555050565b611bae612382565b73ffffffffffffffffffffffffffffffffffffffff16611bcc611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613fe2565b60405180910390fd5b80600b9080519060200190611c389291906134ae565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600e5481611c73610d23565b611c7d9190614200565b1115611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb590614022565b60405180910390fd5b611cc6612382565b73ffffffffffffffffffffffffffffffffffffffff16611ce4611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190613fe2565b60405180910390fd5b611d448383612936565b505050565b600f5481565b606060038054611d5e906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8a906143d5565b8015611dd75780601f10611dac57610100808354040283529160200191611dd7565b820191906000526020600020905b815481529060010190602001808311611dba57829003601f168201915b5050505050905090565b611de9612382565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e4e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e5b612382565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f08612382565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f4d9190613f0a565b60405180910390a35050565b60126020528060005260406000206000915054906101000a900460ff1681565b611f84848484612445565b611fa38373ffffffffffffffffffffffffffffffffffffffff16612cc0565b8015611fb85750611fb684848484612ce3565b155b15611fef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ffd612382565b73ffffffffffffffffffffffffffffffffffffffff1661201b611c3c565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890613fe2565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606061209982612334565b6120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf90614002565b60405180910390fd5b60006120e2612e43565b905060008151116121025760405180602001604052806000815250612130565b8061210c84612ed5565b600c60405160200161212093929190613e3b565b6040516020818303038152906040525b915050919050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121da612382565b73ffffffffffffffffffffffffffffffffffffffff166121f8611c3c565b73ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224590613fe2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613f82565b60405180910390fd5b6122c781612bfa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161233f61243c565b1115801561234e575060005482105b801561237b575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006124508261296b565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612477612382565b73ffffffffffffffffffffffffffffffffffffffff1614806124aa57506124a982600001516124a4612382565b61213e565b5b806124ef57506124b8612382565b73ffffffffffffffffffffffffffffffffffffffff166124d784610aed565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612528576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612591576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156125f8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126058585856001613036565b612615600084846000015161238a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128c6576000548110156128c55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461292f858585600161303c565b5050505050565b612950828260405180602001604052806000815250613042565b5050565b6000826129618584613054565b1490509392505050565b612973613534565b60008290508061298161243c565b11158015612990575060005481105b15612bc3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612bc157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612aa5578092505050612bf5565b5b600115612bc057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612bbb578092505050612bf5565b612aa6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d09612382565b8786866040518563ffffffff1660e01b8152600401612d2b9493929190613e9c565b602060405180830381600087803b158015612d4557600080fd5b505af1925050508015612d7657506040513d601f19601f82011682018060405250810190612d7391906139df565b60015b612df0573d8060008114612da6576040519150601f19603f3d011682016040523d82523d6000602084013e612dab565b606091505b50600081511415612de8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612e52906143d5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7e906143d5565b8015612ecb5780601f10612ea057610100808354040283529160200191612ecb565b820191906000526020600020905b815481529060010190602001808311612eae57829003601f168201915b5050505050905090565b60606000821415612f1d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613031565b600082905060005b60008214612f4f578080612f3890614438565b915050600a82612f489190614256565b9150612f25565b60008167ffffffffffffffff811115612f6b57612f6a614592565b5b6040519080825280601f01601f191660200182016040528015612f9d5781602001600182028036833780820191505090505b5090505b6000851461302a57600182612fb691906142e1565b9150600a85612fc591906144a5565b6030612fd19190614200565b60f81b818381518110612fe757612fe6614563565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130239190614256565b9450612fa1565b8093505050505b919050565b50505050565b50505050565b61304f83838360016130c9565b505050565b60008082905060005b84518110156130be57600085828151811061307b5761307a614563565b5b6020026020010151905080831161309d576130968382613497565b92506130aa565b6130a78184613497565b92505b5080806130b690614438565b91505061305d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613136576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613171576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61317e6000868387613036565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561334857506133478773ffffffffffffffffffffffffffffffffffffffff16612cc0565b5b1561340e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133bd6000888480600101955088612ce3565b6133f3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561334e57826000541461340957600080fd5b61347a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561340f575b816000819055505050613490600086838761303c565b5050505050565b600082600052816020526040600020905092915050565b8280546134ba906143d5565b90600052602060002090601f0160209004810192826134dc5760008555613523565b82601f106134f557805160ff1916838001178555613523565b82800160010185558215613523579182015b82811115613522578251825591602001919060010190613507565b5b5090506135309190613577565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613590576000816000905550600101613578565b5090565b60006135a76135a284614102565b6140dd565b9050828152602081018484840111156135c3576135c26145d0565b5b6135ce848285614393565b509392505050565b60006135e96135e484614133565b6140dd565b905082815260208101848484011115613605576136046145d0565b5b613610848285614393565b509392505050565b6000813590506136278161480f565b92915050565b60008083601f840112613643576136426145c6565b5b8235905067ffffffffffffffff8111156136605761365f6145c1565b5b60208301915083602082028301111561367c5761367b6145cb565b5b9250929050565b60008135905061369281614826565b92915050565b6000813590506136a78161483d565b92915050565b6000813590506136bc81614854565b92915050565b6000815190506136d181614854565b92915050565b600082601f8301126136ec576136eb6145c6565b5b81356136fc848260208601613594565b91505092915050565b600082601f83011261371a576137196145c6565b5b813561372a8482602086016135d6565b91505092915050565b6000813590506137428161486b565b92915050565b60006020828403121561375e5761375d6145da565b5b600061376c84828501613618565b91505092915050565b6000806040838503121561378c5761378b6145da565b5b600061379a85828601613618565b92505060206137ab85828601613618565b9150509250929050565b6000806000606084860312156137ce576137cd6145da565b5b60006137dc86828701613618565b93505060206137ed86828701613618565b92505060406137fe86828701613733565b9150509250925092565b60008060008060808587031215613822576138216145da565b5b600061383087828801613618565b945050602061384187828801613618565b935050604061385287828801613733565b925050606085013567ffffffffffffffff811115613873576138726145d5565b5b61387f878288016136d7565b91505092959194509250565b600080604083850312156138a2576138a16145da565b5b60006138b085828601613618565b92505060206138c185828601613683565b9150509250929050565b600080604083850312156138e2576138e16145da565b5b60006138f085828601613618565b925050602061390185828601613733565b9150509250929050565b60008060208385031215613922576139216145da565b5b600083013567ffffffffffffffff8111156139405761393f6145d5565b5b61394c8582860161362d565b92509250509250929050565b60006020828403121561396e5761396d6145da565b5b600061397c84828501613683565b91505092915050565b60006020828403121561399b5761399a6145da565b5b60006139a984828501613698565b91505092915050565b6000602082840312156139c8576139c76145da565b5b60006139d6848285016136ad565b91505092915050565b6000602082840312156139f5576139f46145da565b5b6000613a03848285016136c2565b91505092915050565b600060208284031215613a2257613a216145da565b5b600082013567ffffffffffffffff811115613a4057613a3f6145d5565b5b613a4c84828501613705565b91505092915050565b600060208284031215613a6b57613a6a6145da565b5b6000613a7984828501613733565b91505092915050565b6000613a8e8383613e02565b60208301905092915050565b613aa381614315565b82525050565b613aba613ab582614315565b614481565b82525050565b6000613acb82614189565b613ad581856141b7565b9350613ae083614164565b8060005b83811015613b11578151613af88882613a82565b9750613b03836141aa565b925050600181019050613ae4565b5085935050505092915050565b613b2781614327565b82525050565b613b3681614333565b82525050565b6000613b4782614194565b613b5181856141c8565b9350613b618185602086016143a2565b613b6a816145df565b840191505092915050565b6000613b808261419f565b613b8a81856141e4565b9350613b9a8185602086016143a2565b613ba3816145df565b840191505092915050565b6000613bb98261419f565b613bc381856141f5565b9350613bd38185602086016143a2565b80840191505092915050565b60008154613bec816143d5565b613bf681866141f5565b94506001821660008114613c115760018114613c2257613c55565b60ff19831686528186019350613c55565b613c2b85614174565b60005b83811015613c4d57815481890152600182019150602081019050613c2e565b838801955050505b50505092915050565b6000613c6b600e836141e4565b9150613c76826145fd565b602082019050919050565b6000613c8e6026836141e4565b9150613c9982614626565b604082019050919050565b6000613cb16014836141e4565b9150613cbc82614675565b602082019050919050565b6000613cd46014836141e4565b9150613cdf8261469e565b602082019050919050565b6000613cf76020836141e4565b9150613d02826146c7565b602082019050919050565b6000613d1a602f836141e4565b9150613d25826146f0565b604082019050919050565b6000613d3d6000836141d9565b9150613d488261473f565b600082019050919050565b6000613d606014836141e4565b9150613d6b82614742565b602082019050919050565b6000613d836017836141e4565b9150613d8e8261476b565b602082019050919050565b6000613da66016836141e4565b9150613db182614794565b602082019050919050565b6000613dc9601f836141e4565b9150613dd4826147bd565b602082019050919050565b6000613dec6013836141e4565b9150613df7826147e6565b602082019050919050565b613e0b81614389565b82525050565b613e1a81614389565b82525050565b6000613e2c8284613aa9565b60148201915081905092915050565b6000613e478286613bae565b9150613e538285613bae565b9150613e5f8284613bdf565b9150819050949350505050565b6000613e7782613d30565b9150819050919050565b6000602082019050613e966000830184613a9a565b92915050565b6000608082019050613eb16000830187613a9a565b613ebe6020830186613a9a565b613ecb6040830185613e11565b8181036060830152613edd8184613b3c565b905095945050505050565b60006020820190508181036000830152613f028184613ac0565b905092915050565b6000602082019050613f1f6000830184613b1e565b92915050565b6000602082019050613f3a6000830184613b2d565b92915050565b60006020820190508181036000830152613f5a8184613b75565b905092915050565b60006020820190508181036000830152613f7b81613c5e565b9050919050565b60006020820190508181036000830152613f9b81613c81565b9050919050565b60006020820190508181036000830152613fbb81613ca4565b9050919050565b60006020820190508181036000830152613fdb81613cc7565b9050919050565b60006020820190508181036000830152613ffb81613cea565b9050919050565b6000602082019050818103600083015261401b81613d0d565b9050919050565b6000602082019050818103600083015261403b81613d53565b9050919050565b6000602082019050818103600083015261405b81613d76565b9050919050565b6000602082019050818103600083015261407b81613d99565b9050919050565b6000602082019050818103600083015261409b81613dbc565b9050919050565b600060208201905081810360008301526140bb81613ddf565b9050919050565b60006020820190506140d76000830184613e11565b92915050565b60006140e76140f8565b90506140f38282614407565b919050565b6000604051905090565b600067ffffffffffffffff82111561411d5761411c614592565b5b614126826145df565b9050602081019050919050565b600067ffffffffffffffff82111561414e5761414d614592565b5b614157826145df565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061420b82614389565b915061421683614389565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561424b5761424a6144d6565b5b828201905092915050565b600061426182614389565b915061426c83614389565b92508261427c5761427b614505565b5b828204905092915050565b600061429282614389565b915061429d83614389565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142d6576142d56144d6565b5b828202905092915050565b60006142ec82614389565b91506142f783614389565b92508282101561430a576143096144d6565b5b828203905092915050565b600061432082614369565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143c05780820151818401526020810190506143a5565b838111156143cf576000848401525b50505050565b600060028204905060018216806143ed57607f821691505b6020821081141561440157614400614534565b5b50919050565b614410826145df565b810181811067ffffffffffffffff8211171561442f5761442e614592565b5b80604052505050565b600061444382614389565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614476576144756144d6565b5b600182019050919050565b600061448c82614493565b9050919050565b600061449e826145f0565b9050919050565b60006144b082614389565b91506144bb83614389565b9250826144cb576144ca614505565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f5075626c6963204d696e74205061757365642121000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f57686974656c697374204d696e74205061757365642121000000000000000000600082015250565b7f4572726f723a20496e76616c69642043616c6c65722100000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61481881614315565b811461482357600080fd5b50565b61482f81614327565b811461483a57600080fd5b50565b61484681614333565b811461485157600080fd5b50565b61485d8161433d565b811461486857600080fd5b50565b61487481614389565b811461487f57600080fd5b5056fea26469706673582212206c902600e8eab0994bde5fde0135b7e683884ee348a02548e82ef4b37b19afe464736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002

-----Decoded View---------------
Arg [0] : _MaxTx (uint256): 2
Arg [1] : _MaxWallet (uint256): 2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000002


Deployed Bytecode Sourcemap

32165:5027:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14546:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17940:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19451:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19011:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32584:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36679:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13793:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20313:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33797:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32268:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33210:578;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32504:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36907:160;;;;;;;;;;;;;:::i;:::-;;20555:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34598:896;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36262:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36143:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32338:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32303:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17748:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36351:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32687:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32537:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14916:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4207:103;;;;;;;;;;;;;:::i;:::-;;36459:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36794:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36564:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3982:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34444:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32467:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18110:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19729:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32631:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20812:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36018:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35613:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32424:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20081:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4319:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14546:305;14648:4;14700:25;14685:40;;;:11;:40;;;;:105;;;;14757:33;14742:48;;;:11;:48;;;;14685:105;:158;;;;14807:36;14831:11;14807:23;:36::i;:::-;14685:158;14665:178;;14546:305;;;:::o;17940:100::-;17994:13;18027:5;18020:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17940:100;:::o;19451:205::-;19519:7;19544:16;19552:7;19544;:16::i;:::-;19539:64;;19569:34;;;;;;;;;;;;;;19539:64;19624:15;:24;19640:7;19624:24;;;;;;;;;;;;;;;;;;;;;19617:31;;19451:205;;;:::o;19011:373::-;19084:13;19100:24;19116:7;19100:15;:24::i;:::-;19084:40;;19145:5;19139:11;;:2;:11;;;19135:48;;;19159:24;;;;;;;;;;;;;;19135:48;19217:5;19201:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;19227:37;19244:5;19251:12;:10;:12::i;:::-;19227:16;:37::i;:::-;19226:38;19201:63;19197:138;;;19288:35;;;;;;;;;;;;;;19197:138;19348:28;19357:2;19361:7;19370:5;19348:8;:28::i;:::-;19073:311;19011:373;;:::o;32584:37::-;;;;;;;;;;;;;:::o;32381:33::-;;;;:::o;36679:106::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36767:10:::1;36755:9;:22;;;;;;;;;;;;:::i;:::-;;36679:106:::0;:::o;13793:303::-;13837:7;14062:15;:13;:15::i;:::-;14047:12;;14031:13;;:28;:46;14024:53;;13793:303;:::o;20313:170::-;20447:28;20457:4;20463:2;20467:7;20447:9;:28::i;:::-;20313:170;;;:::o;33797:556::-;33868:11;32994:9;;32979:11;32963:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;32955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33901:11:::1;33146;33139:4;;:18;;;;:::i;:::-;33126:9;:31;;33118:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33933:17:::2;;;;;;;;;;;33925:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;34006:10;33993:23;;:9;:23;;;33985:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34076:18;;34061:11;:33;;34053:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34130:15;34148:10;34130:28;;34204:11;;34190;34172:6;:15;34179:7;34172:15;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:43;34169:94;;;34239:12;;;;;;;;;;;;;;34169:94;34273:31;34283:7;34292:11;34273:9;:31::i;:::-;34334:11;34315:6;:15;34322:7;34315:15;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;33914:439;33039:1:::1;33797:556:::0;;:::o;32268:25::-;;;;:::o;33210:578::-;33288:1;32994:9;;32979:11;32963:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;32955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33310:20:::1;;;;;;;;;;;33302:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33389:10;33376:23;;:9;:23;;;33368:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33436:15;33454:10;33436:28;;33478:16;:25;33495:7;33478:25;;;;;;;;;;;;;;;;;;;;;;;;;33475:81;;;33527:17;;;;;;;;;;;;;;33475:81;33566:12;33608:7;33591:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;33581:36;;;;;;33566:51;;33636:50;33655:12;;33636:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33669:10;;33681:4;33636:18;:50::i;:::-;33628:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;33716:21;33726:7;33735:1;33716:9;:21::i;:::-;33776:4;33748:16;:25;33765:7;33748:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;33291:497;;33210:578:::0;;;:::o;32504:23::-;;;;:::o;36907:160::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;192:1:::1;340:7;;:19;;332:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;192:1;406:7;:18;;;;36969:7:::2;36990;:5;:7::i;:::-;36982:21;;37011;36982:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36968:69;;;37056:2;37048:11;;;::::0;::::2;;36957:110;148:1:::1;447:7;:22;;;;36907:160::o:0;20555:185::-;20693:39;20710:4;20716:2;20720:7;20693:39;;;;;;;;;;;;:16;:39::i;:::-;20555:185;;;:::o;34598:896::-;34658:16;34687:23;34713:17;34723:6;34713:9;:17::i;:::-;34687:43;;34741:30;34788:15;34774:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34741:63;;34815:22;34840:15;:13;:15::i;:::-;34815:40;;34866:23;34904:26;34944:509;34969:15;34951;:33;:64;;;;;35006:9;;34988:14;:27;;34951:64;34944:509;;;35032:31;35066:11;:27;35078:14;35066:27;;;;;;;;;;;35032:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35116:9;:16;;;35115:17;:49;;;;;35162:1;35136:28;;:9;:14;;;:28;;;;35115:49;35111:125;;;35206:9;:14;;;35185:35;;35111:125;35279:6;35257:28;;:18;:28;;;35253:155;;;35339:14;35306:13;35320:15;35306:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;35375:17;;;;;:::i;:::-;;;;35253:155;35425:16;;;;;:::i;:::-;;;;35017:436;34944:509;;;35473:13;35466:20;;;;;;;34598:896;;;:::o;36262:80::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36329:5:::1;36322:4;:12;;;;36262:80:::0;:::o;36143:110::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36238:7:::1;36218:17;;:27;;;;;;;;;;;;;;;;;;36143:110:::0;:::o;32338:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32303:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;17748:124::-;17812:7;17839:20;17851:7;17839:11;:20::i;:::-;:25;;;17832:32;;17748:124;;;:::o;36351:99::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36436:6:::1;36415:18;:27;;;;36351:99:::0;:::o;32687:42::-;;;;;;;;;;;;;;;;;:::o;32537:40::-;;;;;;;;;;;;;:::o;14916:206::-;14980:7;15021:1;15004:19;;:5;:19;;;15000:60;;;15032:28;;;;;;;;;;;;;;15000:60;15086:12;:19;15099:5;15086:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;15078:36;;15071:43;;14916:206;;;:::o;4207:103::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4272:30:::1;4299:1;4272:18;:30::i;:::-;4207:103::o:0;36459:96::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36541:6:::1;36527:11;:20;;;;36459:96:::0;:::o;36794:104::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36879:11:::1;36866:10;:24;;;;36794:104:::0;:::o;36564:106::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36652:10:::1;36640:9;:22;;;;;;;;;;;;:::i;:::-;;36564:106:::0;:::o;3982:87::-;4028:7;4055:6;;;;;;;;;;;4048:13;;3982:87;:::o;34444:145::-;34519:11;32994:9;;32979:11;32963:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;32955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4129:12:::1;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34553:28:::2;34563:4;34569:11;34553:9;:28::i;:::-;34444:145:::0;;;:::o;32467:30::-;;;;:::o;18110:104::-;18166:13;18199:7;18192:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18110:104;:::o;19729:280::-;19832:12;:10;:12::i;:::-;19820:24;;:8;:24;;;19816:54;;;19853:17;;;;;;;;;;;;;;19816:54;19929:8;19884:18;:32;19903:12;:10;:12::i;:::-;19884:32;;;;;;;;;;;;;;;:42;19917:8;19884:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;19982:8;19953:48;;19968:12;:10;:12::i;:::-;19953:48;;;19992:8;19953:48;;;;;;:::i;:::-;;;;;;;;19729:280;;:::o;32631:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;20812:369::-;20979:28;20989:4;20995:2;20999:7;20979:9;:28::i;:::-;21022:15;:2;:13;;;:15::i;:::-;:76;;;;;21042:56;21073:4;21079:2;21083:7;21092:5;21042:30;:56::i;:::-;21041:57;21022:76;21018:156;;;21122:40;;;;;;;;;;;;;;21018:156;20812:369;;;;:::o;36018:116::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36119:7:::1;36096:20;;:30;;;;;;;;;;;;;;;;;;36018:116:::0;:::o;35613:396::-;35687:13;35721:17;35729:8;35721:7;:17::i;:::-;35713:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;35804:28;35835:10;:8;:10::i;:::-;35804:41;;35894:1;35869:14;35863:28;:32;:138;;;;;;;;;;;;;;;;;35935:14;35951:19;:8;:17;:19::i;:::-;35972:9;35918:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35863:138;35856:145;;;35613:396;;;:::o;32424:31::-;;;;:::o;20081:164::-;20178:4;20202:18;:25;20221:5;20202:25;;;;;;;;;;;;;;;:35;20228:8;20202:35;;;;;;;;;;;;;;;;;;;;;;;;;20195:42;;20081:164;;;;:::o;4319:201::-;4129:12;:10;:12::i;:::-;4118:23;;:7;:5;:7::i;:::-;:23;;;4110:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4428:1:::1;4408:22;;:8;:22;;;;4400:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4484:28;4503:8;4484:18;:28::i;:::-;4319:201:::0;:::o;8735:157::-;8820:4;8859:25;8844:40;;;:11;:40;;;;8837:47;;8735:157;;;:::o;21437:187::-;21494:4;21537:7;21518:15;:13;:15::i;:::-;:26;;:53;;;;;21558:13;;21548:7;:23;21518:53;:98;;;;;21589:11;:20;21601:7;21589:20;;;;;;;;;;;:27;;;;;;;;;;;;21588:28;21518:98;21511:105;;21437:187;;;:::o;3523:98::-;3576:7;3603:10;3596:17;;3523:98;:::o;29074:196::-;29216:2;29189:15;:24;29205:7;29189:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29254:7;29250:2;29234:28;;29243:5;29234:28;;;;;;;;;;;;29074:196;;;:::o;35503:101::-;35568:7;35595:1;35588:8;;35503:101;:::o;24559:2120::-;24674:35;24712:20;24724:7;24712:11;:20::i;:::-;24674:58;;24746:22;24788:13;:18;;;24772:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;24823:50;24840:13;:18;;;24860:12;:10;:12::i;:::-;24823:16;:50::i;:::-;24772:101;:154;;;;24914:12;:10;:12::i;:::-;24890:36;;:20;24902:7;24890:11;:20::i;:::-;:36;;;24772:154;24746:181;;24946:17;24941:66;;24972:35;;;;;;;;;;;;;;24941:66;25044:4;25022:26;;:13;:18;;;:26;;;25018:67;;25057:28;;;;;;;;;;;;;;25018:67;25114:1;25100:16;;:2;:16;;;25096:52;;;25125:23;;;;;;;;;;;;;;25096:52;25162:43;25184:4;25190:2;25194:7;25203:1;25162:21;:43::i;:::-;25271:49;25288:1;25292:7;25301:13;:18;;;25271:8;:49::i;:::-;25647:1;25617:12;:18;25630:4;25617:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25691:1;25663:12;:16;25676:2;25663:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25738:2;25710:11;:20;25722:7;25710:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;25800:15;25755:11;:20;25767:7;25755:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;26069:19;26101:1;26091:7;:11;26069:33;;26162:1;26121:43;;:11;:24;26133:11;26121:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;26117:445;;;26346:13;;26332:11;:27;26328:219;;;26416:13;:18;;;26384:11;:24;26396:11;26384:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;26499:13;:28;;;26457:11;:24;26469:11;26457:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;26328:219;26117:445;25592:981;26610:7;26606:2;26591:27;;26600:4;26591:27;;;;;;;;;;;;26629:42;26650:4;26656:2;26660:7;26669:1;26629:20;:42::i;:::-;24663:2016;;24559:2120;;;:::o;21633:104::-;21702:27;21712:2;21716:8;21702:27;;;;;;;;;;;;:9;:27::i;:::-;21633:104;;:::o;518:190::-;643:4;696;667:25;680:5;687:4;667:12;:25::i;:::-;:33;660:40;;518:190;;;;;:::o;16576:1109::-;16637:21;;:::i;:::-;16671:12;16686:7;16671:22;;16755:4;16736:15;:13;:15::i;:::-;:23;;:47;;;;;16770:13;;16763:4;:20;16736:47;16732:886;;;16804:31;16838:11;:17;16850:4;16838:17;;;;;;;;;;;16804:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16879:9;:16;;;16874:729;;16950:1;16924:28;;:9;:14;;;:28;;;16920:101;;16988:9;16981:16;;;;;;16920:101;17323:261;17330:4;17323:261;;;17363:6;;;;;;;;17408:11;:17;17420:4;17408:17;;;;;;;;;;;17396:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17482:1;17456:28;;:9;:14;;;:28;;;17452:109;;17524:9;17517:16;;;;;;17452:109;17323:261;;;16874:729;16785:833;16732:886;17646:31;;;;;;;;;;;;;;16576:1109;;;;:::o;4529:191::-;4603:16;4622:6;;;;;;;;;;;4603:25;;4648:8;4639:6;;:17;;;;;;;;;;;;;;;;;;4703:8;4672:40;;4693:8;4672:40;;;;;;;;;;;;4592:128;4529:191;:::o;4757:115::-;4817:4;4863:1;4841:7;:19;;;:23;4834:30;;4757:115;;;:::o;29763:667::-;29926:4;29963:2;29947:36;;;29984:12;:10;:12::i;:::-;29998:4;30004:7;30013:5;29947:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29943:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30198:1;30181:6;:13;:18;30177:235;;;30227:40;;;;;;;;;;;;;;30177:235;30370:6;30364:13;30355:6;30351:2;30347:15;30340:38;29943:480;30076:45;;;30066:55;;;:6;:55;;;;30059:62;;;29763:667;;;;;;:::o;37076:110::-;37136:13;37169:9;37162:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37076:110;:::o;1724:724::-;1780:13;2011:1;2002:5;:10;1998:53;;;2029:10;;;;;;;;;;;;;;;;;;;;;1998:53;2061:12;2076:5;2061:20;;2092:14;2117:78;2132:1;2124:4;:9;2117:78;;2150:8;;;;;:::i;:::-;;;;2181:2;2173:10;;;;;:::i;:::-;;;2117:78;;;2205:19;2237:6;2227:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2205:39;;2255:154;2271:1;2262:5;:10;2255:154;;2299:1;2289:11;;;;;:::i;:::-;;;2366:2;2358:5;:10;;;;:::i;:::-;2345:2;:24;;;;:::i;:::-;2332:39;;2315:6;2322;2315:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2395:2;2386:11;;;;;:::i;:::-;;;2255:154;;;2433:6;2419:21;;;;;1724:724;;;;:::o;31079:159::-;;;;;:::o;31898:158::-;;;;;:::o;22101:163::-;22224:32;22230:2;22234:8;22244:5;22251:4;22224:5;:32::i;:::-;22101:163;;;:::o;717:675::-;800:7;820:20;843:4;820:27;;863:9;858:497;882:5;:12;878:1;:16;858:497;;;916:20;939:5;945:1;939:8;;;;;;;;:::i;:::-;;;;;;;;916:31;;982:12;966;:28;962:382;;1109:42;1124:12;1138;1109:14;:42::i;:::-;1094:57;;962:382;;;1286:42;1301:12;1315;1286:14;:42::i;:::-;1271:57;;962:382;901:454;896:3;;;;;:::i;:::-;;;;858:497;;;;1372:12;1365:19;;;717:675;;;;:::o;22524:1780::-;22663:20;22686:13;;22663:36;;22728:1;22714:16;;:2;:16;;;22710:48;;;22739:19;;;;;;;;;;;;;;22710:48;22785:1;22773:8;:13;22769:44;;;22795:18;;;;;;;;;;;;;;22769:44;22827:61;22857:1;22861:2;22865:12;22879:8;22827:21;:61::i;:::-;23201:8;23166:12;:16;23179:2;23166:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23265:8;23225:12;:16;23238:2;23225:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23325:2;23292:11;:25;23304:12;23292:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;23392:15;23342:11;:25;23354:12;23342:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;23426:20;23449:12;23426:35;;23476:11;23505:8;23490:12;:23;23476:37;;23535:4;:23;;;;;23543:15;:2;:13;;;:15::i;:::-;23535:23;23531:641;;;23579:314;23635:12;23631:2;23610:38;;23627:1;23610:38;;;;;;;;;;;;23676:69;23715:1;23719:2;23723:14;;;;;;23739:5;23676:30;:69::i;:::-;23671:174;;23781:40;;;;;;;;;;;;;;23671:174;23888:3;23872:12;:19;;23579:314;;23974:12;23957:13;;:29;23953:43;;23988:8;;;23953:43;23531:641;;;24037:120;24093:14;;;;;;24089:2;24068:40;;24085:1;24068:40;;;;;;;;;;;;24152:3;24136:12;:19;;24037:120;;23531:641;24202:12;24186:13;:28;;;;23141:1085;;24236:60;24265:1;24269:2;24273:12;24287:8;24236:20;:60::i;:::-;22652:1652;22524:1780;;;;:::o;1401:224::-;1469:13;1532:1;1526:4;1519:15;1561:1;1555:4;1548:15;1602:4;1596;1586:21;1577:30;;1401:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:323::-;6977:6;7026:2;7014:9;7005:7;7001:23;6997:32;6994:119;;;7032:79;;:::i;:::-;6994:119;7152:1;7177:50;7219:7;7210:6;7199:9;7195:22;7177:50;:::i;:::-;7167:60;;7123:114;6921:323;;;;:::o;7250:329::-;7309:6;7358:2;7346:9;7337:7;7333:23;7329:32;7326:119;;;7364:79;;:::i;:::-;7326:119;7484:1;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7455:117;7250:329;;;;:::o;7585:327::-;7643:6;7692:2;7680:9;7671:7;7667:23;7663:32;7660:119;;;7698:79;;:::i;:::-;7660:119;7818:1;7843:52;7887:7;7878:6;7867:9;7863:22;7843:52;:::i;:::-;7833:62;;7789:116;7585:327;;;;:::o;7918:349::-;7987:6;8036:2;8024:9;8015:7;8011:23;8007:32;8004:119;;;8042:79;;:::i;:::-;8004:119;8162:1;8187:63;8242:7;8233:6;8222:9;8218:22;8187:63;:::i;:::-;8177:73;;8133:127;7918:349;;;;:::o;8273:509::-;8342:6;8391:2;8379:9;8370:7;8366:23;8362:32;8359:119;;;8397:79;;:::i;:::-;8359:119;8545:1;8534:9;8530:17;8517:31;8575:18;8567:6;8564:30;8561:117;;;8597:79;;:::i;:::-;8561:117;8702:63;8757:7;8748:6;8737:9;8733:22;8702:63;:::i;:::-;8692:73;;8488:287;8273:509;;;;:::o;8788:329::-;8847:6;8896:2;8884:9;8875:7;8871:23;8867:32;8864:119;;;8902:79;;:::i;:::-;8864:119;9022:1;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8993:117;8788:329;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9432:157::-;9537:45;9557:24;9575:5;9557:24;:::i;:::-;9537:45;:::i;:::-;9532:3;9525:58;9432:157;;:::o;9625:732::-;9744:3;9773:54;9821:5;9773:54;:::i;:::-;9843:86;9922:6;9917:3;9843:86;:::i;:::-;9836:93;;9953:56;10003:5;9953:56;:::i;:::-;10032:7;10063:1;10048:284;10073:6;10070:1;10067:13;10048:284;;;10149:6;10143:13;10176:63;10235:3;10220:13;10176:63;:::i;:::-;10169:70;;10262:60;10315:6;10262:60;:::i;:::-;10252:70;;10108:224;10095:1;10092;10088:9;10083:14;;10048:284;;;10052:14;10348:3;10341:10;;9749:608;;;9625:732;;;;:::o;10363:109::-;10444:21;10459:5;10444:21;:::i;:::-;10439:3;10432:34;10363:109;;:::o;10478:118::-;10565:24;10583:5;10565:24;:::i;:::-;10560:3;10553:37;10478:118;;:::o;10602:360::-;10688:3;10716:38;10748:5;10716:38;:::i;:::-;10770:70;10833:6;10828:3;10770:70;:::i;:::-;10763:77;;10849:52;10894:6;10889:3;10882:4;10875:5;10871:16;10849:52;:::i;:::-;10926:29;10948:6;10926:29;:::i;:::-;10921:3;10917:39;10910:46;;10692:270;10602:360;;;;:::o;10968:364::-;11056:3;11084:39;11117:5;11084:39;:::i;:::-;11139:71;11203:6;11198:3;11139:71;:::i;:::-;11132:78;;11219:52;11264:6;11259:3;11252:4;11245:5;11241:16;11219:52;:::i;:::-;11296:29;11318:6;11296:29;:::i;:::-;11291:3;11287:39;11280:46;;11060:272;10968:364;;;;:::o;11338:377::-;11444:3;11472:39;11505:5;11472:39;:::i;:::-;11527:89;11609:6;11604:3;11527:89;:::i;:::-;11520:96;;11625:52;11670:6;11665:3;11658:4;11651:5;11647:16;11625:52;:::i;:::-;11702:6;11697:3;11693:16;11686:23;;11448:267;11338:377;;;;:::o;11745:845::-;11848:3;11885:5;11879:12;11914:36;11940:9;11914:36;:::i;:::-;11966:89;12048:6;12043:3;11966:89;:::i;:::-;11959:96;;12086:1;12075:9;12071:17;12102:1;12097:137;;;;12248:1;12243:341;;;;12064:520;;12097:137;12181:4;12177:9;12166;12162:25;12157:3;12150:38;12217:6;12212:3;12208:16;12201:23;;12097:137;;12243:341;12310:38;12342:5;12310:38;:::i;:::-;12370:1;12384:154;12398:6;12395:1;12392:13;12384:154;;;12472:7;12466:14;12462:1;12457:3;12453:11;12446:35;12522:1;12513:7;12509:15;12498:26;;12420:4;12417:1;12413:12;12408:17;;12384:154;;;12567:6;12562:3;12558:16;12551:23;;12250:334;;12064:520;;11852:738;;11745:845;;;;:::o;12596:366::-;12738:3;12759:67;12823:2;12818:3;12759:67;:::i;:::-;12752:74;;12835:93;12924:3;12835:93;:::i;:::-;12953:2;12948:3;12944:12;12937:19;;12596:366;;;:::o;12968:::-;13110:3;13131:67;13195:2;13190:3;13131:67;:::i;:::-;13124:74;;13207:93;13296:3;13207:93;:::i;:::-;13325:2;13320:3;13316:12;13309:19;;12968:366;;;:::o;13340:::-;13482:3;13503:67;13567:2;13562:3;13503:67;:::i;:::-;13496:74;;13579:93;13668:3;13579:93;:::i;:::-;13697:2;13692:3;13688:12;13681:19;;13340:366;;;:::o;13712:::-;13854:3;13875:67;13939:2;13934:3;13875:67;:::i;:::-;13868:74;;13951:93;14040:3;13951:93;:::i;:::-;14069:2;14064:3;14060:12;14053:19;;13712:366;;;:::o;14084:::-;14226:3;14247:67;14311:2;14306:3;14247:67;:::i;:::-;14240:74;;14323:93;14412:3;14323:93;:::i;:::-;14441:2;14436:3;14432:12;14425:19;;14084:366;;;:::o;14456:::-;14598:3;14619:67;14683:2;14678:3;14619:67;:::i;:::-;14612:74;;14695:93;14784:3;14695:93;:::i;:::-;14813:2;14808:3;14804:12;14797:19;;14456:366;;;:::o;14828:398::-;14987:3;15008:83;15089:1;15084:3;15008:83;:::i;:::-;15001:90;;15100:93;15189:3;15100:93;:::i;:::-;15218:1;15213:3;15209:11;15202:18;;14828:398;;;:::o;15232:366::-;15374:3;15395:67;15459:2;15454:3;15395:67;:::i;:::-;15388:74;;15471:93;15560:3;15471:93;:::i;:::-;15589:2;15584:3;15580:12;15573:19;;15232:366;;;:::o;15604:::-;15746:3;15767:67;15831:2;15826:3;15767:67;:::i;:::-;15760:74;;15843:93;15932:3;15843:93;:::i;:::-;15961:2;15956:3;15952:12;15945:19;;15604:366;;;:::o;15976:::-;16118:3;16139:67;16203:2;16198:3;16139:67;:::i;:::-;16132:74;;16215:93;16304:3;16215:93;:::i;:::-;16333:2;16328:3;16324:12;16317:19;;15976:366;;;:::o;16348:::-;16490:3;16511:67;16575:2;16570:3;16511:67;:::i;:::-;16504:74;;16587:93;16676:3;16587:93;:::i;:::-;16705:2;16700:3;16696:12;16689:19;;16348:366;;;:::o;16720:::-;16862:3;16883:67;16947:2;16942:3;16883:67;:::i;:::-;16876:74;;16959:93;17048:3;16959:93;:::i;:::-;17077:2;17072:3;17068:12;17061:19;;16720:366;;;:::o;17092:108::-;17169:24;17187:5;17169:24;:::i;:::-;17164:3;17157:37;17092:108;;:::o;17206:118::-;17293:24;17311:5;17293:24;:::i;:::-;17288:3;17281:37;17206:118;;:::o;17330:256::-;17442:3;17457:75;17528:3;17519:6;17457:75;:::i;:::-;17557:2;17552:3;17548:12;17541:19;;17577:3;17570:10;;17330:256;;;;:::o;17592:589::-;17817:3;17839:95;17930:3;17921:6;17839:95;:::i;:::-;17832:102;;17951:95;18042:3;18033:6;17951:95;:::i;:::-;17944:102;;18063:92;18151:3;18142:6;18063:92;:::i;:::-;18056:99;;18172:3;18165:10;;17592:589;;;;;;:::o;18187:379::-;18371:3;18393:147;18536:3;18393:147;:::i;:::-;18386:154;;18557:3;18550:10;;18187:379;;;:::o;18572:222::-;18665:4;18703:2;18692:9;18688:18;18680:26;;18716:71;18784:1;18773:9;18769:17;18760:6;18716:71;:::i;:::-;18572:222;;;;:::o;18800:640::-;18995:4;19033:3;19022:9;19018:19;19010:27;;19047:71;19115:1;19104:9;19100:17;19091:6;19047:71;:::i;:::-;19128:72;19196:2;19185:9;19181:18;19172:6;19128:72;:::i;:::-;19210;19278:2;19267:9;19263:18;19254:6;19210:72;:::i;:::-;19329:9;19323:4;19319:20;19314:2;19303:9;19299:18;19292:48;19357:76;19428:4;19419:6;19357:76;:::i;:::-;19349:84;;18800:640;;;;;;;:::o;19446:373::-;19589:4;19627:2;19616:9;19612:18;19604:26;;19676:9;19670:4;19666:20;19662:1;19651:9;19647:17;19640:47;19704:108;19807:4;19798:6;19704:108;:::i;:::-;19696:116;;19446:373;;;;:::o;19825:210::-;19912:4;19950:2;19939:9;19935:18;19927:26;;19963:65;20025:1;20014:9;20010:17;20001:6;19963:65;:::i;:::-;19825:210;;;;:::o;20041:222::-;20134:4;20172:2;20161:9;20157:18;20149:26;;20185:71;20253:1;20242:9;20238:17;20229:6;20185:71;:::i;:::-;20041:222;;;;:::o;20269:313::-;20382:4;20420:2;20409:9;20405:18;20397:26;;20469:9;20463:4;20459:20;20455:1;20444:9;20440:17;20433:47;20497:78;20570:4;20561:6;20497:78;:::i;:::-;20489:86;;20269:313;;;;:::o;20588:419::-;20754:4;20792:2;20781:9;20777:18;20769:26;;20841:9;20835:4;20831:20;20827:1;20816:9;20812:17;20805:47;20869:131;20995:4;20869:131;:::i;:::-;20861:139;;20588:419;;;:::o;21013:::-;21179:4;21217:2;21206:9;21202:18;21194:26;;21266:9;21260:4;21256:20;21252:1;21241:9;21237:17;21230:47;21294:131;21420:4;21294:131;:::i;:::-;21286:139;;21013:419;;;:::o;21438:::-;21604:4;21642:2;21631:9;21627:18;21619:26;;21691:9;21685:4;21681:20;21677:1;21666:9;21662:17;21655:47;21719:131;21845:4;21719:131;:::i;:::-;21711:139;;21438:419;;;:::o;21863:::-;22029:4;22067:2;22056:9;22052:18;22044:26;;22116:9;22110:4;22106:20;22102:1;22091:9;22087:17;22080:47;22144:131;22270:4;22144:131;:::i;:::-;22136:139;;21863:419;;;:::o;22288:::-;22454:4;22492:2;22481:9;22477:18;22469:26;;22541:9;22535:4;22531:20;22527:1;22516:9;22512:17;22505:47;22569:131;22695:4;22569:131;:::i;:::-;22561:139;;22288:419;;;:::o;22713:::-;22879:4;22917:2;22906:9;22902:18;22894:26;;22966:9;22960:4;22956:20;22952:1;22941:9;22937:17;22930:47;22994:131;23120:4;22994:131;:::i;:::-;22986:139;;22713:419;;;:::o;23138:::-;23304:4;23342:2;23331:9;23327:18;23319:26;;23391:9;23385:4;23381:20;23377:1;23366:9;23362:17;23355:47;23419:131;23545:4;23419:131;:::i;:::-;23411:139;;23138:419;;;:::o;23563:::-;23729:4;23767:2;23756:9;23752:18;23744:26;;23816:9;23810:4;23806:20;23802:1;23791:9;23787:17;23780:47;23844:131;23970:4;23844:131;:::i;:::-;23836:139;;23563:419;;;:::o;23988:::-;24154:4;24192:2;24181:9;24177:18;24169:26;;24241:9;24235:4;24231:20;24227:1;24216:9;24212:17;24205:47;24269:131;24395:4;24269:131;:::i;:::-;24261:139;;23988:419;;;:::o;24413:::-;24579:4;24617:2;24606:9;24602:18;24594:26;;24666:9;24660:4;24656:20;24652:1;24641:9;24637:17;24630:47;24694:131;24820:4;24694:131;:::i;:::-;24686:139;;24413:419;;;:::o;24838:::-;25004:4;25042:2;25031:9;25027:18;25019:26;;25091:9;25085:4;25081:20;25077:1;25066:9;25062:17;25055:47;25119:131;25245:4;25119:131;:::i;:::-;25111:139;;24838:419;;;:::o;25263:222::-;25356:4;25394:2;25383:9;25379:18;25371:26;;25407:71;25475:1;25464:9;25460:17;25451:6;25407:71;:::i;:::-;25263:222;;;;:::o;25491:129::-;25525:6;25552:20;;:::i;:::-;25542:30;;25581:33;25609:4;25601:6;25581:33;:::i;:::-;25491:129;;;:::o;25626:75::-;25659:6;25692:2;25686:9;25676:19;;25626:75;:::o;25707:307::-;25768:4;25858:18;25850:6;25847:30;25844:56;;;25880:18;;:::i;:::-;25844:56;25918:29;25940:6;25918:29;:::i;:::-;25910:37;;26002:4;25996;25992:15;25984:23;;25707:307;;;:::o;26020:308::-;26082:4;26172:18;26164:6;26161:30;26158:56;;;26194:18;;:::i;:::-;26158:56;26232:29;26254:6;26232:29;:::i;:::-;26224:37;;26316:4;26310;26306:15;26298:23;;26020:308;;;:::o;26334:132::-;26401:4;26424:3;26416:11;;26454:4;26449:3;26445:14;26437:22;;26334:132;;;:::o;26472:141::-;26521:4;26544:3;26536:11;;26567:3;26564:1;26557:14;26601:4;26598:1;26588:18;26580:26;;26472:141;;;:::o;26619:114::-;26686:6;26720:5;26714:12;26704:22;;26619:114;;;:::o;26739:98::-;26790:6;26824:5;26818:12;26808:22;;26739:98;;;:::o;26843:99::-;26895:6;26929:5;26923:12;26913:22;;26843:99;;;:::o;26948:113::-;27018:4;27050;27045:3;27041:14;27033:22;;26948:113;;;:::o;27067:184::-;27166:11;27200:6;27195:3;27188:19;27240:4;27235:3;27231:14;27216:29;;27067:184;;;;:::o;27257:168::-;27340:11;27374:6;27369:3;27362:19;27414:4;27409:3;27405:14;27390:29;;27257:168;;;;:::o;27431:147::-;27532:11;27569:3;27554:18;;27431:147;;;;:::o;27584:169::-;27668:11;27702:6;27697:3;27690:19;27742:4;27737:3;27733:14;27718:29;;27584:169;;;;:::o;27759:148::-;27861:11;27898:3;27883:18;;27759:148;;;;:::o;27913:305::-;27953:3;27972:20;27990:1;27972:20;:::i;:::-;27967:25;;28006:20;28024:1;28006:20;:::i;:::-;28001:25;;28160:1;28092:66;28088:74;28085:1;28082:81;28079:107;;;28166:18;;:::i;:::-;28079:107;28210:1;28207;28203:9;28196:16;;27913:305;;;;:::o;28224:185::-;28264:1;28281:20;28299:1;28281:20;:::i;:::-;28276:25;;28315:20;28333:1;28315:20;:::i;:::-;28310:25;;28354:1;28344:35;;28359:18;;:::i;:::-;28344:35;28401:1;28398;28394:9;28389:14;;28224:185;;;;:::o;28415:348::-;28455:7;28478:20;28496:1;28478:20;:::i;:::-;28473:25;;28512:20;28530:1;28512:20;:::i;:::-;28507:25;;28700:1;28632:66;28628:74;28625:1;28622:81;28617:1;28610:9;28603:17;28599:105;28596:131;;;28707:18;;:::i;:::-;28596:131;28755:1;28752;28748:9;28737:20;;28415:348;;;;:::o;28769:191::-;28809:4;28829:20;28847:1;28829:20;:::i;:::-;28824:25;;28863:20;28881:1;28863:20;:::i;:::-;28858:25;;28902:1;28899;28896:8;28893:34;;;28907:18;;:::i;:::-;28893:34;28952:1;28949;28945:9;28937:17;;28769:191;;;;:::o;28966:96::-;29003:7;29032:24;29050:5;29032:24;:::i;:::-;29021:35;;28966:96;;;:::o;29068:90::-;29102:7;29145:5;29138:13;29131:21;29120:32;;29068:90;;;:::o;29164:77::-;29201:7;29230:5;29219:16;;29164:77;;;:::o;29247:149::-;29283:7;29323:66;29316:5;29312:78;29301:89;;29247:149;;;:::o;29402:126::-;29439:7;29479:42;29472:5;29468:54;29457:65;;29402:126;;;:::o;29534:77::-;29571:7;29600:5;29589:16;;29534:77;;;:::o;29617:154::-;29701:6;29696:3;29691;29678:30;29763:1;29754:6;29749:3;29745:16;29738:27;29617:154;;;:::o;29777:307::-;29845:1;29855:113;29869:6;29866:1;29863:13;29855:113;;;29954:1;29949:3;29945:11;29939:18;29935:1;29930:3;29926:11;29919:39;29891:2;29888:1;29884:10;29879:15;;29855:113;;;29986:6;29983:1;29980:13;29977:101;;;30066:1;30057:6;30052:3;30048:16;30041:27;29977:101;29826:258;29777:307;;;:::o;30090:320::-;30134:6;30171:1;30165:4;30161:12;30151:22;;30218:1;30212:4;30208:12;30239:18;30229:81;;30295:4;30287:6;30283:17;30273:27;;30229:81;30357:2;30349:6;30346:14;30326:18;30323:38;30320:84;;;30376:18;;:::i;:::-;30320:84;30141:269;30090:320;;;:::o;30416:281::-;30499:27;30521:4;30499:27;:::i;:::-;30491:6;30487:40;30629:6;30617:10;30614:22;30593:18;30581:10;30578:34;30575:62;30572:88;;;30640:18;;:::i;:::-;30572:88;30680:10;30676:2;30669:22;30459:238;30416:281;;:::o;30703:233::-;30742:3;30765:24;30783:5;30765:24;:::i;:::-;30756:33;;30811:66;30804:5;30801:77;30798:103;;;30881:18;;:::i;:::-;30798:103;30928:1;30921:5;30917:13;30910:20;;30703:233;;;:::o;30942:100::-;30981:7;31010:26;31030:5;31010:26;:::i;:::-;30999:37;;30942:100;;;:::o;31048:94::-;31087:7;31116:20;31130:5;31116:20;:::i;:::-;31105:31;;31048:94;;;:::o;31148:176::-;31180:1;31197:20;31215:1;31197:20;:::i;:::-;31192:25;;31231:20;31249:1;31231:20;:::i;:::-;31226:25;;31270:1;31260:35;;31275:18;;:::i;:::-;31260:35;31316:1;31313;31309:9;31304:14;;31148:176;;;;:::o;31330:180::-;31378:77;31375:1;31368:88;31475:4;31472:1;31465:15;31499:4;31496:1;31489:15;31516:180;31564:77;31561:1;31554:88;31661:4;31658:1;31651:15;31685:4;31682:1;31675:15;31702:180;31750:77;31747:1;31740:88;31847:4;31844:1;31837:15;31871:4;31868:1;31861:15;31888:180;31936:77;31933:1;31926:88;32033:4;32030:1;32023:15;32057:4;32054:1;32047:15;32074:180;32122:77;32119:1;32112:88;32219:4;32216:1;32209:15;32243:4;32240:1;32233:15;32260:117;32369:1;32366;32359:12;32383:117;32492:1;32489;32482:12;32506:117;32615:1;32612;32605:12;32629:117;32738:1;32735;32728:12;32752:117;32861:1;32858;32851:12;32875:117;32984:1;32981;32974:12;32998:102;33039:6;33090:2;33086:7;33081:2;33074:5;33070:14;33066:28;33056:38;;32998:102;;;:::o;33106:94::-;33139:8;33187:5;33183:2;33179:14;33158:35;;33106:94;;;:::o;33206:164::-;33346:16;33342:1;33334:6;33330:14;33323:40;33206:164;:::o;33376:225::-;33516:34;33512:1;33504:6;33500:14;33493:58;33585:8;33580:2;33572:6;33568:15;33561:33;33376:225;:::o;33607:170::-;33747:22;33743:1;33735:6;33731:14;33724:46;33607:170;:::o;33783:::-;33923:22;33919:1;33911:6;33907:14;33900:46;33783:170;:::o;33959:182::-;34099:34;34095:1;34087:6;34083:14;34076:58;33959:182;:::o;34147:234::-;34287:34;34283:1;34275:6;34271:14;34264:58;34356:17;34351:2;34343:6;34339:15;34332:42;34147:234;:::o;34387:114::-;;:::o;34507:170::-;34647:22;34643:1;34635:6;34631:14;34624:46;34507:170;:::o;34683:173::-;34823:25;34819:1;34811:6;34807:14;34800:49;34683:173;:::o;34862:172::-;35002:24;34998:1;34990:6;34986:14;34979:48;34862:172;:::o;35040:181::-;35180:33;35176:1;35168:6;35164:14;35157:57;35040:181;:::o;35227:169::-;35367:21;35363:1;35355:6;35351:14;35344:45;35227:169;:::o;35402:122::-;35475:24;35493:5;35475:24;:::i;:::-;35468:5;35465:35;35455:63;;35514:1;35511;35504:12;35455:63;35402:122;:::o;35530:116::-;35600:21;35615:5;35600:21;:::i;:::-;35593:5;35590:32;35580:60;;35636:1;35633;35626:12;35580:60;35530:116;:::o;35652:122::-;35725:24;35743:5;35725:24;:::i;:::-;35718:5;35715:35;35705:63;;35764:1;35761;35754:12;35705:63;35652:122;:::o;35780:120::-;35852:23;35869:5;35852:23;:::i;:::-;35845:5;35842:34;35832:62;;35890:1;35887;35880:12;35832:62;35780:120;:::o;35906:122::-;35979:24;35997:5;35979:24;:::i;:::-;35972:5;35969:35;35959:63;;36018:1;36015;36008:12;35959:63;35906:122;:::o

Swarm Source

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