abstract contract ERC721OptBurnable is ERC721Opt {

    /**
     * @dev Burns `tokenId`. See {ERC721Opt-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved();
        _burn(tokenId);
    }
}
/**
 * @title ERC721Opt Burnable Token
 * @dev ERC721Opt Token that can be irreversibly burned (destroyed).
 */
function burn(uint256 tokenId) public virtual {
    if (!_isApprovedOrOwner(_msgSender(), tokenId)) revert BurnCallerNotOwnerNorApproved();
    _burn(tokenId);
}

/**
 * @dev Burns `tokenId`. See {ERC721Opt-_burn}.
 *
 * Requirements:
 *
 * - The caller must own `tokenId` or be an approved operator.
 */