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

import "dart:async";

static method throwSync() → asy::Future<void> {
  throw "";
}
static method allYield() → asy::Future<void> async /* emittedValueType= void */ {
  await 0 /* runtimeCheckType= asy::Future<core::int> */ ;
  await self::allYield2();
}
static method allYield2() → asy::Future<void> async /* emittedValueType= void */ {
  await 0 /* runtimeCheckType= asy::Future<core::int> */ ;
  await self::allYield3();
}
static method allYield3() → asy::Future<void> async /* emittedValueType= void */ {
  await 0 /* runtimeCheckType= asy::Future<core::int> */ ;
  self::throwSync();
}
static method customErrorZone() → asy::Future<void> async /* emittedValueType= void */ {
  final asy::Completer<void> completer = asy::Completer::•<void>();
  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async /* emittedValueType= Null */ {
    await self::allYield();
    completer.{asy::Completer::complete}(null){([FutureOr<void>?]) → void};
  }, (core::Object e, core::StackTrace s) → void {
    completer.{asy::Completer::completeError}(e, s){(core::Object, [core::StackTrace?]) → void};
  });
  return completer.{asy::Completer::future}{asy::Future<void>};
}
static method main() → dynamic {}
