main = main::main;
library from "org-dartlang-test:///main.dart" as main {

  class C extends dart.core::Object {
    field dart.core::int? _#C#field5 = null;
    field dart.core::bool _#C#field5#isSet = false;
    field dart.core::int? _#C#field6 = null;
    field dart.core::bool _#C#field6#isSet = false;
    field dart.core::int? _#C#field7 = null;
    field dart.core::bool _#C#field7#isSet = false;
    field dart.core::int? _#C#field8 = null;
    field dart.core::bool _#C#field8#isSet = false;
    static field dart.core::int? _#field9 = null;
    static field dart.core::bool _#field9#isSet = false;
    static field dart.core::int? _#field10 = null;
    static field dart.core::bool _#field10#isSet = false;
    static field dart.core::int? _#field11 = null;
    static field dart.core::bool _#field11#isSet = false;
    static field dart.core::int? _#field12 = null;
    static field dart.core::bool _#field12#isSet = false;
    synthetic constructor •() → main::C
      : super dart.core::Object::•()
      ;
    get field5() → dart.core::int? {
      if(!this.{main::C::_#C#field5#isSet}{dart.core::bool}) {
        this.{main::C::_#C#field5} = 42;
        this.{main::C::_#C#field5#isSet} = true;
      }
      return this.{main::C::_#C#field5}{dart.core::int?};
    }
    set field5(dart.core::int? field5#param) → void {
      this.{main::C::_#C#field5#isSet} = true;
      this.{main::C::_#C#field5} = field5#param;
    }
    get field6() → dart.core::int?
      return this.{main::C::_#C#field6#isSet}{dart.core::bool} ?{dart.core::int?} this.{main::C::_#C#field6}{dart.core::int?} : throw new dart._internal::LateError::fieldNI("field6");
    set field6(dart.core::int? field6#param) → void {
      this.{main::C::_#C#field6#isSet} = true;
      this.{main::C::_#C#field6} = field6#param;
    }
    get field7() → dart.core::int? {
      if(!this.{main::C::_#C#field7#isSet}{dart.core::bool}) {
        final dart.core::int? #t1 = 42;
        if(this.{main::C::_#C#field7#isSet}{dart.core::bool})
          throw new dart._internal::LateError::fieldADI("field7");
        this.{main::C::_#C#field7} = #t1;
        this.{main::C::_#C#field7#isSet} = true;
      }
      return this.{main::C::_#C#field7}{dart.core::int?};
    }
    get field8() → dart.core::int?
      return this.{main::C::_#C#field8#isSet}{dart.core::bool} ?{dart.core::int?} this.{main::C::_#C#field8}{dart.core::int?} : throw new dart._internal::LateError::fieldNI("field8");
    set field8(dart.core::int? field8#param) → void
      if(this.{main::C::_#C#field8#isSet}{dart.core::bool})
        throw new dart._internal::LateError::fieldAI("field8");
      else {
        this.{main::C::_#C#field8#isSet} = true;
        this.{main::C::_#C#field8} = field8#param;
      }
    static get field9() → dart.core::int? {
      if(!main::C::_#field9#isSet) {
        main::C::_#field9 = 42;
        main::C::_#field9#isSet = true;
      }
      return main::C::_#field9;
    }
    static set field9(dart.core::int? field9#param) → void {
      main::C::_#field9#isSet = true;
      main::C::_#field9 = field9#param;
    }
    static get field10() → dart.core::int?
      return main::C::_#field10#isSet ?{dart.core::int?} main::C::_#field10 : throw new dart._internal::LateError::fieldNI("field10");
    static set field10(dart.core::int? field10#param) → void {
      main::C::_#field10#isSet = true;
      main::C::_#field10 = field10#param;
    }
    static get field11() → dart.core::int? {
      if(!main::C::_#field11#isSet) {
        final dart.core::int? #t2 = 42;
        if(main::C::_#field11#isSet)
          throw new dart._internal::LateError::fieldADI("field11");
        main::C::_#field11 = #t2;
        main::C::_#field11#isSet = true;
      }
      return main::C::_#field11;
    }
    static get field12() → dart.core::int?
      return main::C::_#field12#isSet ?{dart.core::int?} main::C::_#field12 : throw new dart._internal::LateError::fieldNI("field12");
    static set field12(dart.core::int? field12#param) → void
      if(main::C::_#field12#isSet)
        throw new dart._internal::LateError::fieldAI("field12");
      else {
        main::C::_#field12#isSet = true;
        main::C::_#field12 = field12#param;
      }
  }
  static field dart.core::int? _#field1 = null;
  static field dart.core::bool _#field1#isSet = false;
  static field dart.core::int? _#field2 = null;
  static field dart.core::bool _#field2#isSet = false;
  static field dart.core::int? _#field3 = null;
  static field dart.core::bool _#field3#isSet = false;
  static field dart.core::int? _#field4 = null;
  static field dart.core::bool _#field4#isSet = false;
  static get field1() → dart.core::int? {
    if(!main::_#field1#isSet) {
      main::_#field1 = 42;
      main::_#field1#isSet = true;
    }
    return main::_#field1;
  }
  static set field1(dart.core::int? field1#param) → void {
    main::_#field1#isSet = true;
    main::_#field1 = field1#param;
  }
  static get field2() → dart.core::int?
    return main::_#field2#isSet ?{dart.core::int?} main::_#field2 : throw new dart._internal::LateError::fieldNI("field2");
  static set field2(dart.core::int? field2#param) → void {
    main::_#field2#isSet = true;
    main::_#field2 = field2#param;
  }
  static get field3() → dart.core::int? {
    if(!main::_#field3#isSet) {
      final dart.core::int? #t3 = 42;
      if(main::_#field3#isSet)
        throw new dart._internal::LateError::fieldADI("field3");
      main::_#field3 = #t3;
      main::_#field3#isSet = true;
    }
    return main::_#field3;
  }
  static get field4() → dart.core::int?
    return main::_#field4#isSet ?{dart.core::int?} main::_#field4 : throw new dart._internal::LateError::fieldNI("field4");
  static set field4(dart.core::int? field4#param) → void
    if(main::_#field4#isSet)
      throw new dart._internal::LateError::fieldAI("field4");
    else {
      main::_#field4#isSet = true;
      main::_#field4 = field4#param;
    }
  static method main() → dynamic {
    main::field1 = 43;
    main::field2 = 42;
  }
}
