library /*isNonNullableByDefault*/;
import self as self;
import "mixin_from_opt_in_out_in_lib1.dart" as mix;
import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
import "dart:core" as core;

import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib1.dart";
import "org-dartlang-testcase:///mixin_from_opt_in_out_in_lib2.dart";

class DiB0 extends mix::C0 implements mix2::B {
  synthetic constructor •() → self::DiB0
    : super mix::C0::•()
    ;
  abstract member-signature get a() → core::List<(core::int) → core::int>;
  abstract member-signature set a(core::List<(core::int) → core::int> _) → void;
  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int;
}
class DiBq0 extends mix::C0 implements mix2::Bq {
  synthetic constructor •() → self::DiBq0
    : super mix::C0::•()
    ;
  abstract member-signature get a() → core::List<(core::int?) → core::int?>;
  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void;
  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?;
}
abstract class _DwB0&C0&B = mix::C0 with mix2::B /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_DwB0&C0&B
    : super mix::C0::•()
    ;
}
class DwB0 extends self::_DwB0&C0&B {
  synthetic constructor •() → self::DwB0
    : super self::_DwB0&C0&B::•()
    ;
}
abstract class _DwBq0&C0&Bq = mix::C0 with mix2::Bq /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_DwBq0&C0&Bq
    : super mix::C0::•()
    ;
}
class DwBq0 extends self::_DwBq0&C0&Bq {
  synthetic constructor •() → self::DwBq0
    : super self::_DwBq0&C0&Bq::•()
    ;
}
class DiB3 extends mix::C3 implements mix2::B {
  synthetic constructor •() → self::DiB3
    : super mix::C3::•()
    ;
  abstract member-signature get a() → core::List<(core::int) → core::int>;
  abstract member-signature set a(core::List<(core::int) → core::int> _) → void;
  abstract member-signature method m((core::int) → core::int x) → (core::int) → core::int;
}
class DiBq3 extends mix::C3 implements mix2::Bq {
  synthetic constructor •() → self::DiBq3
    : super mix::C3::•()
    ;
  abstract member-signature get a() → core::List<(core::int?) → core::int?>;
  abstract member-signature set a(core::List<(core::int?) → core::int?> _) → void;
  abstract member-signature method m((core::int?) → core::int? x) → (core::int?) → core::int?;
}
abstract class _DwB3&C3&B = mix::C3 with mix2::B /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_DwB3&C3&B
    : super mix::C3::•()
    ;
}
class DwB3 extends self::_DwB3&C3&B {
  synthetic constructor •() → self::DwB3
    : super self::_DwB3&C3&B::•()
    ;
}
abstract class _DwBq3&C3&Bq = mix::C3 with mix2::Bq /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_DwBq3&C3&Bq
    : super mix::C3::•()
    ;
}
class DwBq3 extends self::_DwBq3&C3&Bq {
  synthetic constructor •() → self::DwBq3
    : super self::_DwBq3&C3&Bq::•()
    ;
}
static method main() → dynamic {}

library;
import self as mix;
import "mixin_from_opt_in_out_in_lib2.dart" as mix2;
import "dart:core" as core;

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

class C0 extends mix2::B {
  synthetic constructor •() → mix::C0*
    : super mix2::B::•()
    ;
  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*;
  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void;
  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*;
}
class C3 extends mix2::Bq {
  synthetic constructor •() → mix::C3*
    : super mix2::Bq::•()
    ;
  abstract member-signature get a() → core::List<(core::int*) →* core::int*>*;
  abstract member-signature set a(core::List<(core::int*) →* core::int*>* _) → void;
  abstract member-signature method m((core::int*) →* core::int* x) → (core::int*) →* core::int*;
}

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

class B extends core::Object {
  synthetic constructor •() → mix2::B
    : super core::Object::•()
    ;
  get a() → core::List<(core::int) → core::int>
    return <(core::int) → core::int>[];
  set a(core::List<(core::int) → core::int> _) → void {}
  method m((core::int) → core::int x) → (core::int) → core::int
    return x;
}
class Bq extends core::Object {
  synthetic constructor •() → mix2::Bq
    : super core::Object::•()
    ;
  get a() → core::List<(core::int?) → core::int?>
    return <(core::int?) → core::int?>[];
  set a(core::List<(core::int?) → core::int?> _) → void {}
  method m((core::int?) → core::int? x) → (core::int?) → core::int?
    return x;
}
