bool ON_Brep::IsValidForV2( const ON_BrepEdge& edge ) const
{
    int ei = edge.m_edge_index;
    if ( ei < 0 || ei >= m_E.Count() )
        return false;
    if ( &edge != &m_E[ei] )
        return false;
    if ( edge.ProxyCurveIsReversed() )
        return false;
    if ( edge.Domain() != edge.ProxyCurveDomain() )
        return false;
    const ON_Curve * curve = edge.EdgeCurveOf();
    if ( curve != edge.ProxyCurve() )
        return false;
    const ON_NurbsCurve* nurbs_curve = ON_NurbsCurve::Cast(curve);
    if ( 0 == nurbs_curve )
        return false;
    if ( !nurbs_curve->IsClamped(2) )
        return false;
    if ( nurbs_curve->m_dim != 3 )
        return false;
    if ( nurbs_curve->m_is_rat )
    {
        // 2 June 2003 Dale Lear - RR 8809 fix
        //    V2 likes end weights to be 1.0
        if ( nurbs_curve->m_cv[3] != 1.0 || nurbs_curve->CV(nurbs_curve->m_cv_count-1)[3] != 1.0 )
        {
            return false;
        }
    }

    if ( curve->Domain() != edge.Domain() )
        return false;

    // 14 April 2003 Dale Lear
    //     RR 8808 - V2 requires edges to be strictly closed/open
    if (    nurbs_curve->m_cv_count >= 4
            && 0 == ON_ComparePoint( nurbs_curve->m_dim, nurbs_curve->m_is_rat, nurbs_curve->m_cv, nurbs_curve->CV(nurbs_curve->m_cv_count-1) )
       )
    {
        if ( edge.m_vi[0] != edge.m_vi[1] )
            return false;
    }
    else if (edge.m_vi[0] == edge.m_vi[1] )
    {
        return false;
    }

    return true;
}