library;
import self as self;

import "org-dartlang-testcase:///opt_in_lib.dart";

static method main() → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;

class Class1<T extends core::Object? = core::Object?> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class1::redirect, self2::Class1::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class1<self2::Class1::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::redirect::T%>
    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class1::_ in let self2::Class1::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object? = core::Object?>() → self2::Class1<self2::Class1::fact::T%>
    ;
}
class Class2<T extends core::Object = core::Object> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class2::redirect, self2::Class2::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class2<self2::Class2::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::redirect::T>
    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::constRedirect::T>
    let dynamic #redirecting_factory = self2::Class2::_ in let self2::Class2::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object = core::Object>() → self2::Class2<self2::Class2::fact::T>
    ;
}
class Class3<T extends core::String = core::String> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class3::redirect, self2::Class3::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class3<self2::Class3::T>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::String = core::String>() → self2::Class3<self2::Class3::redirect::T>
    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::redirect::T #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::String = core::String>() → self2::Class3<self2::Class3::constRedirect::T>
    let dynamic #redirecting_factory = self2::Class3::_ in let self2::Class3::constRedirect::T #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::String = core::String>() → self2::Class3<self2::Class3::fact::T>
    ;
}
class Class4<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class4::redirect, self2::Class4::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class4<self2::Class4::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::redirect::T%>
    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class4::_ in let self2::Class4::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends core::Object? = dynamic>() → self2::Class4<self2::Class4::fact::T%>
    ;
}
class Class5<T extends dynamic = dynamic> extends core::Object /*hasConstConstructor*/  {
  static final field dynamic _redirecting# = <dynamic>[self2::Class5::redirect, self2::Class5::constRedirect]/*isLegacy*/;
  const constructor _() → self2::Class5<self2::Class5::T%>
    : super core::Object::•()
    ;
  static factory redirect<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::redirect::T%>
    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::redirect::T% #typeArg0 = null in invalid-expression;
  static factory constRedirect<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::constRedirect::T%>
    let dynamic #redirecting_factory = self2::Class5::_ in let self2::Class5::constRedirect::T% #typeArg0 = null in invalid-expression;
  static factory fact<T extends dynamic = dynamic>() → self2::Class5<self2::Class5::fact::T%>
    ;
}
static method testOptIn() → dynamic
  ;
