contract LowEffortSmileez is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Pausable, Ownable {
    using Counters for Counters.Counter;

    uint256 public basePrice = 0.069 ether;
    uint256 public supplyCap = 10000;
    uint8 public mintCap = 20;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("Low Effort Smileez", "SMLZ") { } 

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

	function withdraw() public payable onlyOwner {
		require(payable(msg.sender).send(address(this).balance));
	}

    function mint(address dest, uint8 qty, string[] memory cids) public payable {
        require(qty <= mintCap);
		require(qty > 0);
        require(totalSupply() + qty < supplyCap);

        if (msg.sender != owner()) {
            require(msg.value >= basePrice * qty);
        }

        for (uint8 i = 0; i<qty; i++) {
            uint256 newId = _tokenIdCounter.current();
            _safeMint(dest, newId);
            _setTokenURI(newId, string(abi.encodePacked('ipfs://', cids[i])));
            _tokenIdCounter.increment();
        }
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}
function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
    super._burn(tokenId);
}

// The following functions are overrides required by Solidity.