library /*isNonNullableByDefault*/;
import self as self;
import "main_lib.dart" as mai;
import "dart:core" as core;

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

abstract class RenderAnimatedOpacityMixin<T extends mai::RenderObject> extends mai::RenderObjectWithChildMixin<self::RenderAnimatedOpacityMixin::T> /*isMixinDeclaration*/  {
}
abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin = mai::RenderProxyBox with mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin
    : super mai::RenderProxyBox::•()
    ;
  mixin-super-stub method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position}) → core::bool
    return super.{mai::RenderProxyBoxMixin::hitTestChildren}(result, position: position);
}
abstract class _RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin = self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin with self::RenderAnimatedOpacityMixin<mai::RenderBox> /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin
    : super self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin::•()
    ;
}
class RenderAnimatedOpacity extends self::_RenderAnimatedOpacity&RenderProxyBox&RenderProxyBoxMixin&RenderAnimatedOpacityMixin {
  synthetic constructor •() → self::RenderAnimatedOpacity
    ;
}
static method main() → dynamic
  ;

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

class Offset extends core::Object {
  synthetic constructor •() → mai::Offset
    ;
}
class AbstractNode extends core::Object {
  synthetic constructor •() → mai::AbstractNode
    ;
}
abstract class DiagnosticableTreeMixin extends core::Object /*isMixinDeclaration*/  {
}
abstract class HitTestTarget extends core::Object {
  synthetic constructor •() → mai::HitTestTarget
    ;
}
class HitTestResult extends core::Object {
  synthetic constructor •() → mai::HitTestResult
    ;
}
class BoxHitTestResult extends mai::HitTestResult {
  synthetic constructor •() → mai::BoxHitTestResult
    ;
}
abstract class _RenderObject&AbstractNode&DiagnosticableTreeMixin extends mai::AbstractNode implements mai::DiagnosticableTreeMixin /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → mai::_RenderObject&AbstractNode&DiagnosticableTreeMixin
    : super mai::AbstractNode::•()
    ;
}
abstract class RenderObject extends mai::_RenderObject&AbstractNode&DiagnosticableTreeMixin implements mai::HitTestTarget {
  synthetic constructor •() → mai::RenderObject
    ;
}
abstract class RenderBox extends mai::RenderObject {
  synthetic constructor •() → mai::RenderBox
    ;
  method hitTest(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    ;
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    ;
}
abstract class RenderObjectWithChildMixin<ChildType extends mai::RenderObject> extends mai::RenderObject /*isMixinDeclaration*/  {
  covariant-by-class field mai::RenderObjectWithChildMixin::ChildType? _child;
  get child() → mai::RenderObjectWithChildMixin::ChildType?
    ;
}
abstract class _RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<T extends mai::RenderBox> extends core::Object implements mai::RenderBox, mai::RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T> /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin::T>
    ;
}
abstract class RenderProxyBoxMixin<T extends mai::RenderBox> extends mai::_RenderProxyBoxMixin&RenderBox&RenderObjectWithChildMixin<mai::RenderProxyBoxMixin::T> /*isMixinDeclaration*/  {
  @#C2
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    ;
}
abstract class _RenderProxyBox&RenderBox&RenderObjectWithChildMixin extends mai::RenderBox implements mai::RenderObjectWithChildMixin<mai::RenderBox> /*isAnonymousMixin,isEliminatedMixin*/  {
  covariant-by-class field mai::RenderBox? _child;
  synthetic constructor •() → mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin
    : super mai::RenderBox::•()
    ;
  get child() → mai::RenderBox?
    ;
}
abstract class _RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin extends mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin implements mai::RenderProxyBoxMixin<mai::RenderBox> /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin
    : super mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin::•()
    ;
  @#C2
  method hitTestChildren(mai::BoxHitTestResult result, {required mai::Offset position = #C1}) → core::bool
    ;
}
class RenderProxyBox extends mai::_RenderProxyBox&RenderBox&RenderObjectWithChildMixin&RenderProxyBoxMixin {
  synthetic constructor •() → mai::RenderProxyBox
    ;
}

constants  {
  #C1 = null
  #C2 = core::_Override {}
}
