library;
import self as self;
import "dart:core" as core;

class Class extends core::Object {
  field dynamic field = null;
  synthetic constructor •() → self::Class*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class GenericClass<T extends core::Object* = dynamic> extends core::Object {
  generic-covariant-impl field self::GenericClass::T* field = null;
  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
extension Extension on self::Class* {
  method readGetter = self::Extension|readGetter;
  tearoff readGetter = self::Extension|get#readGetter;
  method writeSetterRequired = self::Extension|writeSetterRequired;
  tearoff writeSetterRequired = self::Extension|get#writeSetterRequired;
  method writeSetterOptional = self::Extension|writeSetterOptional;
  tearoff writeSetterOptional = self::Extension|get#writeSetterOptional;
  method writeSetterNamed = self::Extension|writeSetterNamed;
  tearoff writeSetterNamed = self::Extension|get#writeSetterNamed;
  get tearOffGetterNoArgs = self::Extension|get#tearOffGetterNoArgs;
  get tearOffGetterRequired = self::Extension|get#tearOffGetterRequired;
  get tearOffGetterOptional = self::Extension|get#tearOffGetterOptional;
  get tearOffGetterNamed = self::Extension|get#tearOffGetterNamed;
  get property = self::Extension|get#property;
  method invocations = self::Extension|invocations;
  tearoff invocations = self::Extension|get#invocations;
  method tearOffs = self::Extension|tearOffs;
  tearoff tearOffs = self::Extension|get#tearOffs;
  method getterCalls = self::Extension|getterCalls;
  tearoff getterCalls = self::Extension|get#getterCalls;
  set property = self::Extension|set#property;
}
extension GenericExtension<T extends core::Object* = dynamic> on self::GenericClass<T*>* {
  method readGetter = self::GenericExtension|readGetter;
  tearoff readGetter = self::GenericExtension|get#readGetter;
  method writeSetterRequired = self::GenericExtension|writeSetterRequired;
  tearoff writeSetterRequired = self::GenericExtension|get#writeSetterRequired;
  method writeSetterOptional = self::GenericExtension|writeSetterOptional;
  tearoff writeSetterOptional = self::GenericExtension|get#writeSetterOptional;
  method writeSetterNamed = self::GenericExtension|writeSetterNamed;
  tearoff writeSetterNamed = self::GenericExtension|get#writeSetterNamed;
  method genericWriteSetterRequired = self::GenericExtension|genericWriteSetterRequired;
  tearoff genericWriteSetterRequired = self::GenericExtension|get#genericWriteSetterRequired;
  method genericWriteSetterOptional = self::GenericExtension|genericWriteSetterOptional;
  tearoff genericWriteSetterOptional = self::GenericExtension|get#genericWriteSetterOptional;
  method genericWriteSetterNamed = self::GenericExtension|genericWriteSetterNamed;
  tearoff genericWriteSetterNamed = self::GenericExtension|get#genericWriteSetterNamed;
  get property = self::GenericExtension|get#property;
  get tearOffGetterNoArgs = self::GenericExtension|get#tearOffGetterNoArgs;
  get tearOffGetterRequired = self::GenericExtension|get#tearOffGetterRequired;
  get tearOffGetterOptional = self::GenericExtension|get#tearOffGetterOptional;
  get tearOffGetterNamed = self::GenericExtension|get#tearOffGetterNamed;
  get tearOffGetterGenericRequired = self::GenericExtension|get#tearOffGetterGenericRequired;
  get tearOffGetterGenericOptional = self::GenericExtension|get#tearOffGetterGenericOptional;
  get tearOffGetterGenericNamed = self::GenericExtension|get#tearOffGetterGenericNamed;
  method invocations = self::GenericExtension|invocations;
  tearoff invocations = self::GenericExtension|get#invocations;
  method tearOffs = self::GenericExtension|tearOffs;
  tearoff tearOffs = self::GenericExtension|get#tearOffs;
  method getterCalls = self::GenericExtension|getterCalls;
  tearoff getterCalls = self::GenericExtension|get#getterCalls;
  set property = self::GenericExtension|set#property;
}
static method Extension|get#readGetter(final self::Class* #this) → () →* dynamic
  return () → dynamic => self::Extension|readGetter(#this);
static method Extension|readGetter(final self::Class* #this) → dynamic {
  return self::Extension|get#property(#this);
}
static method Extension|writeSetterRequired(final self::Class* #this, dynamic value) → dynamic {
  self::Extension|set#property(#this, value);
}
static method Extension|get#writeSetterRequired(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|writeSetterRequired(#this, value);
static method Extension|writeSetterOptional(final self::Class* #this, [dynamic value = #C1]) → dynamic {
  self::Extension|set#property(#this, value);
}
static method Extension|get#writeSetterOptional(final self::Class* #this) → ([dynamic]) →* dynamic
  return ([dynamic value = #C1]) → dynamic => self::Extension|writeSetterOptional(#this, value);
static method Extension|writeSetterNamed(final self::Class* #this, {dynamic value = #C1}) → dynamic {
  self::Extension|set#property(#this, value);
}
static method Extension|get#writeSetterNamed(final self::Class* #this) → ({value: dynamic}) →* dynamic
  return ({dynamic value = #C1}) → dynamic => self::Extension|writeSetterNamed(#this, value: value);
static method Extension|get#tearOffGetterNoArgs(final self::Class* #this) → dynamic
  return self::Extension|get#readGetter(#this);
static method Extension|get#tearOffGetterRequired(final self::Class* #this) → dynamic
  return self::Extension|get#writeSetterRequired(#this);
static method Extension|get#tearOffGetterOptional(final self::Class* #this) → dynamic
  return self::Extension|get#writeSetterOptional(#this);
static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dynamic
  return self::Extension|get#writeSetterNamed(#this);
static method Extension|get#property(final self::Class* #this) → dynamic
  return #this.{self::Class::field};
static method Extension|set#property(final self::Class* #this, dynamic value) → void {
  #this.{self::Class::field} = value;
}
static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic {
  self::Extension|readGetter(#this);
  self::Extension|writeSetterRequired(#this, value);
  self::Extension|writeSetterOptional(#this);
  self::Extension|writeSetterOptional(#this, value);
  self::Extension|writeSetterNamed(#this);
  self::Extension|writeSetterNamed(#this, value: value);
}
static method Extension|get#invocations(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|invocations(#this, value);
static method Extension|get#tearOffs(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|tearOffs(#this, value);
static method Extension|tearOffs(final self::Class* #this, dynamic value) → dynamic {
  () →* dynamic tearOffNoArgs = self::Extension|get#readGetter(#this);
  tearOffNoArgs.call();
  (dynamic) →* dynamic tearOffRequired = self::Extension|get#writeSetterRequired(#this);
  tearOffRequired.call(value);
  ([dynamic]) →* dynamic tearOffOptional = self::Extension|get#writeSetterOptional(#this);
  tearOffOptional.call();
  tearOffOptional.call(value);
  ({value: dynamic}) →* dynamic tearOffNamed = self::Extension|get#writeSetterNamed(#this);
  tearOffNamed.call();
  tearOffNamed.call(value: value);
}
static method Extension|getterCalls(final self::Class* #this, dynamic value) → dynamic {
  self::Extension|get#tearOffGetterNoArgs(#this).call();
  self::Extension|get#tearOffGetterRequired(#this).call(value);
  self::Extension|get#tearOffGetterOptional(#this).call();
  self::Extension|get#tearOffGetterOptional(#this).call(value);
  self::Extension|get#tearOffGetterNamed(#this).call();
  self::Extension|get#tearOffGetterNamed(#this).call(value: value);
}
static method Extension|get#getterCalls(final self::Class* #this) → (dynamic) →* dynamic
  return (dynamic value) → dynamic => self::Extension|getterCalls(#this, value);
static method GenericExtension|readGetter<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|readGetter::T*>* #this) → self::GenericExtension|readGetter::T* {
  return self::GenericExtension|get#property<self::GenericExtension|readGetter::T*>(#this);
}
static method GenericExtension|get#readGetter<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#readGetter::T*>* #this) → () →* self::GenericExtension|get#readGetter::T*
  return () → self::GenericExtension|get#readGetter::T* => self::GenericExtension|readGetter<self::GenericExtension|get#readGetter::T*>(#this);
static method GenericExtension|writeSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterRequired::T*>* #this, self::GenericExtension|writeSetterRequired::T* value) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|writeSetterRequired::T*>(#this, value);
}
static method GenericExtension|get#writeSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterRequired::T*>* #this) → (self::GenericExtension|get#writeSetterRequired::T*) →* dynamic
  return (self::GenericExtension|get#writeSetterRequired::T* value) → dynamic => self::GenericExtension|writeSetterRequired<self::GenericExtension|get#writeSetterRequired::T*>(#this, value);
static method GenericExtension|writeSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterOptional::T*>* #this, [self::GenericExtension|writeSetterOptional::T* value = #C1]) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|writeSetterOptional::T*>(#this, value);
}
static method GenericExtension|get#writeSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterOptional::T*>* #this) → ([self::GenericExtension|get#writeSetterOptional::T*]) →* dynamic
  return ([self::GenericExtension|get#writeSetterOptional::T* value = #C1]) → dynamic => self::GenericExtension|writeSetterOptional<self::GenericExtension|get#writeSetterOptional::T*>(#this, value);
static method GenericExtension|writeSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|writeSetterNamed::T*>* #this, {self::GenericExtension|writeSetterNamed::T* value = #C1}) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|writeSetterNamed::T*>(#this, value);
}
static method GenericExtension|get#writeSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#writeSetterNamed::T*>* #this) → ({value: self::GenericExtension|get#writeSetterNamed::T*}) →* dynamic
  return ({self::GenericExtension|get#writeSetterNamed::T* value = #C1}) → dynamic => self::GenericExtension|writeSetterNamed<self::GenericExtension|get#writeSetterNamed::T*>(#this, value: value);
static method GenericExtension|genericWriteSetterRequired<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterRequired::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterRequired::T*>* #this, self::GenericExtension|genericWriteSetterRequired::S* value) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterRequired::T*>(#this, value);
}
static method GenericExtension|get#genericWriteSetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterRequired::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterRequired::T* = dynamic>(S* value) → dynamic => self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|get#genericWriteSetterRequired::T*, S*>(#this, value);
static method GenericExtension|genericWriteSetterOptional<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterOptional::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterOptional::T*>* #this, [self::GenericExtension|genericWriteSetterOptional::S* value = #C1]) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterOptional::T*>(#this, value);
}
static method GenericExtension|get#genericWriteSetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterOptional::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S*]) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterOptional::T* = dynamic>([S* value = #C1]) → dynamic => self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|get#genericWriteSetterOptional::T*, S*>(#this, value);
static method GenericExtension|get#genericWriteSetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#genericWriteSetterNamed::T*>* #this) → <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({value: S*}) →* dynamic
  return <S extends self::GenericExtension|get#genericWriteSetterNamed::T* = dynamic>({S* value = #C1}) → dynamic => self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|get#genericWriteSetterNamed::T*, S*>(#this, value: value);
static method GenericExtension|genericWriteSetterNamed<T extends core::Object* = dynamic, S extends self::GenericExtension|genericWriteSetterNamed::T* = dynamic>(final self::GenericClass<self::GenericExtension|genericWriteSetterNamed::T*>* #this, {self::GenericExtension|genericWriteSetterNamed::S* value = #C1}) → dynamic {
  self::GenericExtension|set#property<self::GenericExtension|genericWriteSetterNamed::T*>(#this, value);
}
static method GenericExtension|get#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
  return #this.{self::GenericClass::field};
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
  #this.{self::GenericClass::field} = value;
}
static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
  return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);
static method GenericExtension|get#tearOffGetterRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterRequired::T*>* #this) → dynamic
  return self::GenericExtension|get#writeSetterRequired<self::GenericExtension|get#tearOffGetterRequired::T*>(#this);
static method GenericExtension|get#tearOffGetterOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterOptional::T*>* #this) → dynamic
  return self::GenericExtension|get#writeSetterOptional<self::GenericExtension|get#tearOffGetterOptional::T*>(#this);
static method GenericExtension|get#tearOffGetterNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNamed::T*>* #this) → dynamic
  return self::GenericExtension|get#writeSetterNamed<self::GenericExtension|get#tearOffGetterNamed::T*>(#this);
static method GenericExtension|get#tearOffGetterGenericRequired<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericRequired::T*>* #this) → dynamic
  return self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|get#tearOffGetterGenericRequired::T*>(#this);
static method GenericExtension|get#tearOffGetterGenericOptional<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericOptional::T*>* #this) → dynamic
  return self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|get#tearOffGetterGenericOptional::T*>(#this);
static method GenericExtension|get#tearOffGetterGenericNamed<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterGenericNamed::T*>* #this) → dynamic
  return self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|get#tearOffGetterGenericNamed::T*>(#this);
static method GenericExtension|invocations<T extends core::Object* = dynamic, S extends self::GenericExtension|invocations::T* = dynamic>(final self::GenericClass<self::GenericExtension|invocations::T*>* #this, self::GenericExtension|invocations::S* value) → dynamic {
  self::GenericExtension|readGetter<self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|writeSetterRequired<self::GenericExtension|invocations::T*>(#this, value);
  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|writeSetterOptional<self::GenericExtension|invocations::T*>(#this, value);
  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|writeSetterNamed<self::GenericExtension|invocations::T*>(#this, value: value);
  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
  self::GenericExtension|genericWriteSetterRequired<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value);
  self::GenericExtension|genericWriteSetterOptional<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::T*>(#this, value: value);
  self::GenericExtension|genericWriteSetterNamed<self::GenericExtension|invocations::T*, self::GenericExtension|invocations::S*>(#this, value: value);
}
static method GenericExtension|get#invocations<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#invocations::T*>* #this) → <S extends self::GenericExtension|get#invocations::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#invocations::T* = dynamic>(S* value) → dynamic => self::GenericExtension|invocations<self::GenericExtension|get#invocations::T*, S*>(#this, value);
static method GenericExtension|tearOffs<T extends core::Object* = dynamic, S extends self::GenericExtension|tearOffs::T* = dynamic>(final self::GenericClass<self::GenericExtension|tearOffs::T*>* #this, self::GenericExtension|tearOffs::S* value) → dynamic {
  () →* self::GenericExtension|tearOffs::T* tearOffNoArgs = self::GenericExtension|get#readGetter<self::GenericExtension|tearOffs::T*>(#this);
  tearOffNoArgs.call();
  (self::GenericExtension|tearOffs::T*) →* dynamic tearOffRequired = self::GenericExtension|get#writeSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
  tearOffRequired.call(value);
  ([self::GenericExtension|tearOffs::T*]) →* dynamic tearOffOptional = self::GenericExtension|get#writeSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
  tearOffOptional.call();
  tearOffOptional.call(value);
  ({value: self::GenericExtension|tearOffs::T*}) →* dynamic tearOffNamed = self::GenericExtension|get#writeSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
  tearOffNamed.call();
  tearOffNamed.call(value: value);
  <S extends self::GenericExtension|tearOffs::T* = dynamic>(S*) →* dynamic genericTearOffRequired = self::GenericExtension|get#genericWriteSetterRequired<self::GenericExtension|tearOffs::T*>(#this);
  genericTearOffRequired.call<self::GenericExtension|tearOffs::S*>(value);
  genericTearOffRequired.call<self::GenericExtension|tearOffs::T*>(value);
  genericTearOffRequired.call<self::GenericExtension|tearOffs::S*>(value);
  <S extends self::GenericExtension|tearOffs::T* = dynamic>([S*]) →* dynamic genericTearOffOptional = self::GenericExtension|get#genericWriteSetterOptional<self::GenericExtension|tearOffs::T*>(#this);
  genericTearOffOptional.call<self::GenericExtension|tearOffs::T*>();
  genericTearOffOptional.call<self::GenericExtension|tearOffs::T*>();
  genericTearOffOptional.call<self::GenericExtension|tearOffs::S*>();
  genericTearOffOptional.call<self::GenericExtension|tearOffs::S*>(value);
  genericTearOffOptional.call<self::GenericExtension|tearOffs::T*>(value);
  genericTearOffOptional.call<self::GenericExtension|tearOffs::S*>(value);
  <S extends self::GenericExtension|tearOffs::T* = dynamic>({value: S*}) →* dynamic genericTearOffNamed = self::GenericExtension|get#genericWriteSetterNamed<self::GenericExtension|tearOffs::T*>(#this);
  genericTearOffNamed.call<self::GenericExtension|tearOffs::T*>();
  genericTearOffNamed.call<self::GenericExtension|tearOffs::T*>();
  genericTearOffNamed.call<self::GenericExtension|tearOffs::S*>();
  genericTearOffNamed.call<self::GenericExtension|tearOffs::S*>(value: value);
  genericTearOffNamed.call<self::GenericExtension|tearOffs::T*>(value: value);
  genericTearOffNamed.call<self::GenericExtension|tearOffs::S*>(value: value);
}
static method GenericExtension|get#tearOffs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffs::T*>* #this) → <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#tearOffs::T* = dynamic>(S* value) → dynamic => self::GenericExtension|tearOffs<self::GenericExtension|get#tearOffs::T*, S*>(#this, value);
static method GenericExtension|getterCalls<T extends core::Object* = dynamic, S extends self::GenericExtension|getterCalls::T* = dynamic>(final self::GenericClass<self::GenericExtension|getterCalls::T*>* #this, self::GenericExtension|getterCalls::S* value) → dynamic {
  self::GenericExtension|get#tearOffGetterNoArgs<self::GenericExtension|getterCalls::T*>(#this).call();
  self::GenericExtension|get#tearOffGetterRequired<self::GenericExtension|getterCalls::T*>(#this).call(value);
  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this).call();
  self::GenericExtension|get#tearOffGetterOptional<self::GenericExtension|getterCalls::T*>(#this).call(value);
  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this).call();
  self::GenericExtension|get#tearOffGetterNamed<self::GenericExtension|getterCalls::T*>(#this).call(value: value);
  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this).call(value);
  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::T*>(value);
  self::GenericExtension|get#tearOffGetterGenericRequired<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::S*>(value);
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call();
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::T*>();
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::S*>();
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call(value);
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::T*>(value);
  self::GenericExtension|get#tearOffGetterGenericOptional<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::S*>(value);
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call();
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::T*>();
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::S*>();
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call(value: value);
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::T*>(value: value);
  self::GenericExtension|get#tearOffGetterGenericNamed<self::GenericExtension|getterCalls::T*>(#this).call<self::GenericExtension|getterCalls::S*>(value: value);
}
static method GenericExtension|get#getterCalls<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#getterCalls::T*>* #this) → <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S*) →* dynamic
  return <S extends self::GenericExtension|get#getterCalls::T* = dynamic>(S* value) → dynamic => self::GenericExtension|getterCalls<self::GenericExtension|get#getterCalls::T*, S*>(#this, value);
static method main() → dynamic {}

constants  {
  #C1 = null
}
