abstract contract ERC721QDPlus is ERC721QD {
    address constant zero = address(0);

    //track mint count for sequencial projects
    uint256 private _tottalSupply = 0; 

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply()
        public
        view
        virtual
        returns (uint256)
    {
        return _tottalSupply;
    }

    function addTotalSupply (uint256 i)
        internal
    {
        _tottalSupply += i;
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * The _tottalSupply is subtracted when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) 
        internal 
        virtual  
        override
    {
        address owner = ERC721QD.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);

        delete _owners[tokenId];

        _tottalSupply--;

        emit Transfer(owner, address(0), tokenId);
    }

}
/**
 * @dev This is a no storage implemntation of the optional extension {ERC721}
 * defined in the EIP that adds enumerability of all the token ids in the
 * contract as well as all token ids owned by each account. These functions
 * are mainly for convienence and should NEVER be called from inside a
 * contract on the chain. This implementation can't be used for projects 
 * with more than 5000 NFTs.
 */
function totalSupply()
    public
    view
    virtual
    returns (uint256)
{
    return _tottalSupply;
}

/**
 * @dev See {IERC721Enumerable-totalSupply}.
 */