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

  import "dart:core";
  import "package:package1/lib1_a.dart";

  static method main() → dynamic {
    lib::lib1();
  }
}
library from "package:package1/lib1_a.dart" as lib2 {
additionalExports = (lib::la,
  lib::lib1)

  import "package:package3/lib3.dart" as lib3;
  export "package:package1/lib1_b.dart";

  static method lib1a() → dynamic {
    lib3::lib3();
  }
}
library from "package:package1/lib1_b.dart" as lib {

  import "package:package2/lib2.dart" as lib2;

  static method lib1() → dynamic {
    return lib::la(null);
  }
  static method la(lib22::Foo* f) → dynamic {
    return 42;
  }
}
library from "package:package2/lib2.dart" as lib22 {

  class Foo extends dart.core::Object {
    static field dart.core::int* y = 42;
    synthetic constructor •() → lib22::Foo*
      : super dart.core::Object::•()
      ;
    abstract member-signature get _identityHashCode() → dart.core::int*;
    abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfTrue(dynamic type) → dart.core::bool*;
    abstract member-signature method _simpleInstanceOfFalse(dynamic type) → dart.core::bool*;
    abstract member-signature operator ==(dynamic other) → dart.core::bool*;
    abstract member-signature get hashCode() → dart.core::int*;
    abstract member-signature method toString() → dart.core::String*;
    abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic;
    abstract member-signature get runtimeType() → dart.core::Type*;
  }
  static field dart.core::int* f = 42;
}
library from "package:package3/lib3.dart" as lib3 {

  static method lib3() → dynamic {
    dart.core::print("lib3");
  }
}
